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