tcpcopy浅谈

       由于上次一台redis宕机,导致上层服务整体不可用,影响面积甚大(原因以后再说),现在线上只是用到了redis的单机模式,多个redis实例构成一致性哈希,供客户端调用。所以最近领导提出了redis的sentinel模式,让我们来研究研究。

       在测试sentinel模式的时候,其中有一个技术细节,即需要把线上的流量导入到线下测试机上,用到了tcpcopy,本文主要讲述tcpcopy的原理及应用。


1、tcpcopy简介

软件名称:tcpcopy-0.6.0.tar.gz (百度云,http://pan.baidu.com/s/1sk8ZGlB)
tcpcopy项目地址:https://github.com/session-replay-tools/tcpcopy

本文只针对tcpcopy1.0版本之前的结构做讲解,即第二代版本。

1.1原理描述 

tcpcopy浅谈_第1张图片


TCPCopy分为TCPCopy client和TCPCopy server。


其中TCPCopy client运行在在线服务器上面,用来捕获在线请求数据包;


TCPCopy server(监听端口为36524)运行在测试机器上面,在测试服务器的响应包丢弃之前截获测试服务器的响应包,并通过TCPCopy client和TCPCopy server之间的tcp连接传递响应包的tcp和ip头部信息给TCPCopy client,以完成TCP交互。

1.2使用方法

1.2.1tcpcopy server用法

TCPCopy server (root用户执行) 测试服务器上面


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条目)

1.2.2tcpcopy client

TCPCopy client   (root用户执行)


./tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口


2、实战

2.1环境

 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   执行复制程序,将阻塞


2.2请求

   在客户端模拟请求192.168.132.128:9901,然后分别在线上服务器和待测服务器执行tcpflow,看请求情况。

线上机:

   [[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


2.3结论

  1. 可以看到复制到待测服务器上的请求的原始ip和端口和线上服务器一样,都是原始客户端ip和端口
  2. 可以在另外一台线上机器上,执行tcpcopy程序复制到待测服务器,使待测服务器的请求数加倍
  3. TCPCopy client需要连接测试服务器的36524端口,所以要对外开放36524端口
  4. 通过cat /proc/net/ip_queue,查看ip queue运行情况,如果Queue dropped的数值不断增大,则需要修改ip_queue_maxlen参数,比如echo 4096 > /proc/sys/net/ipv4/ip_queue_maxlen;
           如果Netlink droppedde的数值不断增大,修改net.core.rmem_max和net.core.wmem_max参数,比如sysctl -w net.core.rmem_max=16777216和sysctl -w net.core.wmem_max=16777216)
        

3、扩展

3.1加倍测试

 ./tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口 -n xx -f yy  (-n 和-f 代表两种方法,都行)


举例如下:


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值代表复制的份数 


3.2待测服务器白名单

./intercept -x 61.135.250.86,61.135.250.87  (这些ip将可以正常直接访问待测服务器,别的都被丢弃)


3.3iptables

待测服务器上:
配置好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)


你可能感兴趣的:(工具)