資料庫、中介軟體等線上引流工具Tcpcopy原理、環境搭建、使用、採坑

y123456yzzyz發表於2020-11-20

關於作者

      前滴滴出行技術專家,現任OPPO文件資料庫mongodb負責人,負責oppo千萬級峰值TPS/十萬億級資料量文件資料庫mongodb核心研發及運維工作,一直專注於分散式快取、高效能服務端、資料庫、中介軟體等相關研發。後續持續分享《MongoDB核心原始碼設計、效能優化、最佳運維實踐》,Github賬號地址: github.com/y123456yz

1. 簡介

      TCPCopy是一種請求複製(所有基於tcp的packets)工具,可以把線上流量匯入到測試系統中去。目前此工具已經廣泛應用於各大網際網路公司。

專案網址: github.com/wangbin579/t

github.com/session-repl

2. TCPCopy功能

1)分散式壓力測試工具,利用線上資料,可以測試系統能夠承受的壓力大小(遠比ab壓力測試工具真實地多),也可以提前發現一些bug

2)普通上線測試,可以發現新系統是否穩定,提前發現上線過程中會出現的諸多問題,讓開發者有信心上線

3)對比試驗,同樣請求,針對不同或不同版本程式,可以做效能對比等試驗

4)流量放大功能,可以利用多種手段構造無限線上壓力,滿足中小網站壓力測試要求

5)利用TCPCopy轉發傳統壓力測試工具發出的請求,可以增加網路延遲,使其壓力測試更加真實

6)熱備份

3.組成部分

1. TCPCopy Server(tcpcopy):部署在 測試伺服器 ,用於接收復制的線上請求,github地址:

github.com/session-repl

2. TCPCopy Client(intercept):部署在 線上伺服器 ,用於捕獲線上請求,通過修改TCP/IP資料包,傳送到TCPCopy Server進行穩定性測試,截獲響應包,並傳遞響應包頭資訊給TCPCopy client,以完成TCP互動。Github地址:

https://github.com/session-replay-tools/intercept

4. tcpcopy工作流程

資料庫、中介軟體等線上引流工具Tcpcopy原理、環境搭建、使用、採坑

  1. 一個訪問到達線上前端機;
  2. socket資料包在ip層被拷貝了一份傳給tcpcopy程式;
  3. tcpcopy修改包的目的及源地址,發給目標測試機;
  4. 拷貝的包到達目標測試機;
  5. 目標測試機的nginx處理訪問,並返回結果;
  6. 返回結果在ip層被截獲、丟棄,由intercpet程式拷貝返回結果的ip header並返回;intercept會通過tcpcopy與intercept之間的套接字來傳送tcpcopy重放報文中的IP+TCP資料給tcpcopy,可以參考intercept中的函式tc_socket_snd
  7. ip header被髮送給線上前端機的tcpcopy程式。

 

5.  常見的幾種引流方式

5.1 離線流量回放

  用法:離線回放模式需要在 configure  的時候加上 --enable-offline  引數,離線回放還需要安裝 pcap  庫和 pcap  開發庫(需要用到 pcap  庫的標頭檔案)另外執行的時候需要指定 -i  引數,例如:

   ./tcpcopy -x 110-xxx.xxx.xxx.148:110 -i ./online.pcap

  這裡 oline.pcap (利用類似於 tcpdump  的工具來抓請求資料包,存放到 pcap  格式的檔案中去)檔案作為資料來源,把請求轉發到測試伺服器上。此外增加 -a 引數對請求資料包的訪問進行加速,如下:

   ./tcpcopy -x 80-xxx.xxx.x.xx:8080 -a 2 -i online.pcap

  假設 online.pcap  檔案為線上請求資料包的抓包檔案,時間間隔為 60  分鐘。執行此命令後,離線回放加速了 倍,只需要 30  分鐘離線回放就能完成, -a  引數設定不宜設定過大,越大丟請求的概率也越大。

  適用場景:由於離線方式依賴於抓包工具(如 tcpdump ),而抓包工具在壓力比較大的場合一般丟包非常嚴重,而且還會嚴重影響線上 IO ,因此一般不推薦在高壓情況下使用離線回放方式

1 tcpcpoy 和測試元件合設。

2 、一臺機器起多個 tcpcopy. 用虛擬機器。先試一下。或者看下程式碼,確認(所有疑惑點。真正的技術點)。

系統全鏈路壓測系統。慢慢了解下效能測試團隊。

5.2 部分引流

  用法: Tcpcopy 可以通過 -r 引數實現線上伺服器應用的部分流量複製,引數範圍是 1 99 ,其它值都是全流量複製。 -r  引數常用於測試伺服器配置不如線上伺服器的場合。

   #./tcpcopy -x 2080-xxx.xx.xx.xxx:9999 -r 20

  這裡 tcpcopy  複製線上伺服器 2080  埠應用的 20% 流量給測試伺服器,這裡的 20% 是根據 session (這裡 session  是由客戶端 IP ,客戶端埠決定)來統計的。

  適用場景:部分引流主要適用於線上請求壓力很多,而測試環境的處理能力較弱,這時候就只需複製部分線上的請求到測試環境,就可以壓到測試環境的極限 .

5.3 放大流量

  用法: Tcpcopy 可以通過 -n 引數對線上伺服器應用的流量進行復制放到到測試伺服器,如果你要進行多重複制, -n 引數

   #./tcpcopy -x 2080-xxx.xx.x.xxx:9999 -n 3

  表示複製 倍的線上伺服器的 80  埠應用請求流量到 192.168.0.2  8080 

  適用場景:放大引流主要用於線上壓力較小時,想要通過無限構造壓力通過成倍引流達到對測試伺服器進行壓力測試的目的

6. 應用舉例

    TCPCopy分為TCPCopy client(也即tcpcopy)和TCPCopy server(也即intercept)。其中TCPCopy client執行在線上伺服器上面,用來捕獲線上請求資料包;TCPCopy server(預設監聽埠為36524)執行在測試機器上面,用來截獲響應包,並傳遞響應包頭資訊給TCPCopy client,以完成TCP互動。

    說明:以下測試環境中真實伺服器IP地址172.16.3.66,測試伺服器1的ip地址為172.16.3.42,測試伺服器2的ip地址為172.16.3.41,其中測試伺服器2是執行intercept程式的額外伺服器,只是為了配合測試用。

    目的:複製172.16.3.66上的11111埠流量到測試伺服器172.16.3.42中的11111

首先在測試伺服器172.16.3.41上啟用Ip_queue核心模組,同時按照以下方式對Iptable進行設定:

  1. 載入ip_queue核心模組,如果已經有載入nfnetlink_queue模組,則需要先解除安裝該模組 modprobe ip_queue
  2. 編輯/etc/sysconfig/iptables,新增:Iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 36524 -j ACCEPT
  3. 然後重啟 iptables /etc/init.d/iptables restart
  4. 將響應結果傳送至QUEUE( ip_queue),從而實現執行在使用者態的程式對相關資料包進行裁定,執行以下命令:

                 iptables -I OUTPUT -p tcp --sport 11111 -j QUEUE

                 iptables -A  INPUT  -p --dport http -j QUEUE

        這個規則的意思是linux將http服務的報文上送到使用者層,而做這個工作的就是ip_queue。ip_queue是一個處理QUEUE動作的一個模組。

 

6.1 離線回放配置

  1. 在真實伺服器172.16.3.66上面抓包:

tcpdump -i eth0 tcp and host 172.16.3.66 and port 11111 –s 2000 –w online.pcap,

         注意這裡-s後面不能為0,或者不帶-s引數,這兩種情況下會造成抓包丟包。-s後面的數字大小最好根據實際包體大小進行除錯。丟包除錯引數還有:

     echo 124928000 > /proc/sys/net/core/rmem_max

    echo 1249280 > /proc/sys/net/core/rmem_default

2. 拷貝步驟1的online.pcap到測試伺服器1,即1716.3.42

3. 編譯tcpcopy,./configure  --offline, 然後 make && make install 。如果提示以下錯誤:

    checking for pcap.h ... not found,則需要 yum install libpcap-devel

    tcpcopy: illegal argument "i" ,說明是 configure 的時候沒有攜帶 —offline

   yum install openssl openssl-devel

4. 在測試伺服器2,即172.16.3.41上面執行intercept工具

/usr/local/intercept/sbin/intercept -i eth0 -F 'tcp and src port 11111' &

5. 在測試伺服器1,即172.16.3.42上面設定路由,把本來應該應答給192.168.1.x的報文轉發給執行intercept的172.16.3.41伺服器處理。

Route add –net 192.168.1.0 netmask 255.255.255.0 gw 172.16.3.41

6. 在線上伺服器上面執行tcpcopy工具進行流量回放。

    線上引流編譯tcpcopy的時候直接./configure —offline ,無需./configure  --offline

    把線上伺服器中埠地址為11111的報文轉發到172.16.3.42:11111測試伺服器上,同時修改報文的源Ip地址為192.168.1.x。修改原ip地址的好處是伺服器1上面設定應答路由方便。

/usr/local/tcpcopy/sbin/tcpcopy -x 11111-172.16.3.42:11111 -i ./online.pcap -s 172.16.3.41 -c 192.168.1.x &

6.2 線上實時引流

  1. 在線上伺服器172.16.3.66上編譯tcpcopy,./configure , 然後 make && make install 。如果提示以下錯誤:

checking for pcap.h ... not found,則需要 yum install libpcap-devel

    2. 在測試伺服器2,即172.16.3.41上面執行intercept工具

/usr/local/intercept/sbin/intercept -i eth0 -F 'tcp and src port 11111' &

    3. 在測試伺服器1,即172.16.42上面設定路由,把本來應該應答給192.168.1.x的報文轉發給執行intercept的172.16.41伺服器處理。

Route add –net 192.168.1.0 netmask 255.255.255.0 gw 172.16.3.41

    4. 在線上伺服器上面執行tcpcopy工具進行流量回放。

    把線上伺服器中埠地址為11111的報文轉發到172.16.3.42:11111測試伺服器上,同時修改報文的源Ip地址為192.168.1.x。修改原ip地址的好處是伺服器1上面設定應答路由方便。

/usr/local/tcpcopy/sbin/tcpcopy -x 11111-172.16.3.42:11111 -s 172.16.3.41 -c 192.168.1.x &

 

7. 測試結果

離線測試

以下測試結果都是以memcached為例:

mc-benchmark -h 172.136.3.66 -p 11111 -c 200 -n 99699999 -d 5 -k 0 -r 565655

資料庫、中介軟體等線上引流工具Tcpcopy原理、環境搭建、使用、採坑

8. 注意可能出現的坑

       如果目的伺服器和部署Intercept的伺服器時同一網段,即使啟用了intercept進行資料包DROP操作,但是部署intercept的伺服器會認為這不是一條最優路由,於是傳送icmp重定向報文給目的伺服器,這樣下次發往該目的伺服器的報文會全部直接發往ICMP redirect 192.168.1.1 to host 10.x.4.1, length 60 指定的10.x.4.1地址,這樣就會有部分報文走到10.x.4.1這個閘道器等裝置,如果這些網路裝置發現到我們模擬的192.168.1.x網段沒有路由,就會做snat對映。由於這些網路裝置只有一個出口IP,該出口IP可用的埠號最多為65000左右,這時候會造成源地址是192.168.1.x(埠變化)網段的報文消耗掉大量snat的埠,從而造成其他提供服務的內網機器的報文無法轉出去。

    Icmp重定向相關資訊可以參考 http://blog.csdn.net/petershina/article/details/41449983

    解決辦法,可以在Intercept所在垃圾回收器中關閉IP_FOWARD:echo 0 > /proc/sys/net/ipv4/ip_forward



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69984922/viewspace-2734822/,如需轉載,請註明出處,否則將追究法律責任。

相關文章