【原创】MySQL Replay线上流量压测工具
一. 背景
去年做过一次mysql trace 重放的测试,由于performance schema本身采集样本的长度等限制,实际回放的成功率比较低。
最近找到一款开源的工具,基于TCPCopy实现了线上流量的仿真测试,这款开源工具是网易的王斌开发,后面很多公司的模拟在线测试都是基于TCPCopy实现。
https://github.com/session-replay-tools/mysql-replay-module
1.实现原理

生产服务器上部署TCPCopy, 包捕获是在数据链路层增加一个旁路处理,使用socket在网络层抓取线上的数据包,进行加工处理,使用socket发送数据包到测试服务器。
intercept将响应信息传送给tcpcopy。通过抓取响应包,intercept提取响应头信息,并使用一个特殊的通道将响应头信息发送给tcpcopy。
当tcpcopy接受到响应头信息,它利用头信息修改在线打包器的属性并继续发送另一个包。应当注意,来自测试服务器的响应被路由到充当黑洞的辅助服务器。
2.使用场景
复制线上的真实流量进行压力测试,可用于新版MySQL5.7或MySQL8.0压测,MySQL Bug排查定位,容量规划等
3.回放模式
基于tcpcopy的MySQL Replay工具有两种回放模式,支持在线抓包回放及离线回放。考虑到对生产服务器的影响尽量小,重点测试了离线回放模式。
二. 部署
1.环境准备
要部署离线回放,需要准备下面资源,以测试环境的IP为例:
生产服务器:192.168.137.110
模拟生产服务器:192.168.137.100
测试目标服务器:192.168.137.102
辅助服务器:192.168.137.101
伪装客户端IP:192.168.166.166
2.模拟生产服务器安装离线tcpcopy模块
git clone git://github.com/session-replay-tools/tcpcopy.git
cd tcpcopy
git clone git://github.com/session-replay-tools/mysql-sgt-replay-module.git
./configure --offline --set-protocol-module=mysql-sgt-replay-module
make
make install
3.辅助服务器安装离线intercept模块
git clone git://github.com/session-replay-tools/intercept.git
cd intercept
./configure
make
make install
如有报错,可能需要安装下面的包
yum install libpcap-devel
三. 生产抓取网络包并离线回放
1.生产服务器利用tcpdump抓取网络包
tcpdump -i eth1 -s 0 -C 300 tcp and port 3306 -w /data/offline.pcap
2.测试目标服务器添加静态路由
1.测试目标服务器还原对应生产服务器的DB
2.测试目标服务器以skip-grant-tables模式启动
/usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql --skip-grant-tables&
3.添加静态路由
route add -host 192.168.166.166 gw 192.168.137.101
注意:host是伪装的客户端IP,gw是辅助服务器的IP

3.辅助服务器运行intercept
/usr/local/intercept/sbin/intercept -i eth2 -F 'tcp and src port 3306' -d

4.模拟生产服务器离线回放
1.将生产服务器上抓取的网络包文件拷贝到模拟生产服务器/tmp/offline.pcap
2.运行tcpcopy解析离线网络包,转发网络包到测试目标服务器
/usr/local/tcpcopy/sbin/tcpcopy -i /tmp/offline.pcap -x 3306-192.168.137.102:3306 -s 192.168.137.101 -c 192.168.166.166 -n 1

运行 tcpcopy 客户端,有几种可选方式:
#全流量复制
/usr/local/tcpcopy/sbin/tcpcopy -i /tmp/offline.pcap -x 3306-192.168.137.102:3306 -s 192.168.137.101 -c 192.168.166.166 –d
#复制20%流量
/usr/local/tcpcopy/sbin/tcpcopy -i /tmp/offline.pcap -x 3306-192.168.137.102:3306 -s 192.168.137.101 -c 192.168.166.166 –r 20 -d
#放大2倍流量
/usr/local/tcpcopy/sbin/tcpcopy -i /tmp/offline.pcap -x 3306-192.168.137.102:3306 -s 192.168.137.101 -c 192.168.166.166 –n 2 -d
5 . 监控回放情况
通过开启performance_schema.events_statements_history_long功能,可以看到回放的情况
update performance_schema.setup_consumers set ENABLED='YES' where NAME='events_statements_history_long';
select * from performance_schema.events_statements_history_long limit 10\G

四.碰到的问题
1.生产环境抓包时,对于短连接,可以抓到mysql的登录信息,能正常回放,对于长连接来说,由于缺少第一次认证登录校验信息,不能正常回放,可以等待随着新连接的建立,完整的session越来越多,流量会逐步增多。
2.通过重启线上业务,kill长连接,让连接重新建立起来,这种一般不推荐。

【原创】MySQL Replay线上流量压测工具的更多相关文章
- 使用tcpcopy拷贝线上流量压测测试环境
tcpcopy项目地址:https://github.com/session-replay-tools/tcpcopy 作者地址:http://blog.csdn.net/wangbin579 1:环 ...
- 在Mac上利用压测工具Jmeter-Suite进行一次压测实践的保姆级详细步骤(参考腾讯云文章)
参考的文章 压测工具Jmeter-Suite详细操作步骤 写此文的目的 由于我是刚开始接触kubernetes和jmeter,所以在学习过程中遇到了很多很多问题,同时我很烦恼为什么网上没有文章是从真正 ...
- tcpcopy真实流量压测工具
https://quentinxxz.iteye.com/blog/2249799 http://blog.chinaunix.net/uid-25057421-id-5576741.html htt ...
- TCPCopy 线上流量复制工具
TCPCopy是一种重放TCP流的工具,使用真实环境来测试互联网服务器上的应用程序. 一.描述: 虽然真实的实时流量对于Internet服务器应用程序的测试很重要,但是由于生产环境中的情况很负责,测试 ...
- 使用tcpcopy导入线上流量进行功能和压力测试
- 假设我们要上线一个两年内不会宕机的先进架构.在上线前,免不了单元测试,功能测试,还有使用ab,webbench等等进行压力测试. 但这些步骤非生产环境下正式用户的行为.或许你会想到灰度上线,但毕竟 ...
- 使用tcpcopy复制线上流量进行测试
使用tcpcopy复制线上流量进行测试 online server 线上服务所在机器 10.136.11.4 部署tcpcopy sudo /usr/local/tcpcopy/sbin/tcpcop ...
- mysql常用压测工具
关键字:mysql压测工具 mysqlslap.sysbench 基准测试sysbench 压力测试 tpcc 具体怎么使用百度
- web压测工具http_load原理分析
一.前言 http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load: http://www.acme.com/software/http_load/ ...
- web服务器压测工具siege、ab
web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估 ...
随机推荐
- Java解决LeetCode72题 Edit Distance
题目描述 地址 : https://leetcode.com/problems/edit-distance/description/ 思路 使用dp[i][j]用来表示word1的0~i-1.word ...
- 装好Linux后没有声音的看过来
现代的Linux发行版对声卡的支持都应该没有问题.系统装好,声卡就应该正常工作. (尤其是ArchLinux,我觉得对硬件支持最跟得上时代步伐.) 可是我用mplayer播放mp3文件却没有声音,但也 ...
- 新的玩具:Windows上的awesome
平铺式窗口管理器 基于xwindow(Linux/Unix采用的图形系统)有成千上百种窗口管理器.其中有一类窗口管理器很古怪,所有应用程序的窗口没有互相遮挡,而是平铺到屏幕上,这类窗口管理器叫 平铺式 ...
- 20155227 2016-2017-2 《Java程序设计》第四周学习总结
20155227 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 继承 继承 继承是Java程序设计语言面向对象的又一重要体现,允许子类继承父类,避免重复的行 ...
- IE的双边距Bug以及解决办法
display:inline和display:block区别 一.什么是双边距Bug? 先来看图: 我们要让绿色盒模型在蓝色盒模型之内向左浮动,并且距蓝色盒模型左侧100像素.这个例子很常见,比如在网 ...
- RW RO ZI ROM keil中的含义
编译的一个ARM的程序,会得到这样的信息: ============================================================================== ...
- MVC 视图页对数字,金额 用逗号 隔开(数字格式化)
cshtml页面代码: <tr> <th>@Model.BankName</th> <th>@Model.Month</th> <th ...
- sicily 1231. The Embarrassed Cryptography
Time Limit: 2sec Memory Limit:32MB Description The young and very promising cryptographer Odd Ev ...
- TCP协议端口状态说明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ...
了解TCP协议端口的连接状态,对排除和定位网络或系统故障会有很大帮助,因此了解一下是有必要的: 一.LISTENING 提供某种服务,侦听远方TCP端口的连接请求,当提供的服务没有被连接时,处于LI ...
- 数据库-mysql触发器
MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 一:创建触发器 在MySQL中,创建触发器语法 ...