tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信心。
tcpcopy 的优势在于其实时性及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。
简单解释一下工作原理:
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 上添加静态路由,确保被测试应用程序的响应包路由到辅助测试服务器,而不是回包给 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
辅助服务器要确保没有开启路由模式 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,表示所有网卡
角色 | ip | 端口 |
---|---|---|
Assistant Server | 192.168.0.247 | |
Online Server | 192.168.0.245 | 80 |
Test Server | 192.168.0.246 | 80 |
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
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 上的操作:
添加静态路由:
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 的页面
登录到 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"
登录到 Test Server ,查看访问日志
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 转发正常
本文参考链接: