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

泪湿孤枕 提交于 2020-08-12 19:11:29

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之类工具即可


大致结构如下:

image.png



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


下图,是生产上可以参考用的方案:

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!