于是有人说,便是由于这样才该当直接用真实流量的办法来做嘛,这样就不用管业务模型了,直接就有生产的业务模型了。没错,只要你能通过生产流量扩大回放的办法实现压力部分,确实可以不用考虑业务场景了。但这么做的条件也必须是你的生产流量来源是可以覆盖想要测试的业务场景的。
这里要批驳一个不雅观点,便是有些人以为只有通过生产流量回放的办法,才是真实地 仿照了线上的流量。事实上,这个不雅观点是偏颇的。
总结一下,流量复制工具的上风便是可以将线上流量拷贝到测试机器,实时的仿照线上环境,真实的仿照线上流量的变革规律,达到在程序不上线的情形下实时承担线上流量的效果。

流量复制工具一样平常分成这几类:
基于web 做事器的要求复制 优点:要求多样化、本钱缺陷:不具备通用性、丢失网络延迟、占用在线资源比较严重基于运用层的流量复制工具 优点:实现大略缺陷:但会挤占线上运用的资源(比如连接资源,内存资源等),还可能会由于耦合度高而影响正常业务。基于网络栈的流量复制工具,直接从链路层抓取数据包 优点:运用影响较小缺陷:但是实在现也就相对繁芜一些2、ngx_http_mirror_module在 Nginx 1.13.4 中引入的插件它是一种运用层的流量复制工具该模块目前只实现了两个配置指令,用法相称大略:
location / { mirror /mirror; proxy_pass}location /mirror { internal; proxy_pass http://test_backend$request_uri;}
每一条 mirror 配置项对运用户要求的一个副本,我们就可以通过配置多次 mirror 指令来实现 “流量 放大” 的效果。当然,你也可以将多个副本转发给不同的后端目标系统。
示例配置:
server { listen 8080; access_log /home/work/log/nginx/org.log; root html/org;}server { listen 8081; access_log /home/work/log/nginx/mir.log ; root html/mir;}upstream backend { server 127.0.0.1:8080;}upstream test_backend { server 127.0.0.1:8081;}server { listen 80; server_name localhost; # original 配置 location / { # mirror指定镜像uri为 /mirror mirror /mirror; # off|on 指定是否镜像要求body部分(开启为on,则要求自动缓存;) mirror_request_body off; # 指定上游server的地址 proxy_pass http://backend; } # mirror 配置 location /mirror { # 指定此location只能被“内部的”要求调用 internal; # 指定上游server的地址 proxy_pass http://test_backend$request_uri; # 设置镜像流量的头部 proxy_set_header X-Original-URI $request_uri; }}
流量放大, 配置两个 mirror 即可:
location / { mirror /mirror; mirror /mirror; proxy_pass http://backend;}
利用很方便,但是线上 nginx 一样平常都承载了不止一个业务,修正 nginx 配置后须要 nginx -s reload 来使之生效,这种操作在线上还是只管即便须要避免的。
3、TCPCopyTCPCopy 是一种要求复制(复制基于 TCP 的 packets)工具 ,通过复制在线数据包,修正 TCP/IP 头部信息,发送给测试做事器,达到欺骗测试做事器的TCP 程序的目的,从而为欺骗上层运用打下坚实根本。TCPCopy 由网易技能部的王斌在王波的事情根本上中 2010 年开拓,并于 2011 年 9 月开源。TTCPCopy 一样平常会与 TCPDump 共同利用。基于 C 措辞地址:https://github.com/session-replay-tools/tcpcopystars:3.9kTCPCopy 由两部分组成:TCPCopy 和 intercept。TCPCopy 在线上做事器上运行并捕获在线要求,intercept 运行在赞助做事器上并实行一些赞助事情,例如将相应信息通报给 TCPCopy。测试运用程序则在目标做事器上运行。也便是利用上实在还须要一个赞助做事器。
TCPCopy 的紧张上风:
协议无感知,可以透明转发,能够支持基于 TCP 的任意运用层协议,如 MySQL,Kafka,Redis 等实时转发,延时较低可以保留原始要求 IP 端口信息,测试做事器可用于统计同时,也具有以下不敷:
无法动态添加多个下贱做事器由于透明转发,不做协议解析,无法创造数据非常,如部分 TCP 包丢失,测试做事器将收到不完全的数据;此外,也无法对运用层数据进行筛选和修正进行修正核心组件设计时未进行多线程设计,处理能力存在瓶颈须要修正 iptables 来丢弃下贱做事的回包,用在生产或公共的测试环境存在较大风险4、GOReplayGoreplay 是用 Golang 写的一个 HTTP 实时流量复制工具。功能更强大,支持流量的放大、缩小,频率限定,还支持把要求记录到文件,方便回放和剖析,也支持和 ElasticSearch 集成,将流量存入 ES 进行实时剖析。GoReplay 不是代理,而是监听网络接口上的流量,不须要变动生产根本架构,而是在与做事相同的打算机上运行 GoReplay 守护程序。特点:大略易用地址:https://github.com/buger/goreplaystars:14.1k与 TCPCopy 比较它的架构更大略,只有一个 gor 组件,如下:
只须要在生产做事器上启动一个 gor 进程,它卖力所有的事情包括监听、过滤和转发。 它的设计遵照 Unix 设计哲学:统统都是由管道组成的,各种输入将数据复用为输出。
敲下命令,即可进行流量复制。无需理解繁芜的观点。同样支持在线直接转发。存储到文件进行重放,N 倍重放。
sudo ./gor --input-raw :8000 --output-http="http://localhost:8001"sudo ./gor --input-raw :8000 --output-file=requests.gor
比较 tcpcopy 只能复制 HTTP 和 HTTPS 的流量。 利用时编译很麻烦,一样平常直策应用编译好的版本。
一样平常合营 diffy 一起利用,diffy 供应 diff 能力,可以智能降噪音。
diffy 地址:https://github.com/twitter-archive/diffy5、TCPReplayTCPReplay 是一种 pcap 包的重放工具,它可以将用 ethreal、wireshark工具抓下来的包原样或经由任意修正后重放回去。它许可你对报文做任意的修正(紧张是指对2层、3层、4层报文头),指定重放报文的速率等,这样tcpreplay 就可以用来复现抓包的情景以定位 bug,以极快的速率重放从而实现压力测试。地址:https://github.com/appneta/tcpreplaystars:7656、JVM-SandboxJVM 沙箱容器,一种 JVM 的非侵入式运行期 AOP 办理方案须要代码的编写,可适用于一些比较定制化的场景阿里巴巴开源地址:https://github.com/alibaba/jvm-sandboxstars:4.3k整体架构图:
沙箱有两种启动办法:
利用jvm的attach机制,线上随时可进行attachjava agent启动,须要在命令行增加参数,故须要重启。流量复制的场景下基本便是选择 attach了。供应的脚本非常大略易用,直接在安装目录下敲入命令即可。
# 假设目标JVM进程号为'2343'./sandbox.sh -p 2343
其他的便是编写 AOP干系代码然后编译成 jar 包放入到安装目录。官网的例子非常详细,有兴趣可以理解理解。
7、SharinganSharingan(中文名:写轮眼)是一个基于 golang 的流量录制回放工具,录制线上真实要求流量进行回放测试,适宜项目重构、回归测试等。滴滴开源地址:https://github.com/didi/sharinganstars:656整体架构图:
recorder: 流量录制模块,录制流量本地文件存储、发送流量到录制agent等。recorder-agent:流量录制agent,单独进程启动,掌握录制比例、流量存储等。replayer: 流量回放模块,重定向连接到Mock Server、Mock韶光、添加流量标识等。replayer-agent:流量回放agent,单独进程启动,查询流量、查询/上报噪音、流量diff、批量回放、天生覆盖率报告等。8、RDebug支持 PHP,暂不支持 java滴滴开源地址:https://github.com/didi/rdebug/blob/master/README_zh_CN.mdstars:1.1k
整体架构图:
四、总结复制要求:通过将一台机器的要求复制多份发送到指定的压测机器适用场景:系统调用量比较小的场景优点:为了使得压测的要求跟真实的业务要求更加靠近,在压测要求的来源办法上,我们考试测验从真实的业务流量进行录制和回放,采取要求复制的办法来进行压力测试缺陷:同样也面临着处理写要求脏数据的问题,其余一个缺陷复制的要求必须要将相应拦截下来,以是被压测的这台机器须要单独供应,且不能供应正常的做事(不能把相应给到真实的用户了,比如涉及到发短信邮件之类的)
参考资料:
[1]:《性能测试实战30讲》[2]:Nginx 的实时流量复制模块[3]: Linux流量复制工具[4]:流量拷贝工具,你用过哪几个?[5]:流量复制工具[6]:字节跳动自研线上引流回放系统的架构演进[7]:流量复制方案比拟:Tcpcopy vs Goreplay[8]: 怎么真实仿照生产环境?什么是流量复制?用什么工具?