參考資料:
https://www.jianshu.com/p/e34086c47493
https://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html
https://www.cnblogs.com/phennry/p/6382755.html?utm_source=itdadao&utm_medium=referral
在服務迭代的過程中經常會對部分邏輯進行修改。為了服務正確性,避免上線后才發現錯誤,需要用線上真實流量來對新的服務進行測試。因此需要一種對線上服務影響盡可能小的工具來對流量進行拷貝。
常用的幾種流量拷貝工具:
goreplay: https://github.com/buger/goreplay
tcpreplay: https://github.com/appneta/tcpreplay
tcpcopy: https://github.com/session-replay-tools/tcpcopy
選擇tcpcopy的原因:支持TCP包復制、免費(goreplay的pro版支持tcp,每年980刀)、開源項目維護好
tcpcopy架構圖
tcpcopy拷貝一次流量訪問的步驟如下:
- 一個客戶請求到達線上機器;
- 拷貝IP層(或者數據鏈路層)的包到tcpcopy進程;
- tcpcopy修改包的目的及源地址,發給目標測試機;
- 拷貝的包到達目標測試機;
- 目標測試機的應用處理訪問,並返回結果給輔助機;
- 返回結果在輔助機的數據鏈路層被截獲,drop響應的body,copy返回的ip header;
- 輔助機將響應header發送給線上機器的tcpcopy進程。
eg:
測試服務器IP:10.1.2.3
輔助服務器IP:10.1.2.4
線上服務器IP:9.9.8.7
安裝
1、線上服務器安裝tcpcopy
在線上服務器上下載,然后編譯安裝tcpcopy的包,如下:
# wget https://github.com/session-replay-tools/tcpcopy/archive/1.0.0.tar.gz
# tar xvf 1.0.0.tar.gz
# cd tcpcopy-1.0.0
# ./configure --prefix=/opt/tcpcopy/
# make
# make install
2、輔助服務器安裝intercept
安裝intercept有一些額外的依賴需要安裝上,然后和tcpcopy一樣的套路源碼編譯安裝。
# yum -y install libpcap-devel
# wget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz
# tar xvf 1.0.0.tar.gz
# cd intercept-1.0.0
# ./configure --prefix=/opt/tcpcopy/
# make
# make install
注:也可以先編譯,再把/opt/tcpcopy/傳到指定服務器
實時復制流量
1、測試服務器(10.1.2.3)配置路由 ,將響應包路由到輔助機
route add -net 10.1.2.0 netmask 255.255.255.192 gw 10.1.2.4
gw對應輔助服務器ip
2、輔助服務器(10.1.2.4)捕獲目標機器發來的響應包
./intercept -F
eg
/opt/tcpcopy/sbin/intercept -i eth1 -F tcp and src port 18001 -d
捕獲網卡 eth1 ,源端口18001 基於tcp的包
3、線上服務器(9.9.8.7)捕獲包,並修改客戶端地址,並把包發送給目標機器,等待輔助服務器發送響應包
./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,> [-c <ip range,>]
例子:
/opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -n 2 -d -c 10.1.2.x
/opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -c 10.1.2.x -d #全流量復制
/opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -c 10.1.2.x -r 20 -d #復制20%的流量
/opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -c 10.1.2.x -n 2 -d #復制2倍流量
線上服務器和測試服務器啟動服務:
python -m SimpleHTTPServer 18001
找台機器執行,假設ip為100.10.10.10:
curl 9.9.8.7:18001
后,線上服務器日志
100.10.10.10 - - [07/May/2020 19:37:27] "GET / HTTP/1.1" 200 -
測試服務器日志
10.1.2.1 - - [07/May/2020 19:37:18] "GET / HTTP/1.1" 200 -
可能存在的問題:
Q&A
Q: 測試機收不到請求,輔助服務器打印 [notice] fd is null after session is created
A: 在線上服務器啟動時,-c參數用-c 192.18.1.x
即 /opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -n 2 -d -c 10.1.2.3.x