tcpcopy 是一個分佈式在線壓力測試工具,能夠將線上流量拷貝到測試機器,實時的模擬線上環境,達到在程序不上線的狀況下實時承擔線上流量的效果,儘早發現 bug,增長上線信心。html
tcpcopy 的優點在於其實時性及真實性,除了少許的丟包,徹底拷貝線上流量到測試機器,真實的模擬線上流量的變化規律。mysql
tcpcopy新版架構圖git
tcpcopy包含三部分:online server、assistant server、target servergithub
tcpcopy拷貝一次流量訪問的步驟以下sql
一、一個訪問請求到達線上內核後端機; 二、socket 包在 IP 層被拷貝了一份傳給tcpcopy 進程; 三、tcpcopy 修改包的目的及源地址,發給測試內核後端機; 四、拷貝的包到達測試內核後端機; 五、測試內核後端機的推薦內核處理訪問,並返回結果; 六、返回結果在 IP 層被截獲、丟棄,由 intercept 拷貝返回結果的 IP header 返回; 七、IP header 被髮送給線上內核後端機的 tcpcopy 進程。
角色 | 主機名 | mysql端口 |
online server | test00 | 3308(5.6) |
assistant server | offline01 | |
target server | offline02 | 3318(5.7) |
安裝依賴後端
# yum -y install libpcap-devel
intercept安裝安全
# git clone git://github.com/session-replay-tools/intercept.git # cd intercept # ./configure # make && make install
tcpcopy安裝服務器
# git clone git://github.com/session-replay-tools/tcpcopy.git # cd tcpcopy # ./configure # make && make install
# route add -net 10.0.0.8 netmask 255.255.252.0 gw 10.0.0.0
成功後能夠看到微信
# ss -an |head State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 0 127.0.0.1:199 *:* LISTEN 512 0 *:80 *:* ESTAB 0 0 192.168.0.230:80 10.10.10.1:62602 ESTAB 0 0 192.168.0.230:80 10.10.10.4:54595 ESTAB 0 0 192.168.0.230:80 10.10.10.3:53566 ESTAB 0 0 192.168.0.230:80 10.10.10.6:49260 ESTAB 0 0 192.168.0.230:80 10.10.10.8:57598 ESTAB 0 0 192.168.0.230:80 10.10.10.7:64454
# cd /usr/local/intercept/sbin/ # ./intercept -i bond1 -F 'tcp and src port 3318' -d
成功後能夠看到session
# ss -an |grep 36524 LISTEN 0 5 *:36524 *:* ESTAB 0 66 192.168.0.219:36524 192.168.0.8:49034 ESTAB 0 0 192.168.0.219:36524 192.168.0.8:49035 ESTAB 0 66 192.168.0.219:36524 192.168.0.8:49032 ESTAB 0 0 192.168.0.219:36524 192.168.0.8:49033
# cd /usr/local/tcpcopy/sbin/ # ./tcpcopy -x 3308-10.0.0.1:3318 -s 10.0.0.2 -c 10.0.0.8 -d
成功後能夠看到
#ss -an|grep 192.168.0.219 ESTAB 0 0 192.168.0.8:49034 192.168.0.219:36524 ESTAB 0 0 192.168.0.8:49035 192.168.0.219:36524 ESTAB 0 0 192.168.0.8:49032 192.168.0.219:36524 ESTAB 0 0 192.168.0.8:49033 192.168.0.219:36524
一、tcpcopy log日誌提示many connections cant established
把tcpcopy指定的-c 假裝客戶端ip換成和線上一致的,能夠ping通的網段就能夠
二、大多數雲環境設置了安全限制,一個網卡沒法綁定2個IP,因此online server則會拒絕發送複製包,在線上抓包就會顯示
# tcpdump -i eth0 -nn port 3306 and host 1.1.1.4 11:53:58.573735 IP 10.0.0.1.https > 10.0.0.2.37121: Flags [R.], seq 0, ack 2906947315, win 0, length 0 11:53:58.573774 IP 10.0.0.2.37121 > 10.0.0.1.http: Flags [.], ack 2906947314, win 1024, length 0 11:53:58.573812 IP 10.0.0.1.http > 10.0.0.2.37121: Flags [R], seq 2906947314, win 0, length 0
參考:
https://mfcheer.github.io/20170228-index.html
http://ju.outofmemory.cn/entry/106907
http://www.itts-union.com/2814.html
http://www.361way.com/tcpcopy-online-offline/3510.html
https://github.com/session-replay-tools/tcpcopy
爲了方便你們交流,本人開通了微信公衆號和QQ羣,QQ羣:291519319,喜歡技術的一塊兒來交流吧