基于TCPCopy的仿真压测方案
基于TCPCopy的仿真压测方案
一、tcpcopy工具介绍
tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信心。
tcpcopy 的优势在于其实时性及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。
二、tcpcopy原理
TCPCopy 分为三个角色:
- Online Server(OS):上面要部署 TCPCopy,从数据链路层(pcap 接口)抓请求数据包,发包是从IP层发出去;
- Test Server(TS):最新的架构调整把 intercept 的工作从 TS 中 offload 出来。TS 设置路由信息,把 被测应用 的需要被捕获的响应数据包信息路由到 AS;
- Assistant Server(AS):这是一台独立的辅助服务器,原则上一定要用同网段的一台闲置服务器来充当辅助服务器。AS 在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的 OS 上的 tcpcopy 进程。
数据传输流程图
- TCPcopy 从数据链路层 copy 端口请求,然后更改目的 ip 和目的端口。
- 将修改过的数据包传送给数据链路层,并且保持 tcp 连接请求。
- 通过数据链路层从 online server 发送到 test server。
- 在数据链路层解封装后到达 nginx 响应的服务端口。
- 等用户请求的数据返回结果后,回包走数据链路层。
- 通过数据链路层将返回的结果从 test server 发送到 assistant server。注:test server 只有一条默认路由指向 assistant server。
- 数据到达 assistant server 后被 intercept 进程截获。
- 过滤相关信息将请求状态发送给 online server 的 tcpcopy,关闭 tcp 连接。
三、操作步骤
Online Server 上的发包:
OS 默认使用 raw socket output 接口发包,此时发包命令如下:
tcpcopy -x 应用端口-Test Server:Test Server应用端口 -s Assistant Server
例如:
tcpcopy -x 80-192.168.0.246:80 -s 192.168.0.247 -d
此外,新架构还支持通过 pcap_inject(编译时候增加--enable-dlinject)来发包。
Test Server 上的响应包路由:
需要在 Test Server 上添加静态路由,确保被测试应用程序的响应包路由到辅助测试服务器,而不是回包给 Online Server。
route add -net 服务器所在网段 gw Assistant Server
例如:
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.247
Assistant Server 上的捕获响应包:
辅助服务器要确保没有开启路由模式 cat /proc/sys/net/ipv4/ip_forward,为0表示没有开启。
辅助服务器上的 intercept 进程通过 pcap 抓取测试机应用程序的响应包,将头部抽取后发送给 Online Server 上的 tcpcopy 进程,从而完成一次请求的复制。
intercept -i 网卡名 -F 'tcp and src port 应用端口' -d
例如:
intercept -i ens160 -F 'tcp and src port 80' -d
-i 参数,还可以为any,表示所有网卡
四、tcpcopy搭建
环境说明
角色 | ip | 端口 |
Assistant Server | 192.168.0.247 | |
Online Server | 192.168.0.245 | 80 |
Test Server | 192.168.0.246 | 80 |
拓扑图
运行流程
- tcpcopy运行在线上服务器上,tcpcopy会把线上服务器收到的流量,重放给测试服务器,重放的时候tcpcopy修改了IP数据包的源IP地址(譬如修改源地址为192.168.2.254)。所以,线上服务器和测试服务器应该部署相同的服务。
- tcpcopy把源IP伪造成192.168.2.254的包发给了测试服务器,如此,测试服务器在处理完tcpcopy发过来的数据以后,会把这些数据包返回给客户端,即伪造的192.168.2.254。
- 由于没有192.168.2.254这个地址,我们在测试服务器添加一条专门的路由,把发往192.168.2.0/24的数据包,都全部转交给辅助服务器。
- 为了保证辅助服务器会接受这些本不属于自己的,部署在辅助服务器上的intercept就发挥作用了。辅助服务器还可以用来把客户端的请求返回给tcpcopy,但是默认只返回响应头部给tcpcopy。辅助服务器应该类似于黑洞。
intercept安装
Assistant Server 上的操作:
下载并安装 intercept 服务端;
# 安装编译环境 apt-get install -y build-essential# 安装pcap依赖包 apt-get install -y libpcap-dev# 下载软件包 # github地址: http://github.com/session-replay-tools/intercept wget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz -o intercept-1.0.0.tar.gz tar zxvf intercept-1.0.0.tar.gz -C /usr/src cd /usr/src/intercept-1.0.0 ./configure --prefix=/usr/local/intercept-1.0.0 make && make install# 创建软连接 ln -s /usr/local/intercept-1.0.0/sbin/intercept /usr/bin/intercept# 启动程序 intercept -i ens160 -F 'tcp and src port 80' -d
注意:必须先安装 intercept,否则会导致 tcpcopy 启动时,找不到 intercept
tcpcopy安装
Online Server 上的操作:
下载并安装 tcpcopy 客户端
# 安装编译环境 apt-get install -y build-essential# 下载软件包 # github地址: http://github.com/session-replay-tools/tcpcopy wget https://github.com/session-replay-tools/tcpcopy/archive/v1.1.0.tar.gz -o tcpcopy-1.1.0.tar.gz tar zxvf tcpcopy-1.1.0.tar.gz -C /usr/src cd /usr/src/tcpcopy-1.1.0 ./configure --sbin-path=/usr/local/sbin make && make install# 创建软连接 ln -s /usr/local/tcpcopy-1.1.0/sbin/tcpcopy /usr/bin/tcpcopy# 启动程序 tcpcopy -x 80-192.168.0.246:80 -s 192.168.0.247 -d
注意:192.168.0.246 是 Test Server IP地址,192.168.0.247 是 Assistant Server IP地址
Test Server 添加路由
Test Server 上的操作:
添加静态路由:
route add -net 192.168.0.0/24 gw 192.168.0.247
注意:192.168.2.0/24 是不存在的网络,是一条专门的路由,用于将数据包转发到Assistant Server 。
192.168.0.247 是 Assistant Server IP地址
测试效果
Online Server 和 Test Server 已经安装了nginx,如果没有,请使用以下命令安装:
apt-get install -y nginx
在客户端浏览器,打开 Online Server 的页面
http://192.168.0.245/
登录到 Online Server ,查看访问日志
tail -f /var/log/nginx/access.log# 日志输出: 192.168.0.136 - - [27/Apr/2019:12:35:56 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
tail -f /var/log/nginx/access.log# 日志输出: 192.168.2.254 - - [27/Apr/2019:12:35:56 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
虽然访问的是 Online Server ,但是 Test Server 能收到客户端的访问请求。说明 intercept 转发正常
本文参考链接:
https://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html
https://juejin.im/entry/5ac1922d6fb9a028bc2de3fb
基于TCPCopy的仿真压测方案相关推荐
- (转)真刀真枪压测:基于TCPCopy的仿真压测方案
本文档适用人员:技术人员 提纲: 为什么要做仿真测试 TCPCopy是如何工作的 实作:仿真测试的拓扑 实作:操作步骤 可能会遇到的问题 ip_conntrack 少量丢包 离线重放 不提取7层信息 ...
- 案例 | 荔枝微课基于 kubernetes 搭建分布式压测系统
王诚强,荔枝微课基础架构负责人.热衷于基础技术研发推广,致力于提供稳定高效的基础架构,推进了荔枝微课集群化从0到1的发展,云原生架构持续演进的实践者. 本文根据2021年4月10日深圳站举办的[腾讯云 ...
- 春节保卫战:腾讯百万 QPS 线上环境云压测方案解析
导语|春节期间腾讯大部分业务进入流量备战的紧张时刻.压测相比于监控而言,是更具主动性的筹备手段.通过高负载.真实流量的预演,探测系统的瓶颈和发现风险,是服务质量保障体系的重要一环.云压测主要聚焦在压测 ...
- 大厂钟爱的全链路压测有什么意义?四种压测方案详细对比分析
全链路压测? 基于实际的生产业务场景和系统环境,模拟海量的用户请求和数据,对整个业务链路进行各种场景的测试验证,持续发现并进行瓶颈调优,保障系统稳定性的一个技术工程. 针对业务场景越发复杂化.海量数据 ...
- Elasticsearch - 压测方案之 esrally 简介
文章目录 为什么要压测? 如何进行压测? 入门 简介 快速入门 相关术语 track car race Tournament Pipeline 压测流程 压测结果分析 实战 问题一 问题二 问题三 进 ...
- Elasticsearch 压测方案之 es rally 简介
rally文档:http://esrally.readthedocs.io/en/latest/quickstart.html 由于 Elasticsearch(后文简称es) 的简单易用及其在大数据 ...
- 云效平台性能测试功能:一个基于Jmeter的性能压测平台
云效平台性能测试功能(Galaxy)是一个基于Jmeter的性能压测平台,它集脚本.场景.压测.监控和报表展示为一体,是一个能快速.低成本实施压测的平台.降低了入门使用成本,让开发和测试都可以方便的执 ...
- ****项目压测方案
项目优惠券压测方案 压测目的: 验证A系统大批量发券同步到系统中是否正常,****接收处理是否正常. 基础目标:每小时可以正常同步10W张券 1.1.测试工具 jMeter 1.2.压测环境 服务器配 ...
- 基于POLARDB数据库的压测实践
POLARDB架构简介 PolarDB是阿里云ApsaraDB数据库团队研发的基于云计算架构的下一代关系型数据库(暂时仅支持MySQL,PostgreSQL正在紧锣密鼓的开发中),其最大的特色是计算节 ...
最新文章
- udacity模型优缺点
- oracle 哦【的【,清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
- win2012R2打Windows8.1-KB2919355 问题
- python列表切片口诀-python学习之“切片操作从入门到精通”
- centos7安装mongodb3.6
- 文献学习(part41)--Locality constraint distance metric learning for traffic congestion detection
- python操作文件和目录_python文件和目录操作方法
- VS2005中解决方案管理器中看不到解决方案节点的解决办法
- java程序 启动慢_spring boot 程序启动缓慢的问题
- Flutter中为图片设置波纹点击效果
- 列表视图案例1——阅读古诗
- 值得收藏的品牌案例—到集设,灵感即到
- linux磁盘健康监控,MegaCli监控RAID磁盘健康信息
- Asp.Net母版页元素ID不一致的体现
- android_get_control_socket 获取 UNIX 域套接字 FD
- linux卸载xmind,Ubuntu下安装Xmind
- “野火FreeRTOS教程”第9章知识点总结-空闲任务与阻塞延时
- 微弱信号检测技术在机械早期故障探查中的应用研究
- 写好商业计划书,融资就成功了一半!
- linux 端口耗尽,短连接以致端口耗尽
热门文章
- qbo_arduqob command 命令Id约定
- 在LaTeX中使用Python的简单介绍
- 柔性作业车间调度问题 (FJSSP)
- CSS-动效 纯css粒子动效 | 转圈圈 | 上下弹动
- Spark学习(1)-Spark基础
- conda常用命令(换源清华源,创建虚拟环境)
- 2014年实习生招聘之武汉光庭信息技术有限公司实习生招聘部分笔试题(Java)—2014/04/14
- 交友盲盒源码h5开发浅谈
- MATLAB画三维动态魔方/旋转魔方/旋转立方体
- 如何使用 Javascript 截断/切片/修剪字符串中的最后一个字符?