TCPCopy是一种重放TCP流的工具,使用真实环境来测试互联网服务器上的应用程序。

一、描述:

虽然真实的实时流量对于Internet服务器应用程序的测试很重要,但是由于生产环境中的情况很负责,测试环境很难完全模拟线上环境。为了能够更真实的测试,我们开发了一款线上流量复制工具-TCPCopy,它可以使用线上真实的流量来对测试环境中的服务器进行测试。目前,TcpCopy技术已经在中国很多公司大量使用。

二、使用场景:

1)分布式压力测试

使用tcpcopy复制真实的数据来进行服务器的压力测试。有些bug只有在高并发的情况下才能够被发现。

2)仿真实验:

被证明是稳定的新系统,其bug只能在真正使用的时候才能被发现

3)回归测试

4)性能对比

三、框架:

如Figure1中所示,tcpcopy包括两部分:tcpcopy(client)和intercept(server)(后文中统一将tcpcopy-client称为tcpcopy,将tcpcopy-server称为intercept),当tcpcopy运行在生产服务器并从生产服务器抓取请求时,inteceptor运行在辅助服务器上进行一些辅助工作,例如,响应tcpcopy。切记,测试应用程序应该运行在测试服务器上。

tcpcopy默认情况下使用socket输入技术在网络层抓取线上的数据包,做一些基本处理(包括:模拟TCP交互,网络控制,以及模拟传输层和应用层),使用socket输出技术发送数据包到测试服务器(如粉色箭头所示)

tcpcopy的测试服务器需要做的唯一操作是:设置适当的参数使响应信息发送到辅助服务器中(装intercept的服务器)(如绿色箭头所示)

intercept(默认)将响应信息传送给tcpcopy。通过抓取响应包,intercept提取响应头信息,并使用一个特殊的通道将响应头信息发送给tcpcopy(如紫色箭头所示)。当tcpcopy接受到响应头信息,它利用头信息修改在线打包器的属性并继续发送另一个包。应当注意,来自测试服务器的响应被路由到应该充当黑洞的辅助服务器。

四、快速开始

1、获取intercept的两种方式:

1)Download the latest intercept release.

2)clone git://github.com/session-replay-tools/intercept.git

2、获取tcpcopy的两种方式

1)Download the latest tcpcopy release.

2)clone git://github.com/session-replay-tools/tcpcopy.git

五、获取安装在辅助服务器上的intercept

1)cd intercept

六、intercept的配置参数

--single            intercept运行在单机情况下

七、获取安装在生产服务器上的tcpcopy

1)cd tcpcopy选择适当的配置参数

八、tcpcopy的配置参数

--offline 从pcap文件重放TCP流将路径设置为PF_RING库源以debug模式编译tcpcopy(保存在日志文件中)

九、运行tcpcopy

确保tcpcopy和intercept都配置为“./configure”

1)在运行应用程序的测试服务器上,正确设置路由命令以将响应数据包发送到辅助服务器上

例如:

假设61.135.233.161是辅助服务器的IP地址。 我们设置以下route命令将所有对62.135.200.x的的响应路由到辅助服务器。

route add -net 62.135.200.0 netmask 255.255.255.0 gw 61.135.233.161

2)在运行intercept的辅助服务器上(需要root权限或者能使用socket通信的权限)

./intercept -F <filter> -i <device,>

请注意,过滤器格式与pcap过滤器相同。

intercept将捕获基于TCP应用的响应,该应用监听在设备的8080端口上

3)生产服务器中(需要root权限或者能使用socket通信的权限)

./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,>

[-c <ip range,>]

例如(假设61.135.233.160是目标服务器的IP地址):

./tcpcopy -x 80-61.135.233.160:8080 -s 61.135.233.161 -c 62.135.200.x

tcpcopy将抓取当前服务器上80端口的数据包,修改客户端IP地址为62.135.200.x,将这些数据包发送到ip地址为61.135.233.160,端口为8080的测试服务器,并且连接61.135.233.161,告诉intercept将响应数据包发送给它(tcpcopy)

十、注意

1)只能在linux上测试(kernal 2.6 or above)辅助服务器上设置ip转发

十一、影响因素

有几个因素可能影响TCPCopy,将在以下部分中详细介绍:

1)抓包接口

tcpcopy默认使用套接字输入接口在网络层抓取生产服务器的数据包。在系统忙时,系统内核可能会丢包。

如果你配置tcpcopy的参数“--pcap-capture”,tcpcopy将在数据链路层抓包,也可以过滤内核中的数据包。在PF_RING资源中,当使用pcap捕获时,tcpcopy将丢失更少的数据包。

或许抓请求包的最好方式是通过交换机镜像入口的数据包,然后通过负载均衡器将巨大的流量划分到几台机器

2)发送接口

tcpcopy默认使用套接字输出接口在网络层发送数据包到测试服务器。如果你想避免IP连接跟踪问题或者获得更好的性能表现,配置tcpcopy的参数“--pcap-send”,设置适当的参数,tcpcopy可以在数据链路层发送数据包到测试服务器。

3)数据包在通往测试服务器的路上

当一个数据包被tcpcopy发送时,它可能在到达测试服务器前遭到很多挑战。由于数据包中的源IP地址依然是终端用户的IP地址(默认情况下)而不是生产服务器的IP地址,一些安全设备可能将该包削弱或当做伪造的包丢弃它。这种情况下,你在测试服务器使用tcp抓包工具,可能抓取不到期望的终端用户的数据包。要确定你是否正处于这种情况下,你可以使用同一网段下的测试服务器做个小测试。如果数据包能被成功的发送到同一网段的测试服务器,而不能发送到不同网段的测试服务器,那么证明你的数据包在半路被丢弃了。

为了解决这个问题,我们建议将tcpcopy、测试服务器、intercept部署在同一个网段内。在同一网段中有一个代理的帮助下还有另一个解决方案,tcpcopy可以向代理发送数据包,然后代理会将相应的请求发送到另一个网段中的测试服务器。

注意,在同一网段中的一个虚拟机上部署目标服务器应用程序可能面临上述问题

4)测试服务器的路由

测试服务器可能设置了反向过滤技术,可以检查包中源IP地址是否是被伪造的。如果是,则该包在网络层被丢弃。

如果在测试服务器中能用tcp抓包工具抓到包,但是测试服务器上的应用程序接收不到任何请求,你应该检查你是否有类似反向过滤技术的设置。如果设置了,你不得不移除相关的设置来让数据包通过网络层。

也有些其他原因可能导致tcpcopy不能正常工作,例如防火墙设置问题。

5)测试服务器上的应用程序

测试服务器上的应用程序可能不能及时处理所有的请求。一方面,应用中的bug导致请求很长时间得不到响应;另一方面,一些TCP层以上的协议只处理socket缓冲中的第一个请求,将剩下的请求留在socket缓冲中不处理。

6)辅助服务器的路由

你不应该设置ip转发为true或者辅助服务器不能作为一个黑洞工作。

十二、历史版本

2014.09 v1.0 TCPCopy released

十三、错误和功能请求

有错误或功能请求?请打开一个新问题。 在打开任何问题之前,请搜索现有问题。

十四、版权和许可

版权所有2016根据BSD许可。

要使用MySQL重放Session,请参考:mysql-replay-module

原文链接:https://github.com/wangbin579/tcpcopy

TCPCopy 线上流量复制工具的更多相关文章

  1. 使用tcpcopy复制线上流量进行测试

    使用tcpcopy复制线上流量进行测试 online server 线上服务所在机器 10.136.11.4 部署tcpcopy sudo /usr/local/tcpcopy/sbin/tcpcop ...

  2. 使用tcpcopy导入线上流量进行功能和压力测试

    - 假设我们要上线一个两年内不会宕机的先进架构.在上线前,免不了单元测试,功能测试,还有使用ab,webbench等等进行压力测试. 但这些步骤非生产环境下正式用户的行为.或许你会想到灰度上线,但毕竟 ...

  3. 【原创】MySQL Replay线上流量压测工具

    一. 背景 去年做过一次mysql trace 重放的测试,由于performance schema本身采集样本的长度等限制,实际回放的成功率比较低. 最近找到一款开源的工具,基于TCPCopy实现了 ...

  4. 使用tcpcopy拷贝线上流量压测测试环境

    tcpcopy项目地址:https://github.com/session-replay-tools/tcpcopy 作者地址:http://blog.csdn.net/wangbin579 1:环 ...

  5. goreplay HTTP-HTTPS流量复制工具

    goreplay相比tcpcopy只能复制HTTP和HTTPS的流量 goreplay编译很麻烦,就直接使用编译好的版本 gor_0.10.1_x64.tar.gz 支持centos5,测试的是cen ...

  6. BTrace:线上问题排查工具

    BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...

  7. Arthas-Java的线上问题定位工具

    Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar ...

  8. java 线上问题定位工具

    在JDK的bin目录下有很多命令行工具: 我们可以看到各个工具的体积基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是因为这些工具大多数是jdk\lib\tools.jar类库的一层薄 ...

  9. Arthas:线上问题排查工具

    安装 下载 java -jar arthas-boot.jar 查看版本: D:\Program Files\arthas $ java -jar arthas-boot.jar -version [ ...

随机推荐

  1. PHP 限制访问ip白名单

    一  上代码 config.php //ip白名单配置 'ipWlist'=>[ 'ifFilter'=>true, //是否开启白名单功能 'wlist'=>[ '10.0.0.1 ...

  2. 17.3.16---python内建函数

    内置函数,无需import,任何时候都可以直接被使用 1------ Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍 ...

  3. JS中的0b00与0x00表示什么

    换成二进制表示:(0b表示二进制数,0x表示16进制数)

  4. 唐顿庄园S01E01观看感悟

    刚刚看了唐顿庄园的第一季第一集.看第一遍的时候,主要是看剧情,看看有没有什么吸引人的.我是一带而过的.等到看第二遍的时候,仔细观察画面,欣赏画面的美感,琢磨人物的台词对话.不断的倒退回放,越看越有滋味 ...

  5. 三、linux-mysql mysql的多实例

    1.什么是mysql多实例 一个机器开通多个端口,运行多个mysql服务器进程,这些服务进程通过不同的socket监听不同的服务端口提供各自的服务,但它们共用一台mysql安装程序,使用不同的my.c ...

  6. 存储过程获取QLIKVIEW关键数据

    declare @table table(DDID INT,FHDID INT ,CKDID INT,ZGYSDID INT,CWYSDID INT)--定义表变量来存放存储过程返回的内容insert ...

  7. HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Control character in cookie value or attribute.

    HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: ...

  8. linux下文件夹归置方式

    /bin:二进制可执行命令./dev:设备特殊文件./etc:系统管理和配置文件./etc/rc.d:启动的配 置文件和脚本./home:用户主目录的基点,比如用户user的主目录就是/home/us ...

  9. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-测试类中调用封装的mock(10)

    封装mock后,在单元测试中调用 # -*- coding: utf-8 -*- # @Time : 2020/2/11 8:35 # @File : test_class_10.py.py # @A ...

  10. Nginx笔记:支持对用户提交URL和服务的URL不一致时,保持对POST提交的支持

    用户访问的URL和服务的URL不一致,需要对URL修改,同时使用的是POST提交方式 location ~* ^/portalproxy/([-]*)/portal$ { #rewrite '^/po ...