1?概述
? ? ? tcpcopy是一種請求復(fù)制(所有基于tcp的packets)工具,可以把在線流量導(dǎo)入到測試系統(tǒng)中去(也可以在測試系統(tǒng)內(nèi)部放大流量),從而模擬真實運行環(huán)境,以便排查測試系統(tǒng)的性能問題和風(fēng)險。TCPCopy的優(yōu)勢在于其實時性及真實性,除了少量的丟包,可以完全拷貝線上流量到測試機器,真實的模擬線上流量的變化規(guī)律。
? ? ? 在tcpcopy 1.0版本中對整個架構(gòu)進(jìn)行了改進(jìn),將原本低版本tcpcopy需要運行在測試機上的intercept移除放到一個獨立的輔助機上來,使得測試機需要做的操作少到僅僅是添加一條路由而已,對整個測試機的性能損耗可以忽略,排除了intercept運行在測試機上時產(chǎn)生的性能影響,使得測試數(shù)據(jù)更加接近真實水平。

2?下載
下載tcpcopy及intercept:
https://github.com/wangbin579/tcpcopy
https://github.com/session-replay-tools/intercept
3?在線流量復(fù)制配置方法
說明:
假定我們現(xiàn)在有3臺機器:
線上服務(wù)器:172.16.1.23
輔助服務(wù)器:172.16.1.24
測試服務(wù)器:172.16.1.25
若我們現(xiàn)在想將線上服務(wù)器172.16.1.23 80端口的流量導(dǎo)入到測試服務(wù)器172.16.1.25,我們需要按照下述流程進(jìn)行操作。
3.1?線上服務(wù)器(流量源)部署tcpcopy
解壓并安裝:
#tar xf tcpcopy-1.0.0.tar.gz
#cd tcpcopy
#./configure
#make && make install
執(zhí)行下述命令若能顯示版本號則表示安裝成功:
#/usr/local/tcpcopy/sbin/tcpcopy -v
tcpcopy version:1.0.0
啟動腳本范例:
#/usr/local/tcpcopy/sbin/tcpcopy -x 80-172.16.1.25:80 -s 172.16.1.24 -c 172.16.100.x -d -C 4 -l /var/log/tcpcopy.log
說明:
將80端口收到的流量復(fù)制到測試機ip 172.16.1.25的80端口,并設(shè)置輔助機的ip地址為172.16.1.24,且將復(fù)制過去的流量中的源地址統(tǒng)一更改為172.16.100.x,這樣做的好處是我們在測試機上可以直接針對整個更改后的網(wǎng)段設(shè)置一條路由即可。
3.2?輔助服務(wù)器(截獲返回數(shù)據(jù))部署intercept
解壓并安裝:
#tar xf intercept-1.0.0.tar.gz
#cd intercept
#./configure
#make && make install
執(zhí)行下述命令若能顯示版本號則表示安裝成功:
#/usr/local/intercept/sbin/intercept -v
intercept version:1.0.0
啟動腳本范例:
#/usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 80' -d
說明:
輔助機的 intercept 通過-F 參數(shù)制定捕獲規(guī)則,捕獲tcp連接中源端口為80的所有數(shù)據(jù),也即是測試機的回應(yīng)數(shù)據(jù)。其作用是將測試機路由過來的響應(yīng)數(shù)據(jù)捕獲下來,完成整個請求回應(yīng)的流程且保證測試機產(chǎn)生的回應(yīng)數(shù)據(jù)不會流向線上環(huán)境。
intercept 會監(jiān)聽 tcp 36524 端口,并和線上機172.16.1.23的 tcpcopy 之間建立通信,我們通過ss命令可以觀察到。
需要注意的是輔助機和測試機一定要是同一網(wǎng)段
3.3?測試服務(wù)器(需要導(dǎo)流的目標(biāo)機器)配置路由
添加路由配置范例:
route add -net 172.16.100.0 netmask 255.255.255.0 gw 172.16.1.24
說明:
線上機tcpcopy復(fù)制流量時將源地址改寫為172.16.100網(wǎng)段的地址,那么在測試機上看到的流量中源地址全部是來源于這個網(wǎng)段,
我們僅僅需要將返回給這個網(wǎng)段的所有客戶端的請求全部通過輔助機 172.16.1.24 路由出去,這樣在輔助機上就可以對全部的回應(yīng)包進(jìn)行截獲處理了。
4?離線回放部署及配置方法
說明:
整體操作流程也是與在線流量copy一樣的,唯一的區(qū)別是不再是復(fù)制在線的即時流量,而是事先將在線流量錄制為pcap離線文件然后進(jìn)行回放。
注:因為線上不同時間段的用戶量不一樣,用戶行為也是隨時變化的,多次復(fù)制的線上流量肯定是會有所差異的,這樣對服務(wù)器產(chǎn)生的壓力也不一樣。所以在做對比性的測試時推薦使用離線回放的方式,以確保每次測試時的請求及對服務(wù)器產(chǎn)生的壓力是一致的。
4.1?安裝并配置支持離線模式的tcpcopy
網(wǎng)上介紹0.98版本以上的tcpcopy才支持離線回放模式,保險起見推薦下載1.0.0最新版的tcpcopytcpcopy。
需要在configure時加上--offline參數(shù)才能支持離線回放(可執(zhí)行configure --help查看幫助信息)
依次執(zhí)行:
./configure --offline
make&make install
4.2?使用tcpdump錄制pcap離線文件
tcpdump -i eth0 -w online.pcap tcp and port 54322 ???#錄制54322端口的tcp請求,保存到online.pcap文件
參數(shù)說明:
-i eth0:eth0為網(wǎng)卡,獲取方式可在liunx系統(tǒng)下執(zhí)行ifconfig查看所有的網(wǎng)卡,選取需要的那個。
-w online.pcap:保存所錄制請求的pcap文件,以便后續(xù)進(jìn)行回放??稍O(shè)置路徑,e.g.-w /home/user/test.pcaptcp and port 80:截獲端口為80的tcp請求,也可添加udp請求,和更改服務(wù)端口80,e.g. tcp and port 16001
-s 0:默認(rèn)的話,tcpdump只顯示部分?jǐn)?shù)據(jù)包,-s snaplen是控制包長度的,默認(rèn)是68字節(jié),-s 0 則為全部字節(jié),在使用過程中,如果添加-s則回放時會出現(xiàn)錯誤??刹皇褂迷搮?shù)
4.3tcpcopy、intercept、路由配置
假設(shè)有3臺機器:
測試機(被測應(yīng)用所部署的服務(wù)器):10.1.2.196 172.16.1.25
輔助機(三次握手回包):10.1.2.203? 172.16.1.24
流量回放機(回放pcap離線文件):10.1.2.195? 172.16.1.23
輔助機執(zhí)行intercept(捕獲tcp連接中源端口為54322的所有數(shù)據(jù)):
/usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 54322' -d
流量回放機執(zhí)行tcpcopy(將流量復(fù)制到測試機的54322端口,指定事先錄制好的online.pcap文件):
/usr/local/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 54322-172.16.1.25:54322 -s 172.16.1.24 -c 172.16.1.x -i ./online.pcap
測試機配置路由(將返回給172.16.1網(wǎng)段的所有客戶端的請求通過輔助機路由出去,以便輔助機對回包截獲處理):
route add -net 172.16.1.0 netmask 255.255.255.0 gw 172.16.1.24
回放流量時可以通過 tcpdump -n port 54322的方式抓包測試,亦可觀察測試服務(wù)的日志確認(rèn)是否有請求進(jìn)來,至此流量回放完成。
4.4簡化配置及操作方法
以上操作使用的是傳統(tǒng)的部署模式,需要占用3臺機器。若測試機不足時,也可以簡化部署,將intercept直接部署在測試機上(可以省去配置route的操作),如:
測試機執(zhí)行intercept:
/usr/local/intercept/sbin/intercept -i eth1 -l /var/log/intercept.log -F 'tcp and src port 54322' -d
流量回放機執(zhí)行tcpcopy(需要通過-c參數(shù)將訪問測試機的客戶端ip地址改寫為不存在或無法訪問的地址,總之不能讓響應(yīng)包回到真正的客戶端,否則會干擾測試的進(jìn)行):
/usr/local/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 54322-172.16.1.25:54322 -s 172.16.1.25 -c 172.16.88.88 -i ./online.pcap
補充說明
開啟tcpcopy或intercept后最好ps一下相關(guān)進(jìn)程,以便確認(rèn)啟動成功。若未啟動成功可以查看/var/log/tcpcopy.log(通過啟動參數(shù)l自行指定)中的報錯詳情。
若要關(guān)閉服務(wù),則直接kill掉tcpcopy或intercept中的一個進(jìn)程即可,kill掉其中一個進(jìn)程另一個進(jìn)程會自動終止。
常見錯誤解決
1.執(zhí)行./configure時報錯:checking for pcap.h … not found
解決辦法:yum install libpcap libpcap-devel(需要用到pcap庫頭文件)
2.運行TCPCopy命令時日志報錯:[error] Can not connect to remote server(10.16.6.62:36524) (Connection refused)
解決辦法:首先看看intercept是否已啟動。如果已啟動成功,看看是否輔助服務(wù)器的36524端口不能訪問到,沒有開通這個端口的權(quán)限。在iptable中加上對這個端口的訪問(在運行TCPCOPY程序時,會去連輔助機的這個端口,這個端口是由intercept程序監(jiān)聽)
參考資料
https://github.com/wangbin579/tcpcopy