描述
「流量复制」常常应用在准生产环境的测试中,将线上的流量复制到一个准生产环境服务中,测试新功能和服务的承压能力。流量复制可以完全模拟线上的流量,对复杂的业务场景进行真实的服务测试,又不会对生产服务产生任何影响
常见方案
● 基于TCP七层请求复制
优点:实现简单
缺点:
1.请求复制从应用层开始,要穿过整个协议栈,容易抢占应用资源,如连接资源
2.测试跟实际应用耦合在一起,容易影响线上机器,也无法复制大量请求
3.很难控制网络延迟
● 基于TCP四层数据链路层请求复制
优点:简单易用,无需穿透整个协议栈,可以从数据链路层或者网络层做流量复制,不走tcp层,这样对线上机器的影响就会少很多
流量复制的两种类型
1.实时复制:实时的把线上流量复制到测试机
2.离线复制:先把流量复制下来,通过tcpdump抓包方式保存在PCAP抓包文件中,然后在测试机离线回放
开源工具对比
| 部署方式 | 支持协议 | 方式 | 复杂性 | 工作方式 | 丢包 | |
|---|---|---|---|---|---|---|
| tcpcopy | tcpcopy 主要有两个组件构成 tcpcopy client 和 intercept 。client 端负责复制流量和转发,intercept 负责对回应流量的拦截和 tcpcopy 的链接处理基于TCPCopy的仿真压测方案-腾讯云开发者社区-腾讯云tcpcopy-流量重放工具-腾讯云开发者社区-腾讯云 | 支持的协议比较丰富 | 在线、离线 | 较高 | 单进程单线程 | 可能存在丢包GitHub - session-replay-tools/tcpcopy: An online request replication tool, also a tcp stream replay tool, fit for real testing, performance testing, stability testing, stress testing, load testing, smoke testing, etc |
| GOReplay | 生产服务器上启动一个 gor 进程,它负责所有的工作包括监听、过滤和转发GitHub - buger/goreplay: GoReplay is an open-source tool for capturing and replaying live HTTP traffic into a test environment in order to continuously test your system with real data. It can be used to increase confidence in code deployments, configuration changes and infrastructure changes.流量回放工具之 Goreplay 安装及初级使用 - 掘金推荐一款技术人必备:线上引流神器GoReplay-阿里云开发者社区 | 仅支持 http,可以支持接口级别 | 在线、离线 | 较低 | ||
| nginx镜像模块 | 重新编译nginx增加mirror模块Module ngx_http_mirror_module利用Nginx的mirror模块实现简单流量复制-腾讯云开发者社区-腾讯云 | 7层协议,可支持接口级别 | 在线 | 较高需要编译nginx |
TCPCopy
tcpcopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去,甚至可以放大在线流量,为流量类产品的测试多加一层保障,基于网络栈,TCP协议的流量复制
场景
● 分布式压力测试:(利用tcpcopy复制或放大生产流量,以触发验证高并发大流量场景下的bug)
● 稳定性测试:(利用tcpcopy复制或放大生产流量,验证系统服务稳定性)
● 回归测试:(利用tcpcopy复制生产流量,复现bug问题)
● 性能比较:(利用tcpcopy复制或放大生产流量,验证新版本性能是否达标)
框架
工作原理:
1. TCPcopy 从数据链路层 copy 端口请求,然后更改目的 ip 和目的端口。
2. 将修改过的数据包传送给数据链路层,并且保持 tcp 连接请求。
3. 通过数据链路层从 online server 发送到 test server。
4. 在数据链路层解封装后到达 nginx 响应的服务端口。
5. 等用户请求的数据,回包走数据链路层。
6. 通过数据链路层将返回的结果从 test server 发送到 assistant server。注:test server 只有一条默认路由指向 assistant server。
7. 数据到达 assistant server 后被 intercept 进程截获。
8. 过滤相关信息将请求状态发送给 online server 的 tcpcopy,关闭 tcp 连接。
主要进程:
TCPCopy Server(tcpcopy):部署在(target目标端) ,用于接收复制的线上请求
TCPCopy Client(intercept):部署在线上服务器 ,用于捕获线上请求,通过修改TCP/IP数据包,发送到TCPCopy Server进行稳定性测试,截获响应包,并传递响应包头信息给TCPCopy client,以完成TCP交互。
需要注意的问题:
1、辅助服务器不做包的转发,需要关闭内核参数 ip_forward
2、在做测试时,注意上行流量的过滤和测试数据源的隔离,防止对生产数据造成多次操作的影响。
3、tcpcopy 还支持离线方式,具体可查阅跳转中...。
3、辅助机需要和测试机在一个网段,以便辅助机作为伪网段的网关使用。这里可以加一次代理,解除这个限制。如使用 nginx 作为测试中转机,将伪路由添加到 nginx 服务器上,测试机只需要向 nginx 注册即可,无需做其他配置。
环境搭建
环境说明
| 角色 | ip | 端口 |
|---|---|---|
| Assistant Server | ||
| Online Server | 80 | |
| Test Server | 80 |
拓扑图
| 角色 | ip | 端口 |
|---|---|---|
| Assistant Server 辅助机 | 10.2.139.31 | |
| Online Server nginx | 10.2.128.14 | 80 |
| Test Server nginx | 192.168.0.246 | 80 |
doc.weixin.qq.com/public/addo…
实时复制
离线复制
● 使用tcpdump抓包
tcpdump -i eth0 -w test.pcap tcp and port 80 -c 100
● 流量回放
./tcpcopy -x 80-3.3.3.3:8080 -s 2.2.2.2 -c 1.1.1.0 -i test.pcap
GOReplay
Goreplay 是另一个比较常用的流量复制开源工具。与 tcpcopy 相比它的架构更简单,只有一个 gor 组件,如下:
只需要在生产服务器上启动一个 gor 进程,它负责所有的工作包括监听、过滤和转发。 它的设计遵循 Unix 设计哲学:一切都是由管道组成的,各种输入将数据复用为输出。
输入输出通常被成为插件,常见的有下面几种。
可用输入:
● --input-raw 用于捕获 HTTP 流量,您应该指定 IP 地址或接口和应用程序端口。
● --input-file 接受流量输出的文件(--output-file),用来离线流量重放。
● --input-tcp 如果您决定将来自多个转发器 Gor 实例的流量转发给它,则由 Gor 聚合实例使用。
可用输出:
● --output-http 重放 HTTP 流量到给定的端点,接受基础 URL。
● --output-file 记录传入的流量到文件。更多关于保存和从文件重播
● --output-tcp 将传入数据转发给另一个 Gor 实例,并与其一起使用--input-tcp。
● --output-stdout 用于调试,输出所有数据到 stdout。
你可以对数据进行限速、过滤、重新,还可以重用中间件实现一些自定义逻辑处理,如私有数据的过滤、认证等个性需求。
其他常用参数:
● --output-http "知乎 - 安全中心|10" 输出流量的 10%
● --http-allow-method 根据请求方式过滤。
● --http-allow-url url 白名单,其他请求将会被丢弃。
● --http-disallow-url 遇上一个 url 相反,黑名单,其他的请求会被捕获到。
本文不对中间件做过多描述,仅讨论常用功能,对中间件有需求的可参考跳转中...。