百度TcpCopy,得到的结果是:TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去。曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的很多问题。现在此工具已经广泛应用于各大互联网公司。近期接触到的项目就是关于线上引流的,因此普及了一下tcpcopy的架构。
TcpCopy顾名思义,就是一个可以将tcp流量复制的工具(其实也可以复制UDP)。有了这样一个工具,我们就可以真实的复制线上流量,然后将这些流量复制到我们的测试服务器上。这样就可以很容易模拟线上真实用户的访问,做一些功能上的,性能上的测试。而且经过实际测试发现TCPCopy对线上机器的资源消耗也是极低的。而请求复制,一般分为两类:
从上面图中我们可以看出,tcpcopy默认从IP层抓包,从IP层发包,与第一种架构不同的是,我们在测试服务器进行响应包的截获,并通过intercept程序返回响应包的必要信息给tcpcopy。这种架构为分布式压力测试提供了可能性,相比第一种架构,大大推动了tcpcopy的进化。
我们先从响应包的截获来分析,理论上,可以在测试服务器的IP层或者数据链路层进行截获响应包,我们具体分析如下:
1)在数据链路层抓,正常情况下,其响应数据包会返回给真正发起请求的客户端,这会或多或少影响到客户端的TCP(频繁地reset)模块,而且在压力大的时候,会给交换机、路由器甚至整个网络,带来不必要的干扰。
2)在测试服务器的IP抓响应包,正好有netlink技术来解决上面的问题,netlink是一种用户态进程与内核进行交互的技术,具体地我们可以利用内核模块ip queue(内核3.5以下版本)或者nfqueue(内核3.5或者以上版本)来达到捕获响应包的目的。
我们采用了第二种方式,也即上图中的IP层来截获响应包,当响应包传递给intercept后,我们就能copy到响应包信息的必要信息(一般为TCP/IP头部信息),传递给tcpcopy,我们还可以通过verdict告诉内核,该如何处理这些响应包,如果没有设置白名单的话,就会在IP层丢弃掉这些响应包,这时候你是无法利用tcpudmp来抓到这些响应包的(tcpdump工作在数据链路层)。
这种设计的好处就是可以支持复制多台在线流量到一台测试服务器中去,我们在intercept保留路由信息,知道响应包的相关信息该如何返回给哪一个tcpcopy实例。然而这种架构,intercept会不同程度地占用测试服务器的资源,而且ip queue或者nfqueue,并不一定能够高效工作,因而给测试,特别是高压测试和短连接压力测试,带来了很大麻烦。
具体如下:
在运行上层服务的测试服务器test server上面设置路由信息,把待测试应用的需要被捕获的响应数据包信息路由到辅助服务器assistant server 上面,在assistant server上面,我们在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的tcpcopy。为了高效使用,这种架构推荐使用pcap进行抓包,这样就可以在内核态进行过滤,否则只能在用户态进行包的过滤,而且在intercept端或者tcpcopy端设置filter(通过-F参数,类似tcpdump的filter),达到多个实例来共同完成抓包的工作,这样可扩展性就更强,适合于超级高并发的场合。
当然这种架构需要的机器资源也更多,而且也变得更加难使用,需要了解tcp知识,route知识和pcap filter知识(类似于tcpdump过滤条件),因此推荐有条件的并且熟悉上述知识的人使用最新的架构。
总结如下:
好处:
1)更加真实
2)可扩展性更强
3)适合高并发场合
4)无ip queue或者nfqueue的各种限制
5)对测试服务器几乎没有任何性能干扰的影响
6)在运行服务的测试服务器,运维更加方便
7)不会随运行服务的服务器崩溃而崩溃
缺点:
1)操作难度更大
2)需要的机器数量更多
3)需要的知识也更多
4)assistant server(运行intercept的机器)原则上必须要和测试服务器(test server)在同一个网段
目前项目中用到的引流架构就是第三种架构,需要额外的辅助服务器,当然这也可以更加真实的模拟线上的情况。