使用tcpcopy导线上流量

假设我们要上线一个服务程序,在上线前,免不了单元测试,功能测试,还有使用ab,webbench等等进行压力测试。

但这些步骤非生产环境下正式用户的行为。或许你会想到灰度上线,但毕竟可能会影响到部分用户,那该怎么样压测才能不影响线上环境呢?

网易的 王斌 开发了tcpcopy, 可以导入线上流量进行功能和压力测试。

一. tcpcopy介绍

tcpcopy是一种请求复制工具。可以将线上流量拷贝到测试机器,实时的模拟线上环境。在不影响线上用户的情况下,使用线上流量进行测试,以尽早发现bug。也可以通过放大流量,进行压力测试,评估系统承载能力。

tcpcopy可以从线上服务器的IP层抓取在线请求的数据包,修改相关属性,利用raw socket output技术(packet injection 技术之一)将其发送给测试服务器进行测试。

发送到测试服务器的数据包会在TCP/IP协议栈被识别,其中带有payload(tcp data)的数据包最终进入到测试服务器的上层应用(如nginx),上层应用在处理完请求之后,将响应传递给测试服务器的TCP/IP协议栈。

在测试服务器上启用ip_queue模块,并使用iptables在IP层将响应结果数据包发往QUEUE(ip_queue)。

测试服务器上运行在用户空间的拦截程序(intercept进程),通过打开netlink的socket接受内核通过ip_queue所传递来的网络数据包(即上层应用的响应内容)进行裁定,将结果返回内核,进行出队列的操作。intercept进程默认会丢弃上层应用的响应内容,返回ip header,以释放tcp连接。

tcpcopy工作流程(以访问nginx为例,访问其他服务程序同理)
① 一个访问到达线上前端机;
② socket数据包在ip层被拷贝了一份传给tcpcopy进程;
③ tcpcopy修改包的目的及源地址,发给目标测试机;
④ 拷贝的包到达目标测试机;
⑤ 目标测试机的nginx处理访问,并返回结果;
⑥ 返回结果在ip层被截获、丢弃,由intercpet进程拷贝返回结果的ip header并返回;
⑦ ip header被发送给线上前端机的tcpcopy进程。
在这里插入图片描述

二.下载、安装

tcpcopy安装

从 https://github.com/wangbin579/tcpcopy 下载最新代码
• tar -zxvf tcpcopy-x.x.x.tar.gz
• cd tcpcopy-x.x.x
• sh autogen.sh
安装
• ./configure
• make
• sudo make install
我的网盘上有已编译好的二进制文件(包含tcpcopy和intercept两个可执行文件):
https://pan.baidu.com/s/119GfLoSzMSj8DMoCwjAZig
centos7系统的tcpcopy:
链接: https://pan.baidu.com/s/1pgi-hwdvoShm31pWq7cO3w 提取码: tkqh

intercept安装

intercept是tcpcopy的服务端程序。
下载代码:https://github.com/session-replay-tools/intercept/releases
• ./configure
• make
• sudo make install
第一步报错:
checking for pcap.h … not found
说明没有安装pcap库,安装下:
yum install libpcap-devel

三.运行

1 运行环境
• 测试机器A IP:192.168.144.150,测试端口为:8080
• 线上服务器B IP: 192.168.144.180,线上服务端口为:80
• 机器A和机器B全部安装tcpcopy

2 运行
• 在测试机器A上以root权限运行如下命令

modprobe ip_queue # if not running
iptables -I OUTPUT -p tcp --sport 8080 -j QUEUE # if not set,此处原理是把出去包来源port为8080的放到QUEUE中

./intercept -i eth0 -F ‘tcp and src port 8080’

• 在线上机器B以root运行

/usr/local/bin/tcpcopy -x 80-192.168.144.150:8080 –r 20

-x 指明 source port,dest host : dest port,
-r 指明需要复制的流量百分比,这里设置为20%。

如果提示tcpcopy needs -s paramter(intercept addresses),就需要加上-s 192.168.144.150:8080

这样就可以把线上流量copy到测试机上了。

3.如何结束?
当开启tcpcopy时,会发现监听的端口在网页无法访问,即便是结束intercept进程后还是这样,这时需要root执行 service iptables stop。

centos7上tcpcopy使用:

无法使用ip_queue,需要用NFQUEUE
测试机:

modprobe xt_NFQUEUE 
iptables -I OUTPUT -p tcp --sport 7105 -j NFQUEUE
intercept

测试结束后:

iptables -F OUTPUT

线上机器:
tcpcopy -x 7105-10.130.134.24:7105 -r 20

测试机dump出pcap文件,要用离线版本的tcpcopy,离线版本只能加载pcap文件,两个版本无法通信。
tcpdump -i any tcp and port 7105 -s 0 -w online.pcap
tcpcopy -i ./online.pcap -x 7105-10.130.134.24:7105

四. tcpcopy服务端和客户端说明

1.tcpcopy服务器程序intercept
• intercept -h 查看帮助
• intercept默认端口是36524, 可以通过intercept -p port 更改服务器端的端口号,有时候防火墙会默认过滤端口,可以通过telnet ip 36524确认
• 可以通过netstat -natpl,显示tcp的侦听端口
• 可以通过iptables -L -n 查看防火墙规则,iptables -F 清除防火墙规则
• intercept出错,会在当前运行目录下生成error_intercept.log 日志文件,通过此文件可以发现问题

2.tcpcopy 客户端程序
• 可以通过tcpcopy -h 获取命令帮助
• 如果服务器更改默认端口,使用tcpcopy -p port 更改连接服务器的端口
• 可以通过当前运行目录下的error_tcpcopy.log 查看出错原因

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值