tcpcopy複製線上流量

TCPCopy七大功能
1)分佈式壓力測試工具,利用在線數據,能夠測試系統可以承受的壓力大小(遠比ab壓力測試工具真實地多),也能夠提早發現一些bug
2)普通上線測試,能夠發現新系統是否穩定,提早發現上線過程當中會出現的諸多問題,讓開發者有信心上線
3)對比試驗,一樣請求,針對不一樣或不一樣版本程序,能夠作性能對比等試驗
4)流量放大功能
5)利用TCPCopy轉發傳統壓力測試工具發出的請求,能夠增長網絡延遲,使其壓力測試更加真實
6)熱備份
7)實戰演習(架構師必備)html

TCPCopy的特色
1)實時 (離線經過configure --enable-offline)
2)效果然實
3)低負載,不影響在線
4)操做簡單
5)分佈式
6)零成本nginx

可能會遇到的問題redis

王斌本身講:要想用好 tcpcopy,須要熟悉系統知識,包括如何高效率抓包,如何定位系統瓶頸,如何部署測試應用系統,如何抓包分析。常見問題有:1)部署測試系統不到位,耦合線上系統,2)忽視系統瓶頸問題,3)不知道如何定位問題,4)資源不到位,資源緊張引起的問題 。後端

 

1)ip_conntrack緩存

2014年6月,微博的唐福林曾說:「Tcpcopy 引流工具是線上問題排查的絕佳之選,但使用者不多有人去關注開啓 tcpcopy 服務時,同時會開啓 ip_conntrack 內核模塊,這個模塊負責追蹤全部 tcp 連接的狀態,並且它的內部存儲有長度限制,一旦超過,全部新建連接都會失敗。」服務器

王斌則迴應說:「開啓 tcpcopy,自身不會去開啓 ip_conntrack 內核模塊。開不開啓 ip_conntrack 內核模塊,是用戶本身決定的,跟 tcpcopy 不要緊。」他還建議:「當鏈接數量很是多的時候,自己就應該關閉 ip_conntrack,不然嚴重影響性能。至於 tcpcopy,默認是從 ip 層發包的,因此也會被 ip_conntrack 干涉,文檔中也有描述,其實也能夠採用 --enable-dlinject 來發包,避開ip層的ip_conntrack。若是沒有報「ip_conntrack: table full, dropping packet」,通常無需去操心ip_conntrack。」以及「線上鏈接很少的場合,開啓 ip_conntrack 並無問題。線上鏈接比較多的場合,最好關閉 ip_conntrack,或者對線上應用系統端口設置 NOTRACK,至少我周圍的系統都是這樣的,這是爲性能考慮,也是一種好的運維習慣。」網絡

 

2)少許丟包架構

如何發現 TCPCopy 丟包多仍是少呢?運維

王斌本身稱,在某些場景下,pcap 抓包丟包率會遠高於 raw socket 抓包,所以最好利用 pf_ring 來輔助或者採用 raw socket 來抓包。socket

丟包率須要在測試環境中按照定量請求發送進行對比才能展開計算,另外還須要對日誌內容進行分析,有待測試。

 

3)離線重放

tcpcopy 有兩種工做模式:

1)實時拷貝數據包;

2)經過使用 tcpdump 等抓包生成的文件進行離線(offline)請求重放。

本次仿真測試,沒有試驗成功第二種工做模式,留待之後進一步研究。

 

4)不提取 7 層信息

會議上曾提出按域名區分拷貝流量,免得把不在本次壓測範圍內的工程打掛,但 tcpcopy 的原理是在 ip 層拷貝,不提取 7 層的信息,也就是說,在咱們的 Nginx*4 上部署 TCPCopy,只能是將全部流量拷貝到鏡像環境的 Nginx 上。反正沒有配置對應的 server,或者 server 停掉,這種處理不了的流量就丟棄掉。

 

0x05,觀測的性能指標

仿真壓測時,須要記錄下 Test Server 以及後端各類被壓工程的性能指標。

本次壓測,咱們記錄的指標有:

  • Java 工程的訪問次數,響應時間,平均響應時間,調用成功或失敗,Web端口鏈接數;
  • Web容器的 thread、memory 等狀況;
  • 虛擬機的 CPU-usage、Load-avg、io-usage 等;
  • memcached/redis 等緩存集羣的命中率等;

 

 下載及安裝
1.1. 下載
須要兩個工具,分別是:

tcpcopy
intercept
1.2. 工具部署
使用tcpcopy進行線上導流,一般須要 3 臺服務器:

online server (運行 tcpcopy)
target server (流量從 online server 複製到此機器)
assistant server (運行 intercept)
1.3. 安裝及命令使用方法
1.3.1. tcpcopy
./configure(在線導流模式)

./configure --offline(離線回放模式)
make
make install

在線導流方法:

tcpcopy -x localServerPort-targetServerIP:targetServerPort -s interceptServerIP
  [-c <ip range,>] -d

離線重放方法:

tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.136 -i test.pcap -n 2

將 test.pcap 報文放大 2 倍發送給 192.168.44.137

1.3.2. intercept
cd intercept
./configure
make
make install

使用方法:

intercept -F <filter> -i <device,>

二. 測試
假設咱們 3 臺服務器狀況分別以下: 
- online server: 192.168.44.128 
- target server: 192.168.44.137 
- assistant server: 192.168.44.136

2.1. 運行命令
2.1.1. target server
若是是在同一網段,設置去往 online server 的響應,路由到 assistant server,能夠這樣指定:

route add -host onlineIP gw assistantIP

若是客戶端 IP 來自於其它網段的話:

route add -net xxx.xxx.xxx.0 netmask 255.255.255.0 gw assistantIP

這裏添加靜態路由:

route add -net 192.168.50.0 netmask 255.255.255.0 gw 192.168.44.136

確保被測試應用程序的響應包路由到輔助測試服務器,而不是回包給 online server

2.1.2. assistant server
intercept -i eth0 -F 'tcp and src port 80' -d

intercept 過濾 eth0 網卡 80 端口的 tcp response 報文。

輔助服務器要確保沒有開啓路由模式,爲0表示沒有開啓:

cat /proc/sys/net/ipv4/ip_forward

輔助服務器上的 intercept 經過 pcap 抓取測試機應用程序的響應包,將頭部抽取後發送給 online server 上的 tcpcopy ,從而完成一次請求的複製。

2.1.3. online server
tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.136 -c 192.168.50.x -d

將本機 80 端口數據轉發給192.168.44.137:80,更改 client IP 爲 192.168.50.x 之一,並從 192.168.44.136 獲取 response 報文。

2.2. 查看各 server 報文狀況
能夠在各個 server 上使用 tcpdump 抓包查看收發報文狀況

如:online server 上

tcpdump -n -i eth0 port 80 and dst host 192.168.44.137

三. 遇到的問題
3.1. 沒法複製流量問題
以前在三臺機器都是同網段的機器上測試,是能夠成功複製流量的,可是 online server 與 target server 不在同一網段時,發現沒法複製流量。

抓包發現

online ------(SYN)------> target
online <---(SYN + ACK)--- target
online ------(RST)------> target

解決方案

採用兩臺機器方案: 
- online server,假設 IP 1.2.3.4 
- target server,假設 IP 192.168.44.137

online server 運行:

tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.137 -c 1.2.3.4 -d

online server iptables 添加下面規則

iptables -A INPUT -s 192.168.44.137 -p tcp --sport 80 -j DROP

target server 運行:

intercept -i eth0 -F 'tcp and src port 80' -d

而後能夠分別在兩臺服務器上查看日誌,如 nginx:

tail -f /usr/local/nginx/logs/access.log

參考資料:

http://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html

https://www.cnblogs.com/chenny7/p/3912515.html

https://blog.csdn.net/fengfengdiandia/article/details/77776026 

相關文章
相關標籤/搜索