本文內容是整理自 王斌的博客(http://blog.csdn.net/wangbin579)和鄭鈞的博客(http://www.cnblogs.com/zhengyun_ustc),以便讓自己可以有個宏觀的認識。
Tcpcopy是一個分布式在線壓力測試工具,可以將線上流量拷貝到測試機器,實時的模擬線上環境,達到在程序不上線的情況下實時承擔線上流量的效果,盡早發現bug,增加上線信心。
Tcpcopy是由網易技術部王斌(http://weibo.com/tcpcopy)在王波的工作基礎上開發的,2011年9月開源的項目(https://github.com/session-replay-tools/tcpcopy https://github.com/wangbin579/tcpcopy ),目前最新版本 1.0.0 ,后續相關內容都是基於 1.0.0 的。
tcpcopy的工作原理
TCPCopy 是一種請求復制(復制基於 TCP 的 packets)工具 ,通過復制在線數據包,修改 TCP/IP 頭部信息,發送給測試服務器,達到欺騙測試服務器的TCP 程序的目的,從而為欺騙上層應用打下堅實基礎。
tcpcopy 不是基於應用層的復制,而是基於底層數據包的請求復制,這么做的好處是:可以做到無需穿透整個協議棧,路程最短的,可以從數據鏈路層抓請求包,從數據鏈路層發包,路程一般的,可以在IP層抓請求包,從IP層發出去,不管怎么走,只要不走TCP,對在線的影響就會小得多。
七層網絡模型如下圖:
tcpcopy 經歷了三次架構調整,參考:http://blog.csdn.net/wangbin579/article/details/8949315
這三次架構的基本原理都一樣,本質是利用在線數據包信息,模擬tcp客戶端協議棧,欺騙測試服務器的上層應用服務。由於tcp交互是相互的,一般情況下需要知道測試服務器的響應數據包信息,才能利用在線請求數據包,構造出適合測試服務器的請求數據包,因此只要基於數據包的方式,無論怎么實現(除非是tcp協議改的面目全非),都需要返回響應包的相關信息。
三種架構的差別就在於在什么地方截獲響應包。
具體這三種架構的差別請看上面文章,簡單差別如下:
- 方案一:tcpcopy是從數據鏈路層(pcap接口)抓請求數據包,發包是從IP層發出去
- 方案二:tcpcopy默認從IP層抓包,從IP層發包
- 方案三:跟方案一一樣,不過引入了獨立的 intercept(assistant server)
后面的內容我們以第三套方案來展開。
tcpcopy 架構
tcpcopy運行需要intercept的支持,tcpcopy負責抓包和發包工作,而intercept負責截獲應答包
它的數據流轉和部署架構如下圖:
tcpcopy代碼下載地址:
git clone http://github.com/session-replay-tools/tcpcopy
configure:
./configure (默認raw socket方式抓包)
或者
./configure --pcap-capture (pcap方式抓包,在某些場景下,丟包率會高於raw socket方式抓包,這時候需要類似pf_ring的支持)
對於intercept:
代碼下載地址:
git clone http://github.com/session-replay-tools/intercept
configure方式:
./configure
參考: http://blog.csdn.net/wangbin579/article/details/8950282
具體的生產環境和鏡像環境數據傳遞流程圖如下:
- TCPcopy 從數據鏈路層 copy 端口請求,然后更改目的 ip 和目的端口。
- 將修改過的數據包傳送給數據鏈路層,並且保持 tcp 連接請求。
- 通過數據鏈路層從 online server 發送到 test server。
- 在數據鏈路層解封裝后到達 nginx 響應的服務端口。
- 等用戶請求的數據返回結果后,回包走數據鏈路層。
- 通過數據鏈路層將返回的結果從 test server 發送到 assistant server。注:test server 只有一條默認路由指向 assistant server。
- 數據到達 assistant server 后被 intercept 進程截獲。
- 過濾相關信息將請求狀態發送給 online server 的 tcpcopy,關閉 tcp 連接。
最新的1.0版本如何使用離線模式
https://github.com/session-replay-tools/tcpcopy/issues/215
對於tcpcopy,configure的時候加上--offline
--offline replay TCP streams from the pcap file
執行的時候,加上-i參數,用來指定pcap文件地址
對於intercept,不用變化
參考資料:
真刀真槍壓測:基於TCPCopy的仿真壓測方案
http://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html
如何利用pcap接口從數據鏈路層發包?
http://blog.csdn.net/wangbin579/article/details/10148247
利用tcpcopy引流做模擬在線測試
http://www.searchtb.com/2012/05/using-tcpcopy-to-simulate-traffic.html