詳解Linux系統流量複製--gor、tcpcopy、nginx模塊流量複製等

Nginx Linux HTML Wget ElasticSearch 波波說運維 2019-06-10

概述

對於一些有併發要求的業務,特別是對接外部流量時,產品上線前一定要做的就是壓力測試,但是常規的壓力測試並不能覆蓋所有情況。以gemeter、ab,、webbench、http_load為例,這些通過模擬請求的壓測工具,只能發送特定的參數,對於一些參數異常導致的程序處理異常是無法考慮到的,所以就需要一款能複製真實流量,並且不影響線上業務的工具。

流量複製工具有很多,例如Gor、tcpreplay、tcpcopy等,這些工具貼合真實場景,能模擬真實流量,並支持流量的放大或縮小,更容易測試出程序的瓶頸和潛在問題。

幾款流量複製工具:

  • gor: https://github.com/buger/goreplay
  • tcpreplay: https://github.com/appneta/tcpreplay
  • tcpcopy: https://github.com/session-replay-tools/tcpcopy
詳解Linux系統流量複製--gor、tcpcopy、nginx模塊流量複製等

  • Nginx模塊ngx_http_mirror_module,在Nginx 1.13.4中開始引入

下面重點介紹nginx模塊ngx_http_mirror_module和gor。


流量複製--Nginx模塊ngx_http_mirror_module

詳解Linux系統流量複製--gor、tcpcopy、nginx模塊流量複製等

參考配置

配置如下:

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;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
mirror /mirror;
proxy_pass http://backend;
}
location /mirror {
internal;
proxy_pass http://test_backend$request_uri;
}
}

流量放大,配置兩個mirror即可

location / {
mirror /mirror;
mirror /mirror;
proxy_pass http://backend;
}

使用是很方便,但是線上nginx一般都承載了不止一個業務,修改nginx配置後需要nginx -s reload來使之生效,這種操作在線上還是儘量需要避免的。


流量複製--gor

Gor 是用 Golang 寫的一個 HTTP 實時流量複製工具。功能更強大,支持流量的放大、縮小,頻率限制,還支持把請求記錄到文件,方便回放和分析,也支持和 ElasticSearch 集成,將流量存入 ES 進行實時分析。

詳解Linux系統流量複製--gor、tcpcopy、nginx模塊流量複製等

1、下載安裝

只需要下載安裝,也可以下載編譯好的二進制文件直接使用

#wget https://github.com/buger/goreplay/releases/download/v0.16.1/gor_0.16.1_x64.tar.gz
#tar xzvf gor_0.16.1_x64.tar.gz

2、流量複製

gor也可以將流量複製到文件,然後再對他們進行回放。回放的時候,流量會維持原始的時間間隔。如果使用了百分比來進行速率限制,那麼回放的速率會相應的增加或減少。有了這種速率限制,gor就可以用來進行壓力測試。

#write to file
gor --input-raw :80 --output-file requests_origin.gor
#read from file
gor --input-file requests_origin.gor --output-http "http://localhost:8081"

3、流量回放

目前,這種方式只支持"input-file",而且只能用百分比去控制回放速率。請注意,這個回放的速率比例是相對於input的。即按照錄下來的流量的時間戳去進行回放。

#以2倍速率回放
gor --input-file "requests_origin.gor|200%" --output-http "http://localhost:8081"
如果“input-flie”是多個文件,可以用正則去匹配,
gor --input-file "requests_origin*.gor|200%" --output-http "http://localhost:8081"

配合如下配置參數,可以更好進行壓力測試

--input-file-loop 重複循環執行input-file
--exit-after 30s 在30s後停止,可以控制壓力測試的時間。分鐘的單位是m

4、Gor常用命令

簡單的HTTP流量複製

> gor --input-raw :80 --output-http "http://localhost:8081"

HTTP流量複製頻率控制(獲取每秒超過10個請求)

> gor --input-tcp :28020 --output-http "http://localhost:8081|10"

HTTP流量複製縮小

> gor --input-raw :80 --output-tcp "http://localhost:8081|10%"

HTTP流量記錄到本地文件

> gor --input-raw :80 --output-file requests_origin.gor

HTTP流量回放和壓測

> gor --input-file "requests_origin.gor|200%" --output-http "http://localhost:8081"

HTTP流量過濾複製

> gor --input-raw :8080 --output-http http://localhost:8081 --output-http-url-regexp ^www

如果大家想將生產環境的流量複製到測試環境或者其他環境,這兩個方式還是不錯的,tcpcopy相對比較麻煩,首推gor,不過gor不支持windows環境(反正我還沒測通)。後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~

詳解Linux系統流量複製--gor、tcpcopy、nginx模塊流量複製等

相關推薦

推薦中...