對於流量回放這個詞,很多同學並不陌生,但絕大多數公司因種種原因並沒有進行實踐,最現實的原因是由於做全鏈路的流量回放有大量的寫操作,必然要涉及到系統改造,數據加工脫敏等,技術難度和風險相對較高,並非每一家公司都如阿里巴巴一樣具備大流量的應用場景,在系統改造不徹底的情況下,存在投入產出失衡的現象,這不僅是技術的問題,也需要文化的支持,從個人角度而言我們依然可以進行一些模擬,這次我總結了以goreplay工具的輕量級流量回放使用方法。
首先簡單描述下goreplay工作流:
我們什么情況下可以用gorepaly去驗證呢?
1.在預發布環境需要真實流量做功能的回歸與驗證;
2.驗證網絡帶寬流量閾值
3.真實線上流量對比驗證
如何去驗證?
提供源碼下載包,注意 :使用goreplay均在root權限或者使用sudo執行;
https://pan.baidu.com/s/1cfBnfbLaQntak4SMD8YPKw 密碼:jcfl
1.下載完解壓縮
tar xvf gor_1.0-RC2_x64.tar.gz
2.捕捉流量並通過終端輸出
sudo ./goreplay --input-raw :8003 --output-stdout
上述命令將監控8003端口上所有的流量,並通過終端stdout輸出。你可以通過瀏覽器或者curl訪問8003端口,然后在終端查看gor輸出所有的http請求。
3.捕捉流量並實時同步到另一台機器
sudo ./goreplay --input-raw :8003 --output-http="http://example:8005"
上述命令將8003端口的流量實時同步訪問http://example:8005服務器,你在訪問第一台服務器時,將看到流量以相同的順序請求到第二台.
4.將捕捉流量保存到文件中,然后釋放到其它機器,建議實戰的時候使用該模式
有時候實時同步流量是很難做到的, 所以Goreplay提供了這種先保存后釋放的模式:
第一步, 通過--output-file保存流量:
sudo ./goreplay --input-raw :8003 --output-file=requests.gor
上述命令將8003端口的流量,保存到requests.gor文件中(必須是.gor后綴,其它后綴經測釋放時有問題)。
我們打開錄制完成的gor文件發現,它保存了我們所有的請求內容(如下圖):
第二步,如上圖保存的流量,我們可以原來的方式執行釋放:
./goreplay --input-file requests.gor --output-http="http://localhost:8005"
上述命令將釋放所有保存在requests.gor中的請求通過相同的時間順序釋放到服務器http://localhost:8005。
附上常用的參數解釋:
--input-raw #用來捕捉http流量,需要指定ip地址和端口
--input-file #接收通過--output-file保存流量的文件
--input-tcp #將多個 Goreplay 實例獲取的流量聚集到一個 Goreplay 實例
--output-stdout #終端輸出
--output-tcp #將獲取的流量轉移至另外的 Goreplay 實例
--output-http #流量釋放的對象server,需要指定ip地址和端口 --output-file #錄制流量時指定的存儲文件
Goreplay的限速加速機制和請求過濾
無論是限速或者加速都具有現實意義,也是流量回放的亮點之一:
1.限速機制:
由於生產服務器配置一般遠高於測試服務器配置,所以直接將生產服務器全部流量同步到測試服務器是不可行的,goreplay提供了兩種策略:
限制每秒的請求數
sudo ./goreplay --input-tcp :888 --output-http "http://staging.com|20"# (每秒請求數限制20個以內)
sudo ./goreplay --input-raw :80 --output-tcp "replay.local:888|20%" # (每秒請求數限制20%以內)
基於Header或Url的參數限制一些請求,為指定的header或者url的請求設定限制的百分比。
sudo ./goreplay --input-raw :80 --output-tcp "replay.local:888|20%" --http-header-limiter "X-API-KEY: 20%"
sudo ./goreplay --input-raw :80 --output-tcp "replay.local:888|20%" --http-param-limiter "api_key: 20%"
2.可以限制一些流量,我們就可以進行流量翻倍,也就是我剛剛提到的流量加速:
./gor --input-file '696_0.gor|1000%' --input-file-loop --output-http 'http://www.xxx.com' --output-http-workers 10 --stats --output-http-stats
1000%等於翻了10倍,workers代表消費的進程數,流量翻倍建議梯度緩慢增加,防止造成應用直接宕機的情況;
3.請求過濾:
當你需要捕捉指定路徑的請求流量時,可以使用該機制, 如只同步/api路徑下的請求
sudo ./goreplay --input-raw :8080 --output-http staging.com --http-allow-url /api
這樣的方法可以對單請求進行壓測,也是非常實用
另外還有其它一些參數用法:
--http-disallow-url #不允許正則匹配的Url
--http-allow-header #允許的 Header 頭
--http-disallow-header #不允許的 Header 頭
--http-allow-method #允許的請求方法,傳入值為GET, POST, OPTION
執行結果查看:
./gor --input-file '696_0.gor|1000%' --input-file-loop --output-http 'http://www.cctester.com' --output-http-workers 10 --stats --output-http-stats
執行結果的查看,在很多文檔中,並沒有對執行結果有詳盡的闡述,但結果的查看對性能測試具有最直接的意義,性能測試人員一般會從客戶端工直接獲取結果,不過相對成熟的互聯網公司一般不會局限於此,我們有更多的服務端工具進行統計,很多公司會自己去研發,也有付費的工具如聽雲等,goreplay提供的結果相對簡單(如下圖),最后一列為取樣數,倒數第二列為取樣/時間,可以理解為我們常見的qps;