nginx ngx_http_mirror_module 流量复制阻塞问题
使用 ngx_http_mirror_module 进行流量复制的时候遇到一个问题,请教各位大佬
问题背景
准备在不影响生产环境的情况下将生产入口流量复制一份到测试环境,做测试验证工作;
问题描述
当测试环境的服务器响应缓慢或者停掉的时候,会阻塞生产的请求响应,这个是绝对不能接受的。
nginx 配置
如下图所示,安装nginx后只添加了 mirror 复制配置,其他均未作调整
- 192.168.132.8 部署nginx,master(模拟生产服务器)服务节点
- 192.168.132.1 部署mirror(模拟测试服务器)服务节点
listen 80;
server_name 192.168.132.8;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
mirror /mirror;
proxy_pass http://192.168.132.8:8080;
}
location = /mirror {
internal;
proxy_pass http://192.168.132.1:8090/$request_uri;
proxy_set_header X-Original-URI $request_uri;
}
测试结果
场景 | TPS |
---|---|
直连 master | 4532 |
通过 nginx 访问 master | 2567 |
通过 nginx 访问 master 并复制流量到 mirror | 675 |
通过 nginx 访问 master 并复制流量到 mirror (mirror throw exception) | 883 |
通过 nginx 访问 master 并复制流量到 mirror (mirror sleep 10s 后返回) | 9.7 |
通过 nginx 访问 master 并复制流量到 mirror (mirror 停机) | 阻塞 |
期望效果
- 复制流量到测试环境完全不影响生产环境的使用,(无论测试环境是否停机,抛出异常,或是阻塞,都不影响生产环境的使用)
- 添加nginx代理进行流量复制后,性能下降控制在可接收范围内(TPS 从 2567 直接降到 675 确实降低太多)
邀请回答


共1个回答
没办法完全不受影响的,因为mirror是子请求,当子请求未结束时,主请求消耗的内存至少是无法释放的。你可以尝试在/mirror里,把超时时间大幅度调低,包括connect/read/send,再压下看看。