tcpcopy实现新加的从库数据预热,这个功能还是比较实用的(booking的2018年DTCC大会上的分享中也提过他们做了这个功能)。尤其是高负载的从库,如果直接加入一台冷的从节点到集群,可能造成大量慢查询出现。
编译tcpcopy和intercept的过程直接参考github官方即可,需要注意的是要安装 libpcap-devel 不然无法编译完成
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。因此我们这里更主要是针对物理机环境下的实验。
1、192.168.2.4 online server 生产环境 mysql从库,部署 tcpcopy程序,负责捕获线上请求
2、192.168.2.162 assistant server 辅助机器, 部署有 intercept,负责向tcpcopy发送响应信息
3、192.168.2.164 target server 目标机器,待新加入的从库
4、192.168.1.40 发起压测的机器,部署有mysql客户端或者sysbench之类工具即可
大致结构如下:
tcpcopy拷贝一次流量访问的步骤如下:
① 一个客户请求到达线上机器;
② 拷贝IP层(或者数据链路层)的包到tcpcopy进程;
③ tcpcopy修改包的目的及源地址,发给目标测试机;
④ 拷贝的包到达目标测试机;
⑤ 目标测试机的应用处理访问,并返回结果给辅助机;
⑥ 返回结果在辅助机的数据链路层被截获,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倍流量
4、压测结果,我这里就不贴了。感兴趣的,可以开mysql的general_log,看实例的网卡流量、errlog,都可以看到有用的信息。
5、预热完成后,记得删除之前加的路由:
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
https://www.sohu.com/a/245822692_671058
https://myslide.cn/slides/16467
来源:oschina
链接:https://my.oschina.net/u/4377796/blog/4327112