Nginx 的实时流量复制模块

3,933 阅读2分钟
原文链接: ialloc.org

流量复制工具

It can be used to increase confidence in code deployments, configuration changes and infrastrucure changes.

—Goreplay Project

在服务程序开发流程里,性能测试是很重要的一个环节。通过这个环节可以掌握服务程序的响应时间、并发数、吞 吐量等等性能指标,从而可预估系统的服务质量、可承载用户和需要的硬件资源等等。

我们可以使用诸如 ab, wrk, httperf, locust, JMeter 等工具模拟用户请求,但是这些模拟请求不 足以还原真实场景,同时它们的请求模式也过于单一和理想化。

为了更贴近真实场景,我们可以使用诸如 httperf, vanishreplay, tcpreplay, log-replay 等「离线 回放」工具重放生产环境请求日志,也可以使用 goreplaytcpcopy 等「流量复制」工具,实时捕捉生产环境 流量并导向目标测试系统。同时,这些「流量复制」工具甚至可以对真实流量进行放大或缩小。

流量复制工具一般分成两类:基于应用层的流量复制工具和基于网络栈的流量复制工具。前者实现简单,但会挤 占线上应用的资源(比如连接资源,内存资源等),还可能会因为耦合度高而影响正常业务。而基于网络栈的流 量复制工具,直接从链路层抓取数据包,对应用影响较小,但是其实现也就相对复杂一些。

我们本篇要分析的模块 ngx_http_mirror_module 在 Nginx 1.13.4 中引入,它是一种应用层的流量复制 工具。该模块 [1] 目前只实现了两个配置指令,用法相当简单:

location / {
    mirror /mirror;
    proxy_pass
}

location /mirror {
    internal;
    proxy_pass http://test_backend$request_uri;
}

每一条 mirror 配置项对应用户请求的一个副本,我们就可以通过配置多次 mirror 指令来实现 “流量 放大” 的效果。当然,你也可以将多个副本转发给不同的后端目标系统。

接下来,我们从源代码角度分析一下该模块是如何实现的,以及它可能存在有哪些问题。