文章首发公众号「码农吴先生」, 欢送关注,及时获取更多技术干活~
「流量复制」经常利用在准生产环境的测试中,将线上的流量复制到一个准生产环境服务中,测试新性能和服务的承压能力。流量复制能够齐全模仿线上的流量,对简单的业务场景进行实在的服务测试,又不会对生产服务产生任何副作用。
对于简单的流量复制利用场景和需要,齐全能够立项开发一套残缺的复制架构,可参考字节团队自研的 ByteCopy 我的项目。而对于一些简略的需要,开源的工具根本能够搞定。开源的流量复制工具有很多,罕用的有 goreplay、tcpreplay、tcpcopy 等。
本文次要来探讨下 tcpcopy 和 goreplay 的计划实现,废话不多说开整。
tcpcopy 计划实现
tcpcopy 简介
tcpcopy 由网易技术部王斌等开发,并于 2011 年 9 月开源的。tcpcopy 最新架构如下(来自作者王斌博客:https://blog.csdn.net/wangbin…):
tcpcopy 次要有两个组件形成 tcpcopy client 和 intercept。client 端负责复制流量和转发,intercept 负责对回应流量的拦挡和 tcpcopy 的链接解决。
tcpcopy 搭建
实例环境如下,上面来论述下整个架构的搭建过程:
- 192.168.33.11 生产服务器,部署 tcpcopy client
- 192.168.33.12 辅助服务器,部署 intercept
- 192.168.33.13 测试服务器
各组件可间接从 github 下载源码包,编译装置:
# 起压机部署 tcpcopy client 192.168.33.11
wget https://github.com/session-replay-tools/tcpcopy/archive/1.0.0.tar.gz
tar xvf 1.0.0.tar.gz
cd tcpcopy-1.0.0
./configure --prefix=/opt/tcpcopy
make
make install
# 辅助机部署 intercept 192.168.33.12 , 截获包须要依赖 libpcap 抓包函数库
yum -y install libpcap-devel
# ubuntu
# apt install -y libpcap-dev
https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz
tar xvf 1.0.0.tar.gz
cd intercept-1.0.0
./configure --prefix=/opt/tcpcopy/
make
make install
装置完之后,先启动 intercept,运行如下命令:
/opt/tcpcopy/sbin/intercept -i enp0s8 -F 'tcp and src port 8000' -d
# -i,指定网卡 enp0s8
# -F,过滤,语法和 pcap 抓包工具始终,如 tcpdump
# -d,以 domain 的模式启动。# 其余参数可 -h 查看。
启动 intercept 之后,再启动 tcpcopy client。tcpcopy 启动依赖 intercept,启动时确保 intercept 启动胜利。
/opt/tcpcopy/sbin/tcpcopy -x 8000-192.168.33.13:8000 -s 192.168.33.12 -c 192.168.1.x -n 2 -d
# -x,复制本地 8000 端口的流量,转发到 192.168.33.13 机器的 8000 端口
# -s,辅助服务器 intercept 地址
# -c,批改转发包的原地址为该地址段的地址,这里也能够是明确的 ip。这个 ip 端用来假装数据包,不便 intercept 做路由劫持。# -n,流量倍数
# -d,以 domain 的模式运行
在测试服务器增加拦挡路由,如下:
# 测试机 192.168.33.13
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.33.12
该路由相当于把到 192.168.1.0 网段的包都走网关 192.168.33.12,对测试服务器的回包做伪地址拦挡。
这便是 tcpcopy 的整个架构部署了。
包流动剖析
上面咱们抓包看看这个过程中包是如何流动的。
我在 tcpcopy client 机器 192.168.33.11 和测试机器 192.168.33.13 应用 python -m SimpleHTTPServer
别离起了一个 8000 端口的服务用来测试,从我本机 192.168.33.1 发送申请,在三台机器上抓包。
tcpcopy client 机器 192.168.33.11 包信息如下:
红色标注块为我本机(192.168.33.1)和 tcpcopy client 机器(192.168.33.11)的失常申请替换,从三次握手,到 http 申请,到最初的断链。
蓝色标注块则为 tcpcopy 复制的流量,能够看到为了让 intercepter 拦挡回包流量,tcpcopy 已将包源 ip 地址替换为咱们指定的伪网段(192.168.1.0)的地址,这样在回包时,就会依据测试服务器上的路由将回包指向辅助服务器 intercept,防止对生产流量造成影响。这也是为什么复制流量三次握手和 http 都没有回包的起因。
看测试服务器 192.168.33.13 的包:
测试服务器的包和失常流量包一样,三次握手到 http 申请,最初断连。这里和测试服务器 192.168.33.13 交互的源地址 ip 曾经被 tcpcopy 替换为伪 ip 192.168.1.1。
看 intercept 192.168.33.12 的包:
能够看到辅助服务器拦挡下来的申请,标注块 1 为复制流量三次握手时的回包,标注块 2 为 http 申请的回包,这便是 intercept 的拦挡性能。能够看到在标注块 1、2 之后,辅助服务器(192.168.33.12)和 tcpcopy 服务器(192.168.33.11)进行了数据交换,这部分便是 intercept 的 tcp 解决性能,它把有用的信息返回给 tcpcopy 以便能使 tcpcopy 和测试机的 tcp 链接实现。
依据上边抓包,咱们失去了和架构图一样的包流动过程,总结如下:
- 生产流量失常申请,服务失常回应。
- tcpcopy 服务在生产机器上复制流量,并批改流量包的源 ip 地址为咱们指定的伪网络段 (-c 参数指定),之后将流量转发到测试服务器。
- 测试服务器,承受到流量,但包的源地址为伪网络段的地址,回包时依据提前配置好的伪路由,将回包导流到辅助服务器。
- 辅助服务器接管测试服务器的回包,然而并不转发。而是解包,只返回局部必要的信息给 tcpcopy,以便实现 tcpcopy 和测试服务器之间的 tcp 交互。
依据官网文档,咱们还须要留神几个问题:
- 辅助服务器不做包的转发,须要敞开内核参数
ip_forward
- 在做测试时,留神上行流量的过滤和测试数据源的隔离,避免对生产数据造成屡次操作的影响。
- 上边为在线实时的复制模式,tcpcopy 还反对离线形式,具体可查阅文档。
- 辅助机须要和测试机在一个网段,以便辅助机作为伪网段的网关应用。这里能够加一次代理,解除这个限度。如应用 nginx 作为测试中转折,将伪路由增加到 nginx 服务器上,测试机只须要向 nginx 注册即可,无需做其余配置。
goreplay 计划实现
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 “http://staging.com|10” 输入流量的 10%
- –http-allow-method 依据申请形式过滤。
- –http-allow-url url 白名单,其余申请将会被抛弃。
- –http-disallow-url 遇上一个 url 相同,黑名单,其余的申请会被捕捉到。
本文不对中间件做过多形容,仅探讨罕用性能,对中间件有需要的可参考中间件文档。
goreplay 搭建
Goreplay 是应用 golang 开发的,咱们能够间接应用编译好的对应各零碎的二进制文件,也能够本人编译,咱们这里间接应用二进制文件。
wget https://github.com/buger/goreplay/releases/download/v1.3.0_RC1/gor_1.3_RC1_x64.tar.gz
tar zxvf gor_1.3_RC1_x64.tar.gz
# 解压出二进制文件 gor
gor
接下来,间接启动 gor 即可复制流量和转发。
sudo ./gor --input-raw :8000 --output-http="http://192.168.33.13:8001"
复制本地 8000 端口的流量到 http 远端服务 http://192.168.33.13:8001
。(复制同端口的流量时,流量会反复。这是 gor 的一个 bug,截止目前 1.3 版本仍可复现,可见 issue292)
goreplay 的流量转发,并不是间接 tcp 包的转发,而是从新组织 http 协定级别的申请,发送到测试服务器。所以它是新的 gor 线程和测试服务器的交互,和监听线程无关,所以无需对流量进行拦挡。
包流向剖析
上面咱们来看下 gor 复制的流量包的流向过程:
红色标注块为失常流量,蓝色标注块为复制的流量。
看到此处,你可能会有疑难,为什么 gor 不必拦挡流量?
大家认真看 tcpcopy 和 gor 复制流量的端口,在生产机和测试机建设连贯时,tcpcopy 尽管批改了 tcp 包的源 ip,但端口还是用的申请客户端的端口,是 tcp 数据链路层级别的流量复制。而 gor 这里严格来说并不是复制,而是从新构建了 http 申请。应用新端口来和测试机建连,绝对的测试机在回包时,即便包是回到了生产机,但因为是和客户端不同的端口,也不会对生产流量造成影响。
比照总结
到此,咱们对流量复制有了些根本的概念和利用了,也对 tcpcopy 和 goreplay 两款开源工具有了肯定的认知。两款开源工具各有优缺点,咱们来一块总结下。
- tcpcopy 部署架构绝对简单,goreplay 绝对简略只需启动一个过程。
- tcpcopy 反对的协定比拟丰盛,goreplay 依据架构特点仅反对 http。
- tcpcopy 和 goreplay 都反对离线和在线录制回放。
简略 http 复制 goreplay 齐全能够胜任,稍简单点或利用场景更简单,那么举荐 tcpcopy。更简单,要求更高的流量复制,那只能咱们本人定制了。
好了,本篇到这完结了,欢送留言探讨,你觉着最佳流量复制计划。
我是 DeanWu,一个致力成为真正 SRE 的人。
关注公众号「码农吴先生」, 可第一工夫获取最新文章。回复关键字「go」「python」获取我收集的学习材料,也可回复关键字「小二」,加我 wx 拉你进技术交换群,聊技术聊人生~