1 概述

tcpcopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去(也可以在测试系统内部放大流量),从而模拟真实运行环境,以便排查测试系统的性能问题和风险。TCPCopy的优势在于其实时性及真实性,除了少量的丢包,可以完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。

在tcpcopy 1.0版本中对整个架构进行了改进,将原本低版本tcpcopy需要运行在测试机上的intercept移除放到一个独立的辅助机上来,使得测试机需要做的操作少到仅仅是添加一条路由而已,对整个测试机的性能损耗可以忽略,排除了intercept运行在测试机上时产生的性能影响,使得测试数据更加接近真实水平。

tcpcopy1.0架构图

2 下载

下载tcpcopy及intercept:

https://github.com/wangbin579/tcpcopy

https://github.com/session-replay-tools/intercept

3 在线流量复制配置方法

说明:

假定我们现在有3台机器:

线上服务器:172.16.1.23

辅助服务器:172.16.1.24

测试服务器:172.16.1.25

若我们现在想将线上服务器172.16.1.23 80端口的流量导入到测试服务器172.16.1.25,我们需要按照下述流程进行操作。

3.1 线上服务器(流量源)部署tcpcopy

解压并安装:

#tar xf tcpcopy-1.0.0.tar.gz

#cd tcpcopy

#./configure

#make && make install

执行下述命令若能显示版本号则表示安装成功:

#/usr/local/tcpcopy/sbin/tcpcopy -v

tcpcopy version:1.0.0

启动脚本范例:

#/usr/local/tcpcopy/sbin/tcpcopy -x 80-172.16.1.25:80 -s 172.16.1.24 -c 172.16.100.x -d -C 4 -l /var/log/tcpcopy.log

说明:

将80端口收到的流量复制到测试机ip 172.16.1.25的80端口,并设置辅助机的ip地址为172.16.1.24,且将复制过去的流量中的源地址统一更改为172.16.100.x,这样做的好处是我们在测试机上可以直接针对整个更改后的网段设置一条路由即可。

3.2 辅助服务器(截获返回数据)部署intercept

解压并安装:

#tar xf intercept-1.0.0.tar.gz

#cd intercept

#./configure

#make && make install

执行下述命令若能显示版本号则表示安装成功:

#/usr/local/intercept/sbin/intercept -v

intercept version:1.0.0

启动脚本范例:

#/usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 80' -d

说明:

辅助机的 intercept 通过-F 参数制定捕获规则,捕获tcp连接中源端口为80的所有数据,也即是测试机的回应数据。其作用是将测试机路由过来的响应数据捕获下来,完成整个请求回应的流程且保证测试机产生的回应数据不会流向线上环境。

intercept 会监听 tcp 36524 端口,并和线上机172.16.1.23的 tcpcopy 之间建立通信,我们通过ss命令可以观察到。

需要注意的是辅助机和测试机一定要是同一网段

3.3 测试服务器(需要导流的目标机器)配置路由

添加路由配置范例:

route add -net 172.16.100.0 netmask 255.255.255.0 gw 172.16.1.24

说明:

线上机tcpcopy复制流量时将源地址改写为172.16.100网段的地址,那么在测试机上看到的流量中源地址全部是来源于这个网段,

我们仅仅需要将返回给这个网段的所有客户端的请求全部通过辅助机 172.16.1.24 路由出去,这样在辅助机上就可以对全部的回应包进行截获处理了。

4 离线回放部署及配置方法

说明:

整体操作流程也是与在线流量copy一样的,唯一的区别是不再是复制在线的即时流量,而是事先将在线流量录制为pcap离线文件然后进行回放。

注:因为线上不同时间段的用户量不一样,用户行为也是随时变化的,多次复制的线上流量肯定是会有所差异的,这样对服务器产生的压力也不一样。所以在做对比性的测试时推荐使用离线回放的方式,以确保每次测试时的请求及对服务器产生的压力是一致的。

4.1 安装并配置支持离线模式的tcpcopy

网上介绍0.98版本以上的tcpcopy才支持离线回放模式,保险起见推荐下载1.0.0最新版的tcpcopytcpcopy。

需要在configure时加上--offline参数才能支持离线回放(可执行configure --help查看帮助信息)

依次执行:

./configure --offline

make&make install

4.2 使用tcpdump录制pcap离线文件

tcpdump -i eth0 -w online.pcap tcp and port 54322    #录制54322端口的tcp请求,保存到online.pcap文件

参数说明:

-i eth0:eth0为网卡,获取方式可在liunx系统下执行ifconfig查看所有的网卡,选取需要的那个。

-w online.pcap:保存所录制请求的pcap文件,以便后续进行回放。可设置路径,e.g.-w /home/user/test.pcaptcp and port 80:截获端口为80的tcp请求,也可添加udp请求,和更改服务端口80,e.g. tcp and port 16001

-s 0:默认的话,tcpdump只显示部分数据包,-s snaplen是控制包长度的,默认是68字节,-s 0 则为全部字节,在使用过程中,如果添加-s则回放时会出现错误。可不使用该参数

4.3tcpcopy、intercept、路由配置

假设有3台机器:

测试机(被测应用所部署的服务器):10.1.2.196 172.16.1.25

辅助机(三次握手回包):10.1.2.203  172.16.1.24

流量回放机(回放pcap离线文件):10.1.2.195  172.16.1.23

辅助机执行intercept(捕获tcp连接中源端口为54322的所有数据):

/usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 54322' -d

流量回放机执行tcpcopy(将流量复制到测试机的54322端口,指定事先录制好的online.pcap文件):

/usr/local/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 54322-172.16.1.25:54322 -s 172.16.1.24 -c 172.16.1.x -i ./online.pcap

测试机配置路由(将返回给172.16.1网段的所有客户端的请求通过辅助机路由出去,以便辅助机对回包截获处理):

route add -net 172.16.1.0 netmask 255.255.255.0 gw 172.16.1.24

回放流量时可以通过 tcpdump -n port 54322的方式抓包测试,亦可观察测试服务的日志确认是否有请求进来,至此流量回放完成。

4.4简化配置及操作方法

以上操作使用的是传统的部署模式,需要占用3台机器。若测试机不足时,也可以简化部署,将intercept直接部署在测试机上(可以省去配置route的操作),如:

测试机执行intercept:

/usr/local/intercept/sbin/intercept -i eth1 -l /var/log/intercept.log -F 'tcp and src port 54322' -d

流量回放机执行tcpcopy(需要通过-c参数将访问测试机的客户端ip地址改写为不存在或无法访问的地址,总之不能让响应包回到真正的客户端,否则会干扰测试的进行):

/usr/local/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 54322-172.16.1.25:54322 -s 172.16.1.25 -c 172.16.88.88 -i ./online.pcap

补充说明

开启tcpcopy或intercept后最好ps一下相关进程,以便确认启动成功。若未启动成功可以查看/var/log/tcpcopy.log(通过启动参数l自行指定)中的报错详情。

若要关闭服务,则直接kill掉tcpcopy或intercept中的一个进程即可,kill掉其中一个进程另一个进程会自动终止。

常见错误解决

1.执行./configure时报错:checking for pcap.h … not found

解决办法:yum install libpcap libpcap-devel(需要用到pcap库头文件)

2.运行TCPCopy命令时日志报错:[error] Can not connect to remote server(10.16.6.62:36524) (Connection refused)

解决办法:首先看看intercept是否已启动。如果已启动成功,看看是否辅助服务器的36524端口不能访问到,没有开通这个端口的权限。在iptable中加上对这个端口的访问(在运行TCPCOPY程序时,会去连辅助机的这个端口,这个端口是由intercept程序监听)

TcpCopy 流量复制相关推荐

  1. 流量复制_详解Linux系统流量复制--gor、tcpcopy、nginx模块流量复制等

    概述 对于一些有并发要求的业务,特别是对接外部流量时,产品上线前一定要做的就是压力测试,但是常规的压力测试并不能覆盖所有情况.以gemeter.ab,.webbench.http_load为例,这些通 ...

  2. 流量复制-----tcpcopy的使用(1)

    前言 TCPCopy是基于网络栈,TCP协议的流量复制,常用的场景是把线上流量复制到测试环境,模拟线上用户操作,让测试机和真实的用户交互,让测试环境在正式灰度前暴露问题,用来排查线下不容易重现的问题, ...

  3. TCPCopy 线上流量复制工具

    TCPCopy是一种重放TCP流的工具,使用真实环境来测试互联网服务器上的应用程序. 一.描述: 虽然真实的实时流量对于Internet服务器应用程序的测试很重要,但是由于生产环境中的情况很负责,测试 ...

  4. 第八章 流量复制/AB测试/协程

    流量复制 在实际开发中经常涉及到项目的升级,而该升级不能简单的上线就完事了,需要验证该升级是否兼容老的上线,因此可能需要并行运行两个项目一段时间进行数据比对和校验,待没问题后再进行上线.这其实就需要进 ...

  5. 流量复制导流工具研究

    背景 Web 应用压力测试工具有很多,比如Apache ab, Apache JMeter等.但是这些工具都没能解决一个问题:如何正确模拟生产环境的流量.对于线下的传统压力测试,难以模拟真实流量,尤其 ...

  6. Gor 流量复制实战

    为什么80%的码农都做不了架构师?>>>    1 需求背景 把prd环境某个域名下的某个post url访问流量复制到stg环境中的机器上,不过在stg环境中访问的post url ...

  7. 基于Gor实现流量复制(加middleware功能增强)

    最近做功能重构,在上线前要求验证重构后的代码与老代码实现逻辑是否一致,基于这个需求,需要在生产环境做一个功能将生产服务器上的流量复制一份发送到测试服务器上. 就这个事情这几天考察了三种技术,1. 基于 ...

  8. gor实现线上HTTP流量复制压测引流

    一.使用背景 gor 是一款go语言实现的简单的http流量复制工具,它的主要目的是使你的生产环境HTTP真实流量在测试环境和预发布环境重现.只需要在 代理例如nginx入口服务器上执行一个进程,就可 ...

  9. 流量复制_快速体验之《gor+diffy实现线上流量复制到测试环境》

    对于没有副作用的接口(重复发送不会产生两份数据.不会产生多余的监控统计等等),就可以用这种方式方便的做回归测试. 部署三个不接外部流量的服务,两份老版本.一份新版本,把生产环境的流量复制到 Diffy ...

最新文章

  1. (每日一题)P1447 [NOI2010] 能量采集(莫反套路 + 欧拉反演 / 容斥原理)
  2. php微服务架构设计模式,《微服务架构设计模式》读书笔记---第十一章:开发面向生产环境的微服务应用...
  3. IT经理世界:专注莫如史玉柱
  4. 浏览器是如何展示网页的
  5. android 让应用恢复前台显示_android – 当应用程序返回前台时出现问题
  6. 【专题介绍】开源与创新
  7. java变量数据类型_java变量与数据类型
  8. Intellij idea 自动生成serialVersionUID
  9. 由浅入深,解决三道【只出现一次的数】!
  10. Remoting压缩信道的编程配置方式
  11. 自己写的php curl库实现整站克隆
  12. 关于vertical layout不能水平居中对齐的原因
  13. ssm注解配置连接mysql_基于注解和配置类的SSM(Spring+SpringMVC+Mybatis)项目详细配置...
  14. PMP备考笔记--1.1
  15. 初次见面C#排坑记录
  16. 怎么用计算机算弧度制,怎么设置计算器 把度数转化为弧度
  17. 基于ARM嵌入式系统的PC/104总线设计
  18. arduino霍尔编码器蓝牙小车代码
  19. 端午小礼品:30 本技术书
  20. 如何对计算机进行磁盘整理,如何对Windows 7进行磁盘碎片整理?

热门文章

  1. php微信小程序向下滑动,详解微信小程序组件:slider滑动选择器
  2. 基金带etf和不带有什么区别?
  3. .NET入行之工作后
  4. Java实习生,应具备哪些知识能力
  5. 总线收发器有什么作用?
  6. MBR30100CT-ASEMI插件肖特基二极管MBR30100CT
  7. python填充红色_opencv之颜色过滤只留下图片中的红色区域操作
  8. python3.8.10安装之后,无法使用 pip,解决办法说明
  9. 数学基础(五)最优化理论(最优化,无约束,有约束,拉格朗日乘子的意义,KKT条件)
  10. 走进智慧社区感受触手可及的幸福