輕量級流量複製實踐

對於流量回放這個詞,很多同學並不陌生,但絕大多數公司因種種原因並沒有進行實踐,最現實的原因是由於做全鏈路的流量回放有大量的寫操作,必然要涉及到系統改造,數據加工脫敏等,技術難度和風險相對較高,並非每一家公司都如阿里巴巴一樣具備大流量的應用場景,在系統改造不徹底的情況下,存在投入產出失衡的現象,這不僅是技術的問題,也需要文化的支持,從個人角度而言我們依然可以進行一些模擬,這次我總結了以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;

輕量級流量複製實踐



分享到:


相關文章: