1.什么是tcpcopy
TCPCopy是一种TCP流重放工具,用于支持Internet服务器应用程序的真实测试。
tcp实时流对于Internet服务器应用程序的测试很重要,但是由于线上环境过于复杂,因此很难对其进行模拟。为了支持对Internet服务器应用程序进行更符合生产环境的测试,有了实时流复制工具TCPCopy,该工具可以生成与生产工作负荷类似的测试流。目前,TCPCopy在中国公司被广泛使用。除了占用额外的CPU,内存和带宽外,TCPCopy对生产系统几乎没有影响。在请求多样性,网络延迟和资源占用方面,复现的工作负载与生产环境的工作负载相似。
2.应用场景
- 分布式压力测试
- 使用tcpcopy复制实际数据来对服务器软件进行压力测试,可以发现只能在高压力情况下产生的错误。
- 现场测试
- 证明新系统是稳定的,可以发现仅在真实线上生产环境中出现的错误
- 回归测试
- 性能比较
3.实现原理
如上图,搭建并运行一套tcpcopy需要三台机器
- Online Server:用来运行tcpcopy捕获线上真实流量的服务器,从数据链路层(pcap 接口)抓请求数据包,发包是从IP层发出去;
- Target Server:运行测试程序,比如nginx、ats、whale。设置适当的路由命令,以将响应数据包(图中绿色箭头所示)路由到辅助服务器。
- Assistant Server:运行intercept,原则上一定要用TS同网段的一台闲置服务器来充当辅助服务器。AS 在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的 OS 上的 tcpcopy 进程。,以及充当黑洞。
理想状态:OS通过tcpcopy发送数据包时,它在到达TS之前可能会遇到很多挑战。由于数据包中的源IP地址仍然是最终用户的IP地址(默认情况下),而不是在线服务器的IP地址,因此某些安全设备可能会将其用于无效或伪造的数据包,并将其丢弃。在这种情况下,当在TS使用tcpdump捕获目标服务器上的数据包时,将不会捕获来自预期最终用户的数据包。如果上述有上述场景需求,就需要选择同一网段中的目标服务器进行测试。
所以最完美的情况是找同一网段的三台服务器来充当TS、OS、AS,还有另一种解决方案。tcpcopy可以将数据包发送到代理,然后代理将相应的请求发送到另一个网段中的目标服务器。
4.部署流程
由于公司的yum源已经集成tcpcopy的组件,这里放出github地址:https://github.com/session-replay-tools/tcpcopy
1) OS
yum install -y tcpcopy
tcpcopy -x 80-42.236.8.169:80 -s 42.236.8.170 -c 211.91.146.251 -n 1 -d -r 20 -M 1460
-x 本机80端口的流量copy到42.236.8.169的80端口
-s 指定intercept机器(AS)的地址,tcpcopy要和intercept建立连接
-c 伪装地址,在把流量复制到测试服务器的时候,修改数据包的源地址为 211.91.146.251,这样方便指定路由。也可以写成211.91.146.x,这样源地址就是指定网段中的地址了。
-n 流量放大倍数,如果不是压测目的就不用指定这个参数。
-r 流量使用的百分数,表示只copy当前流量的百分之多少,后面接20,表示20%
-d 以守护模式运行。
-M mtu值
2)TS
route -n
route add -host 211.91.146.251 gw 42.236.8.170
route -n ##确认下路由是都设置成功
3)AS
intercept -i eth1 -F tcp and src port 80 -d
-i 指定监听在哪个端口。tcpcopy启动的时候会来连这个端口,如果连不上,就会启动失败,默认为公网ip的网卡
-F 过滤规则,语法和pcap一样。
-d 以守护进程方式运行
此时,如果设置正常的话,已经可以在TS上看到响应的流量,并且可以在相应的日志,可以加入相应的白盒黑盒监控等,进行查看。