tcpcopy實現新加的從庫數據預熱,這個功能仍是比較實用的(booking的2018年DTCC大會上的分享中也提過他們作了這個功能)。尤爲是高負載的從庫,若是直接加入一臺冷的從節點到集羣,可能形成大量慢查詢出現。mysql
編譯tcpcopy和intercept的過程直接參考github官方便可,須要注意的是要安裝 libpcap-devel 否則沒法編譯完成git
git clone https://github.com/session-replay-tools/tcpcopy.git cd tcpcopy git clone # 安裝這個插件,否則報文轉發到後端須要帳號密碼驗證的MySQL時候時候沒法work ./configure --set-protocol-module=mysql-replay-module make && make install 默認是安裝到 /usr/local/tcpcopy/ vim /usr/local/tcpcopy/conf/plugin.conf 裏面寫上稍後要壓測用的數據庫帳號密碼 user dts@dts; user archiver@archiver;
git clone https://github.com/session-replay-tools/intercept.git cd intercept ./configure --with-resp-payload make && make install 默認是安裝到 /usr/local/intercept/
注意: tcpcopy在雲上環境可能由於雲廠商的限制,致使其不work。所以咱們這裏更主要是針對物理機環境下的實驗。
github
一、192.168.2.4 online server 生產環境 mysql從庫,部署 tcpcopy程序,負責捕獲線上請求 二、192.168.2.162 assistant server 輔助機器, 部署有 intercept,負責向tcpcopy發送響應信息 三、192.168.2.164 target server 目標機器,待新加入的從庫 四、192.168.1.40 發起壓測的機器,部署有mysql客戶端或者sysbench之類工具便可
大體結構以下:sql
tcpcopy拷貝一次流量訪問的步驟以下:數據庫
① 一個客戶請求到達線上機器;vim
② 拷貝IP層(或者數據鏈路層)的包到tcpcopy進程;後端
③ tcpcopy修改包的目的及源地址,發給目標測試機;bash
④ 拷貝的包到達目標測試機;session
⑤ 目標測試機的應用處理訪問,並返回結果給輔助機;tcp
⑥ 返回結果在輔助機的數據鏈路層被截獲,drop響應的body,copy返回的ip header;
⑦ 輔助機將響應header發送給線上機器的tcpcopy進程。
注意: 在作tcpcopy實驗的時候,須要確保這幾臺主機是關閉 ip_forward的。操做方法:echo 0 > /proc/sys/net/ipv4/ip_forward
下面開始實時複製流量實驗部分(流量錄製的用的比較少,這裏就不寫了)
1. 目標機器 192.168.2.164 上配置路由 ,將響應包路由到輔助機 192.168.2.162
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.2.162 dev ens32 其中 192.168.2.162 爲輔助機, 192.168.0.0 爲發壓客戶端所在的網段
2. 輔助機 192.168.2.162 捕獲目標機器發來的響應包 (和抓包命令相似)
格式: ./intercept -F <filter> -i <device,> 例子: cd /usr/local/tcpcopy/sbin/ ./intercept -i ens32 -F 'tcp and src port 3306' # 前臺啓動,須要放到後臺的話,加上 -d 選項便可 含義:捕獲網卡 ens32 ,端口 3306 基於tcp的包
3. 線上機器 192.168.2.4 上捕獲包,並修改客戶端地址,並把包發送給目標機器,等待輔助機發送響應包
格式: ./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,> [-c <ip range,>] 例子: cd /usr/local/tcpcopy/sbin/ ./tcpcopy -x 3306-192.168.2.164:3306 -s 192.168.2.162 -c 192.168.0.0 #全流量複製,若是後臺運行須要加 -d選項便可 其它: ./tcpcopy -x 80-3.3.3.3:8080 -s 2.2.2.2 -c 1.1.1.0 -r 20 -d #複製20%的流量 ./tcpcopy -x 80-3.3.3.3:8080 -s 2.2.2.2 -c 1.1.1.0 -n 2 -d #複製2倍流量
四、壓測結果,我這裏就不貼了。感興趣的,能夠開mysql的general_log,看實例的網卡流量、errlog,均可以看到有用的信息。
五、預熱完成後,記得刪除以前加的路由:
route del -net 192.168.0.0 netmask 255.255.0.0
下圖,是生產上能夠參考用的方案:
參考:
https://www.jianshu.com/p/e34086c47493
https://blog.csdn.net/github_39037504/article/details/93030068
https://github.com/session-replay-tools/tcpcopy