tcpcopy複製線上流量

2022-05-22 14:27:05 字數 3776 閱讀 1667

簡介

tcpcopy 是乙個 tcp 流量的實時複製工具,其1.0版本由網易工程師 @tcpcopy 開發和維護。一般用來將生產環境的線上流量實時複製到測試環境進行測試。例如新系統上線前,如果我們希望進行一些基本的壓力測試,那麼我們可以直接利用 tcpcopy 來複製線上的流量過來對系統進行測試,這樣的好處是測試資料接近真實水平,且實施起來相對簡單。下面我們將通過乙個真實的使用案例,來簡單介紹 tcpcopy 的基本使用方法。我們假定讀者對 tcp 以及路由相關基本知識有一定了解。

接下來我們將嘗試先敘述完整個實驗步驟,然後才是對實驗步驟中涉及到的點進行闡述。測試中用到的3臺伺服器資訊如下:

線上伺服器 online server     ip位址  182.118.7.40

測試伺服器 test server        ip位址  182.118.7.56

輔助伺服器 auxiliary server   ip位址  182.118.7.63

我們的目的是把online server上的流量複製到test server,大體結構如下:

在 online server 182.118.7.40 上安裝並執行 tcpcopy daemon :

wget

-otcpcopy-1.0.0.tar.gz

安裝依賴包;

yum -y install libpcap-devel

解壓編譯和安裝;

tar xf tcpcopy-1.0.0.tar.gz

cd tcpcopy-1.0.0

./configure  --pcap-capture       

預設是raw_socket抓包方式,可以根據實際情況修改

make && make install

最後執行 tcpcopy;

tcpcopy -x 80-182.118.7.56:80 -s 182.118.7.63 -c 192.168.1.100 -d  -l tcpcopy.log

-p /var/run/tcpcopy.pid

注意:日誌和pid路徑可選,配置成功後建議關掉日誌,以免寫滿磁碟導致程式阻塞

命令概述

將線上80埠收到的流量複製到測試機ip 182.118.7.56 的80埠,並設定輔助機的ip位址為182.118.7.63,且將複製過去的流量中的源位址統一更改為192.168.1.100,這樣做的好處是我們在測試機上可以直接針對整個更改後的網段設定一條路由即可。

注意請求線上伺服器的客戶端ip來自不同的網段,為了不把回應包再返回給客戶端,所以在這裡要把源ip修改為 192.168.1.100,好讓 tcpcopy 來捕獲輔助機的回應

在 auxiliary server 182.118.7.63 上安裝並執行 intercept daemon :

wget

-ointercept-1.0.0.tar.gz

安裝依賴包;

yum -y install libpcap-devel

解壓編譯和安裝;

tar xf intercept-1.0.0.tar.gz

cd intercept-1.0.0

./configure --pcap-capture           預設是raw_socket抓包方式,可以根據實際情況修改

make && make install

最後執行 intercept;

intercept -i eth0 -l

intercept.log -p /var/run/intercept.pid -f 'tcp and src port 80' -d

注意:日誌和pid路徑可選,配置成功後建議關掉日誌,以免寫滿磁碟導致程式阻塞

成功執行後可以觀察到的網路連線狀態:

[root@localhost ~]# route -n

kernel ip routing table

destination     gateway  

genmask         flags metric ref

use iface

0.0.0.0        

192.168.1.1     0.0.0.0             ug

100    0        0

enp0s3

192.168.1.0     0.0.0.0  

255.255.255.0   u     100    0

0         

enp0s3

192.168.8.0     0.0.0.0  

255.255.255.0   u     100    0

0enp0s3

命令概述

輔助機的 intercept 通過-f 引數制定捕獲規則,捕獲tcp連線中源埠為80的所有資料,也即是測試機的回應資料。其作用是將測試機路由過來的響應包捕獲下來,完成整個請求回應的流程且保證測試機產生的回應資料不會流向線上環境。intercept 會監聽 tcp 36524 埠,並和線上機182.118.7.40 的 tcpcopy 之間建立通訊,我們通過netstat命令可以觀察到。

注意輔助機和測試機一定要是同一網段

在 test server 182.118.7.56 上設定一條路由 :

route add -host 192.168.1.100 netmask

255.255.255.255 gw 182.118.7.63

成功執行測試時可以觀察到的網路連線狀態:

[root@localhost ~]# route -n

kernel ip routing table

destination        

gateway              genmask  

flags     metric

ref    use iface

192.168.1.100  

182.118.7.63       255.255.255.255    ug

100        0      

enp0s3

0.0.0.0        

192.168.1.1     0.0.0.0             ug

100    0        0

enp0s3

192.168.1.0     0.0.0.0  

255.255.255.0   u     100    0

0         

enp0s3

192.168.8.0     0.0.0.0  

255.255.255.0   u     100    0

0            enp0s3

命令概述

線上機tcpcopy複製流量時將源位址改寫為192.168.1.100網段的位址,那麼在測試機上看到的流量中源位址全部是**於這個位址,我們需要將返回給192.168.1.100這個位址的所有回應包通過這個ip 182.118.7.63 路由出去,這樣在輔助機上就可以對回應包進行截獲處理了。值得一提的是這種模式是在tcpcopy 1.0版本中對整個架構的乙個改進,將原本需要執行在測試機上的intercept移除放到乙個獨立的輔助機上來,使得測試機需要做的操作少到僅僅是新增一條路由而已,對整個測試機的效能損耗可以忽略,排除了intercept執行在測試機上時產生的效能影響,使得測試資料更加接近真實水平。

注意gateway 對應的ip必須是可以訪問的,否則路由記錄會新增失敗

總結:由於不同的主機網路設定不一樣,或自身有誤操作卻沒有發現等問題導致測試環境無法正常執行,那麼請使用 tcpdump -i any tcp host 192.168.1.100 這個命令來檢查請求包、回應包的流向來確認是**出了問題。

TCPCopy 線上流量複製工具

tcpcopy是一種重放tcp流的工具,使用真實環境來測試網際網路伺服器上的應用程式。一 描述 雖然真實的實時流量對於internet伺服器應用程式的測試很重要,但是由於生產環境中的情況很負責,測試環境很難完全模擬線上環境。為了能夠更真實的測試,我們開發了一款線上流量複製工具 tcpcopy,它可以...

使用tcpcopy匯入線上流量進行功能和壓力測試

假設我們要上線乙個兩年內不會宕機的先進架構。在上線前,免不了單元測試,功能測試,還有使用ab,webbench等等進行壓力測試。但這些步驟非生產環境下正式使用者的行為。或許你會想到灰度上線,但畢竟可能會影響到部分使用者,這怎麼對得起我們兩年內不宕機的承諾呢?好在網易的 王斌 開發了tcpcopy,可...

使用tcpcopy匯入線上流量進行功能和壓力測試

假設我們要上線乙個兩年內不會宕機的先進架構。在上線前,免不了單元測試,功能測試,還有使用ab,webbench等等進行壓力測試。但這些步驟非生產環境下正式使用者的行為。或許你會想到灰度上線,但畢竟可能會影響到部分使用者,這怎麼對得起我們兩年內不宕機的承諾呢?好在網易的 王斌 開發了tcpcopy,可...