流量复制最佳实践

303 阅读6分钟

描述

「流量复制」常常应用在准生产环境的测试中,将线上的流量复制到一个准生产环境服务中,测试新功能和服务的承压能力。流量复制可以完全模拟线上的流量,对复杂的业务场景进行真实的服务测试,又不会对生产服务产生任何影响

常见方案

●  基于TCP七层请求复制

优点:实现简单

缺点:

1.请求复制从应用层开始,要穿过整个协议栈,容易抢占应用资源,如连接资源

2.测试跟实际应用耦合在一起,容易影响线上机器,也无法复制大量请求

3.很难控制网络延迟

●  基于TCP四层数据链路层请求复制

优点:简单易用,无需穿透整个协议栈,可以从数据链路层或者网络层做流量复制,不走tcp层,这样对线上机器的影响就会少很多

流量复制的两种类型

1.实时复制:实时的把线上流量复制到测试机

2.离线复制:先把流量复制下来,通过tcpdump抓包方式保存在PCAP抓包文件中,然后在测试机离线回放

开源工具对比

部署方式支持协议方式复杂性工作方式丢包
tcpcopytcpcopy 主要有两个组件构成 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

官网: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

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 Server80
Test Server80

拓扑图

角色ip端口
Assistant Server 辅助机10.2.139.31
Online Server nginx10.2.128.1480
Test Server nginx192.168.0.24680

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 相反,黑名单,其他的请求会被捕获到。

本文不对中间件做过多描述,仅讨论常用功能,对中间件有需求的可参考跳转中...