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,做中心管理。

全局图为:



机器标签:

1.线上机器 prodl-client8.f.cn1 10.86.129.151 
2.测试机器 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.csdn.net/h348592532/article/details/50547207
  • http://www.cnblogs.com/yuyijq/p/4541660.html (没有实践过)
  • http://blog.csdn.net/heizistudio/article/details/49761083(没有实践过)




提示:因安全问题图里有遮盖。。理解有误的地方请留言,或添加微信沟通:  cpp_wazi

 






你可能感兴趣的:(tcpcopy 上手介绍和测试说明)