tcpcopy 上手介绍和测试说明
一分钟白话简述:
1.这是一个网易开源工具,创建较早,网上已有多种结构模型,这里选择第三种,优点方便使用理解且性能较高,缺点是多要一台机器做辅助server。 各结构详解对比
2.她是一个请求复制工具。可以将线上流量拷贝到测试机器,实时的模拟线上环境。在不影响线上用户的情况下,使用线上流量进行测试,以尽早发现bug。
也可以通过放大流量,进行压力测试,评估系统承载能力。
3.她可以从线上服务器的IP层抓取在线请求的数据包,修改相关属性,利用raw socket output技术将其发送给测试服务器进行测试。
发送到测试服务器的数据包会在TCP/IP协议栈被识别,其中带有payload(tcp data)的数据包最终进入到测试服务器的上层应用(如nginx),
上层应用在处理完请求之后,将响应传递给测试服务器的TCP/IP协议栈。
4.再说下她的结构,tcpcopy与intercept,分别安装在线上机器与辅助测试机上。
tcpcopy运行在线上服务器,负责捕捉和复制线上请求到待测试服务。
intercept负责在辅助服务器上进行响应包的截获,并通过intercept程序返回响应包的必要信息(一般为TCP/IP头部信息)给tcpcopy。
由于tcp交互是相互的,一般情况下需要知道测试服务器的响应数据包信息,才能利用在线请求数据包,构造出适合测试服务器的请求数据包,
因此只要基于数据包的方式,都需要返回响应包的相关信息。
5.此外,intercept所在的辅助服务器,扮演了黑洞的角色。复制过来的请求从待测试服务机上的响应包
都会被路由到intercept所在的辅助服务上(需要在待测试服务器上配置route规则),为了防止响应返回到线上的真实客户端,这些响应数据包需要被丢弃掉。
还有,也支持udp、mysql session、dubbo.
6.需要三台机器、作用:
(假设线上机器和测试机器的应用都已经让你给弄好了)
线上机器 做tcpcopy-client,启动tcpcopy命令,可以将线上流量复制到线下测试环境。
测试机器 我们的观察请求后的测试机器,需要配置路由,将返回打回给辅助机器。
辅助机器 做tcpcopy-server作用,常驻intercept,做中心管理。
(假设线上机器和测试机器的应用都已经让你给弄好了)
线上机器 做tcpcopy-client,启动tcpcopy命令,可以将线上流量复制到线下测试环境。
测试机器 我们的观察请求后的测试机器,需要配置路由,将返回打回给辅助机器。
辅助机器 做tcpcopy-server作用,常驻intercept,做中心管理。
全局图为:
机器标签:
1.线上机器 prodl-client8.f.cn1 10.86.129.1512.测试机器 testl-ky176.f.cn1 10.86.125.199
3.辅助机器 testl-ky177.f.cn1 10.86.125.200 这里要和测试机器是一个网段
运行命令:
(假设你已经下载,编译完,并将tcpcopy和intercept都已放到线上机和辅助机器上了)1.构思将copy出来的报文是一个模拟用户发出的ip, 这里暂定是172.16.254.0
2.在<target测试机器B-Dev||Beta>机器上,配置路由把本来发到172.16.254.0(子网地址)的响应转到<辅助|控制服务器C-Server>上去
sudo route add -net 172.16.254.0 netmask 255.255.255.0 gw 10.86.125.200
3.在<辅助|控制服务器C-Server> 启动intercept
sudo /home/q/sbin/intercept -i eth0 -F 'tcp and src port 8059' -d -l ~/intercept.log
4.在<线上机器A-Client> 启动tcpcopy -x是指复制当前机器8059端口的数据包到10.86.125.199上面的8059端口中去,-s指定运行intercept所在机器的ip地址。 -c将copy的数据包包装成这个ip发出 -l 表示打印日志的文件 & 表示后台执行
sudo /home/q/sbin/tcpcopy -x 8059-10.86.125.199:8059 -s 10.86.125.200 -c 172.16.254.x -d -l /tmp/tcpcopy.log &
测试效果:
在<target测试机器B-Dev||Beta>机器上,查看对应端口的应用的access日志就好了,另外可以用watcher看机器的tcp报文监控,或者用sar命令也可以。
遇到的问题:
- 运行的命令不能出错,运行的后边都-l日志了,所以每次运行完,都要回头看眼日志。
- 测试机器上的对应端口的应用收到真实的请求报文后,在处理过程中,要关注下应用身后的依赖模块的处理。
- 安装过程...看文档就几个步骤,开源地址:https://www.oschina.net/p/tcpcopy
- 比如想看看支持哪些命令的话,man了下就是乱码,所以要/home/q/sbin/tcpcopy -h,
- 要不就暴力点,直接看git的README吧https://github.com/wangbin579/tcpcopy/blob/master/README.md
- 控制拦截包的大小,从-h可以看到有
- -r <num> set the percentage of sessions transfered (integer range:1~100) 发布百分比
- -n <num> 发布倍数
- 或者多台client 可以实现倍数的流量来跑
- tcpcopy.log 出现error 和 warn 一般都是有问题的,notice是告诉capture了多大等等。
- many connections can't be established 检查端口配置,且保证机器间都能ping通
- Recv socket(6)error 检查下client和server 是否后台还在
- 因为是全部引流,而我所希望的是只要部分服务的流量,这个怎么搞?
- 比如,我只是想要搜索的流量,但是不想要的下单和支付的流量也进来了,所以这里需要搭建个新的复杂环境。
- 而我们这边是这么做的,将机器分成批次ABCDE,A批次机器只部署搜索请求的服务,B批次部署下单,C批次部署支付的等等拆分部署。
- 这样就可以只得到想要对应的服务的流量了。
参考:
- https://github.com/wangbin579/tcpcopy
- https://www.oschina.net/p/tcpcopy
- http://wiki.corp.qunar.com/pages/viewpage.action?pageId=120789231
- http://blog.****.net/h348592532/article/details/50547207
- http://www.cnblogs.com/yuyijq/p/4541660.html (没有实践过)
- http://blog.****.net/heizistudio/article/details/49761083(没有实践过)
提示:因安全问题图里有遮盖。。理解有误的地方请留言,或添加微信沟通: cpp_wazi