tcpcopy

作用:
tcpcopy可以当做一种压力测试工具,也可以获取真实的用户访问流量,从而模拟真实运行环境(把线上流量导入到测试系统中去)
      1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小,也可以提前发现一些bug
      2)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开
         发者有信心上线
      3)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验
      4)流量放大功能,可以利用多种手段构造无限在线压力,满足中小网站压力测试要求
      5)利用TCPCopy转发传统压力测试工具发出的请求,可以增加网络延迟,使其压力测试更加真实

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

在线上服务器启动一项服务,将网络中发送到线上服务某个端口的报文COPY一份,将这份COPY的报文转发到测试服务器的某个端口上。

测试服务器上,为了防止对测试服务器的请求能够获取响应报文,在测试服务器上启动一项服务,对服务器某个端口的响应报文做过滤,即如果是响应报文,系统都拒绝发送。
)

使用方法:
(需要安装openssl-devel)

在测试服务器上
[root@localhost bin]# modprobe ip_queue
[root@localhost bin]# iptables -I OUTPUT -p tcp --sport 80 -j QUEUE  (80为要监听的端口)
IPTABLE 是为构筑防火墙而设置的,这条命令是,将本机端口上的TCP响应报文(OUTPUT)都压入内核队列IP_QUEUE,这个IP_QUEUE队列中的报文会被应用层程序获取,对报文做检测后决定内核中该报文应该如何处理,(AF_ACCEPT 内核接受该报文,被发送;AF_DROP 内核抛弃该报文,不发送)。
[root@localhost bin]# ./interception
在目标测试机上启动一个服务器程序(默认端口为36524),主要用于与线上服务器的通讯,已经对端口的响应报文进行过滤。(通过Netlink Socket实现)

线上服务器
[root@localhost bin]# ./tcpcopy 10.103.9.122 80 10.103.9.121 80   (本地ip地址 端口  测试服务器ip地址 端口)
注意(本地ip地址列表其实就是客户端所认为的服务器ip地址,如果前面有lvs,一般就是lvs的虚拟ip地址)

实现与目标测试机服务器程序(36524)的连接,同时负责将网络请求80的报文复制并发送到目标测试机的80端口

 

---------------------------
注意:
.TCPCopy由于依赖于抓包函数,压力大的时候,抓包函数本身不可靠,所以会丢包,进而丢失请求
.TCPCopy只与ip、tcp层的数据有关,如果请求验证与tcp层以上的协议有关,则系统不能正常运行。例如:mysql连接协议,由于权限认证与tcp层上面的mysql协议有关,所以复制过去的请求会被目标测试服务器认为非法请求,这个时候需要针对mysql协议作具体针对性的处理,tcpcopy程序才能正常运行。
.不支持域名,只支持ip地址。

---------------------------
高级用法

1. 级联
设有线上前端机一台命名A,测试前端机若干B,C,D,……利用tcpcopy可以将A上的访问流量拷贝到B,B拷贝到C,C拷贝到D,……这样就将一份流量放大了多倍,可以用来测试引擎的极限承受能力。
2. 同一tcpcopy实例内多重复制
从0.4版开始,tcpcopy支持在同一个客户端实例复制多份请求到同一个服务端,启动的方式如下(比如要复制2份,使用-n这个选项来控制要复制的份数),
sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80;
sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80 -n 1;
sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80 -n 2;
3. 服务端允许访问ip列表
由于配置了iptables规则,使用tcp协议且源端口号为80的包都会被匹配放到目标QUEUE去,进而被drop掉,因此这个时候测试前端机上的nginx服务是不可访问的。从0.4版本开始,可以指定一个允许访问ip列表,在列表中的机器上是可以访问测试前端机上的nginx服务的。假如要添加61.135.xxx.3,61.135.xxx.4到允许ip列表,启动interception时使用如下方式:
sudo ./interception 61.135.xxx.3:61.135.xxx.4;