我们把用户访问系统造成的数据传输定义为流量,那么在用户访问系统的过程中,我们可以把进入和流出的数据复制下来,进行保存,待后续使用,即离线模式,或者转发到一个新的服务器,立即使用,即在线模式。
性能测试中我们可以使用诸如 ab, wrk, httperf, locust, JMeter 等工具模拟用户请求,也可以使用流「流量复制」工具,实时捕捉生产环境流量并导向目标测试系统。同时,这些「流量复制」工具可以支持对真实流量进行放大或缩小。
于是有人说,就是因为这样才应该直接用真实流量的方式来做嘛,这样就不用管业务模型了,直接就有生产的业务模型了。没错,只要你能通过生产流量扩大回放的方式实现压力部分,确实可以不用考虑业务场景了。但这么做的前提也必须是你的生产流量来源是可以覆盖想要测试的业务场景的。
这里要批驳一个观点,就是有些人觉得只有通过生产流量回放的方式,才是真实地 模拟了线上的流量。事实上,这个观点是偏颇的。
总结一下,流量复制工具的优势就是可以将线上流量拷贝到测试机器,实时的模拟线上环境,真实的模拟线上流量的变化规律,达到在程序不上线的情况下实时承担线上流量的效果。
流量复制工具一般分成这几类:
基于web 服务器的请求复制 优点:请求多样化、成本缺点:不具备通用性、丢失 *** 延迟、占用在线资源比较严重基于应用层的流量复制工具 优点:实现简单缺点:但会挤占线上应用的资源(比如连接资源,内存资源等),还可能会因为耦合度高而影响正常业务。基于 *** 栈的流量复制工具,直接从链路层抓取数据包 优点:应用影响较小缺点:但是其实现也就相对复杂一些该模块目前只实现了两个配置指令,用法相当简单:
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 来使之生效,这种操作在线上还是尽量需要避免的。
TCPCopy 由两部分组成:TCPCopy 和 intercept。TCPCopy 在线上服务器上运行并捕获在线请求,intercept 运行在辅助服务器上并执行一些辅助工作,例如将响应信息传递给 TCPCopy。测试应用程序则在目标服务器上运行。也就是使用上其实还需要一个辅助服务器。
TCPCopy 的主要优势:
协议无感知,可以透明转发,能够支持基于 TCP 的任意应用层协议,如 MySQL,Kafka,Redis 等实时转发,延时较低可以保留原始请求 IP 端口信息,测试服务器可用于统计同时,也具有以下不足:
无法动态添加多个下游服务器由于透明转发,不做协议解析,无法发现数据异常,如部分 TCP 包丢失,测试服务器将收到不完整的数据;此外,也无法对应用层数据进行筛选和修改进行修改核心组件设计时未进行多线程设计,处理能力存在瓶颈需要修改 iptables 来丢弃下游服务的回包,用在生产或公共的测试环境存在较大风险与 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/diffy整体架构图:
沙箱有两种启动方式:
使用jvm的attach机制,线上随时可进行attachjava agent启动,需要在命令行增加参数,故需要重启。流量复制的场景下基本就是选择 attach了。提供的脚本非常简单易用,直接在安装目录下敲入命令即可。
# 假设目标JVM进程号为'2343' ./sandbox.sh -p 2343
其他的就是编写 AOP相关代码然后编译成 jar 包放入到安装目录。官网的例子非常详细,有兴趣可以了解了解。
整体架构图:
recorder: 流量录制模块,录制流量本地文件存储、发送流量到录制agent等。recorder-agent:流量录制agent,单独进程启动,控制录制比例、流量存储等。replayer: 流量回放模块,重定向连接到Mock Server、Mock时间、添加流量标识等。replayer-agent:流量回放agent,单独进程启动,查询流量、查询/上报噪音、流量diff、批量回放、生成覆盖率报告等。整体架构图:
www.gj *** g.com
Atlas VPN的新研究显示,全球76%的公司在过去一年中遭遇过服务停机。原因包括系统崩溃、人为错误和网络攻击是造成停机的主要原因。此外,许多IT经理对越来越多的政治驱动的网络攻击感到担忧。 系统崩溃被认为是公司停机的首要原因,52%的人不得不处理这个问题。42.3%的IT经理认为人为错误是导致公...
根据医疗网络安全公司Cynerio的一份新报告,医院中使用的互联网连接设备有一半以上存在漏洞,可能会危及病人安全、机密数据或设备的可用性。 该报告分析了全球300多家医院和医疗机构的1000多万台设备的数据,该公司通过连接到设备上的连接器收集这些数据,作为其安全平台的一部分。 医院里最常见的互联网...
考虑到有那么多受恶意软件感染的程序溜进Play Store,人们开始觉得Google在警告人们侧载应用程序的危险时是在浪费口水。在发现一些伪装成杀毒应用的窃取登录凭证恶意软件后,它们中间的六个被发现并删除。 Check Point安全研究人员说,Google从其商店中删除这六个应用程序之前,它们已...
在遭遇勒索软件攻击之后,不少企业因为无法等待数据恢复、想要尽快恢复业务,选择向黑客支付赎金,那么在支付赎金之后是否就意味着不再成为黑客的勒索目标了吗?一份最新报告显示,几乎一半的受害者会再次成为同一黑客的目标。 根据市场调查机构 Censuswide 公布的最新数据,大约 80% 选择支付赎金的组...
近日,安全专家在 M1 芯片中发现了名为“M1RACLES”漏洞,是存在芯片组设计中的一个错误。该错误允许任意两款应用程序绕过常规系统功能秘密交换数据,如果不对芯片进行修复,这个漏洞是无法修复的。不过发现这个漏洞的人–逆向工程师和开发人员 Hector Martin 表示,Mac 用户并不需要担心这...
与竞争对手 Intel 相比,AMD 处理器在安全性方面表现得相对出色。但在偶尔的情况下,研究人员还是会发现一些容易被利用的新攻击。TechPowerUp 指出,在即将于 5 月 27 日举办的第 15 届 IEEE WOOT’21 技术研讨会上,将有两篇专门针对 AMD 安全加密虚拟化(SEV)漏...