tcpcopy实现新加的从库数据预热

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

image.png



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


下图,是生产上能够参考用的方案:

image.png








参考:

https://www.jianshu.com/p/e34086c47493

https://blog.csdn.net/github_39037504/article/details/93030068

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

https://www.sohu.com/a/245822692_671058

https://myslide.cn/slides/16467

相关文章
相关标签/搜索