zoukankan      html  css  js  c++  java
  • 【原创】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 10G

     

    四.碰到的问题

    1.生产环境抓包时,对于短连接,可以抓到mysql的登录信息,能正常回放,对于长连接来说,由于缺少第一次认证登录校验信息,不能正常回放,可以等待随着新连接的建立,完整的session越来越多,流量会逐步增多。

    2.通过重启线上业务,kill长连接,让连接重新建立起来,这种一般不推荐。

     

  • 相关阅读:
    【洛谷4548】[CTSC2006] 歌唱王国(概率生成函数)
    概率生成函数初探
    【AT4432】[ARC103B] Robot Arms(构造)
    【AT4163】[ARC099D] Eating Symbols Hard(哈希)
    【洛谷5398】[Ynoi2018] GOSICK(莫队二次离线)
    【AT4353】[ARC101D] Robots and Exits(树状数组优化DP)
    【AT5161】[AGC037D] Sorting a Grid(二分图匹配)
    【CF573E】Bear and Bowling(分块维护凸壳)
    【CF611G】New Year and Cake(计算几何)
    【洛谷6791】[SNOI2020] 取石子(斐波那契博弈+数位DP)
  • 原文地址:https://www.cnblogs.com/wangdong/p/9228123.html
Copyright © 2011-2022 走看看