【原创】MySQL Replay线上流量压测工具
一. 背景
去年做過一次mysql trace 重放的測試,由于performance schema本身采集樣本的長度等限制,實際回放的成功率比較低。
?
最近找到一款開源的工具,基于TCPCopy實現了線上流量的仿真測試,這款開源工具是網易的王斌開發,后面很多公司的模擬在線測試都是基于TCPCopy實現。
https://github.com/session-replay-tools/mysql-replay-module
?
1.實現原理
?
?
生產服務器上部署TCPCopy, 包捕獲是在數據鏈路層增加一個旁路處理,使用socket在網絡層抓取線上的數據包,進行加工處理,使用socket發送數據包到測試服務器。
intercept將響應信息傳送給tcpcopy。通過抓取響應包,intercept提取響應頭信息,并使用一個特殊的通道將響應頭信息發送給tcpcopy。
當tcpcopy接受到響應頭信息,它利用頭信息修改在線打包器的屬性并繼續發送另一個包。應當注意,來自測試服務器的響應被路由到充當黑洞的輔助服務器。
?
2.使用場景
復制線上的真實流量進行壓力測試,可用于新版MySQL5.7或MySQL8.0壓測,MySQL ?Bug排查定位,容量規劃等
3.回放模式
基于tcpcopy的MySQL Replay工具有兩種回放模式,支持在線抓包回放及離線回放。考慮到對生產服務器的影響盡量小,重點測試了離線回放模式。
?
二. 部署
1.環境準備
要部署離線回放,需要準備下面資源,以測試環境的IP為例:
?
生產服務器:192.168.137.110
模擬生產服務器:192.168.137.100
測試目標服務器:192.168.137.102
輔助服務器:192.168.137.101
偽裝客戶端IP:192.168.166.166
?
2.模擬生產服務器安裝離線tcpcopy模塊
git clone git://github.com/session-replay-tools/tcpcopy.git
cd tcpcopy
git clone git://github.com/session-replay-tools/mysql-sgt-replay-module.git
./configure --offline --set-protocol-module=mysql-sgt-replay-module
make
make install
?
3.輔助服務器安裝離線intercept模塊
git clone git://github.com/session-replay-tools/intercept.git
cd intercept
./configure
make
make install
如有報錯,可能需要安裝下面的包
yum install libpcap-devel
三. 生產抓取網絡包并離線回放
1.生產服務器利用tcpdump抓取網絡包
tcpdump -i eth1 -s 0 -C 300 tcp and port 3306 -w /data/offline.pcap
2.測試目標服務器添加靜態路由
1.測試目標服務器還原對應生產服務器的DB
2.測試目標服務器以skip-grant-tables模式啟動
/usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql --skip-grant-tables&
3.添加靜態路由
route add -host 192.168.166.166 gw 192.168.137.101
注意:host是偽裝的客戶端IP,gw是輔助服務器的IP
?
3.輔助服務器運行intercept
/usr/local/intercept/sbin/intercept -i eth2 -F 'tcp and src port 3306' -d
?
?
4.模擬生產服務器離線回放
1.將生產服務器上抓取的網絡包文件拷貝到模擬生產服務器/tmp/offline.pcap
2.運行tcpcopy解析離線網絡包,轉發網絡包到測試目標服務器
/usr/local/tcpcopy/sbin/tcpcopy -i /tmp/offline.pcap -x 3306-192.168.137.102:3306 -s 192.168.137.101 -c 192.168.166.166 -n 1
運行 tcpcopy 客戶端,有幾種可選方式:
#全流量復制
/usr/local/tcpcopy/sbin/tcpcopy -i /tmp/offline.pcap -x 3306-192.168.137.102:3306 -s 192.168.137.101 -c 192.168.166.166 –d
#復制20%流量
/usr/local/tcpcopy/sbin/tcpcopy -i /tmp/offline.pcap -x 3306-192.168.137.102:3306 -s 192.168.137.101 -c 192.168.166.166 –r 20 -d
#放大2倍流量
/usr/local/tcpcopy/sbin/tcpcopy -i /tmp/offline.pcap -x 3306-192.168.137.102:3306 -s 192.168.137.101 -c 192.168.166.166 –n 2 -d
5 . 監控回放情況
通過開啟performance_schema.events_statements_history_long功能,可以看到回放的情況
update performance_schema.setup_consumers set ENABLED='YES' where NAME='events_statements_history_long';
select * from performance_schema.events_statements_history_long limit 10\G
?
四.碰到的問題
1.生產環境抓包時,對于短連接,可以抓到mysql的登錄信息,能正常回放,對于長連接來說,由于缺少第一次認證登錄校驗信息,不能正常回放,可以等待隨著新連接的建立,完整的session越來越多,流量會逐步增多。
2.通過重啟線上業務,kill長連接,讓連接重新建立起來,這種一般不推薦。
?
?
轉載于:https://www.cnblogs.com/wangdong/p/9228123.html
總結
以上是生活随笔為你收集整理的【原创】MySQL Replay线上流量压测工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1644E. Expand the Pa
- 下一篇: javascript --- js中的