由于上次一台redis宕机,导致上层服务整体不可用,影响面积甚大(原因以后再说),现在线上只是用到了redis的单机模式,多个redis实例构成一致性哈希,供客户端调用。所以最近领导提出了redis的sentinel模式,让我们来研究研究。
在测试sentinel模式的时候,其中有一个技术细节,即需要把线上的流量导入到线下测试机上,用到了tcpcopy,本文主要讲述tcpcopy的原理及应用。
软件名称:tcpcopy-0.6.0.tar.gz (百度云,http://pan.baidu.com/s/1sk8ZGlB)
tcpcopy项目地址:https://github.com/session-replay-tools/tcpcopy
本文只针对tcpcopy1.0版本之前的结构做讲解,即第二代版本。
TCPCopy分为TCPCopy client和TCPCopy server。
其中TCPCopy client运行在在线服务器上面,用来捕获在线请求数据包;
TCPCopy server(监听端口为36524)运行在测试机器上面,在测试服务器的响应包丢弃之前截获测试服务器的响应包,并通过TCPCopy client和TCPCopy server之间的tcp连接传递响应包的tcp和ip头部信息给TCPCopy client,以完成TCP交互。
1)启动内核模块ip_queue (modprobe ip_queue)
2)设置要截获的端口,并且设置对output截获
iptables -I OUTPUT -p tcp --sport port -j QUEUE
3)./interception (<0.5) or ./intercept (>=0.5)
注意(如果已经启动ip_queue和已经设置iptables,只需要运行第3项;测试完以后要记得删除上面设置的iptables条目)
./tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口
192.168.132.128:9901 (线上服务器)
192.168.132.130:9901 (待测服务器)
9901为业务端口,两台机器运行着相同的业务进程,端口也一样
待测服务器192.168.132.130:
1、下载tcpcopy-0.6.0.tar.gz 并 configure make make install 后生成intercept 和tcpcopy程序
2、modprobe ip_queue (if not run up,通过lsmod | grep ip 查看是否已经加载,modprobe -r name 卸载模块)
3、iptables -I OUTPUT -p tcp --sport 9901 -j QUEUE (if not set ,iptables --list 查看)
4、./intercept 执行拦截程序,将阻塞
线上服务器192.168.132.128
1、tcpcopy -x 9901-192.168.132.130:9901 执行复制程序,将阻塞
线上机:
[[email protected] ~]# tcpflow -cp | grep GET
tcpflow[21422]: listening on eth0
192.168.132.001.44334-192.168.132.128.09901: GET /web1/add.json HTTP/1.1
192.168.132.001.44334-192.168.132.130.09901: GET /web1/add.json HTTP/1.1
[[email protected] ~]# tcpflow -cp | grep GET
tcpflow[22276]: listening on eth0
192.168.132.001.44334-192.168.132.130.09901: GET /web1/add.json HTTP/1.1
举例如下:
1)在在线服务器上执行多个tcpcopy实例,但命令稍微不同,在原有命令基础上会增加 -f参数
比如你想复制3倍的在线流量或者逐步增加流量,你可以执行如下命令
./tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口
./tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口 -f 1
./tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口 -f 2
2)同一个tcpcopy实例内复制多份流量
./tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口 -n xx
其中-n后面的xx值代表复制的份数
./intercept -x 61.135.250.86,61.135.250.87 (这些ip将可以正常直接访问待测服务器,别的都被丢弃)
待测服务器上:
配置好iptbales之后不要去运行service iptables start,不然新加的配置又会被清空了,如果iptables没有启动,可以在加规则之前启动;如果1),2)已经设置并起效的话,只要运行intercept就好了;
测试完成之后要调用iptables -F 把过滤规则去掉
详解
iptables -I OUTPUT -p tcp --sport 9901 -j QUEUE (给ip_queue 处理,intercept再调用ip_queuq 进行交互 drop或accept)