mysql-replay复制mysql流量到Tidb6.X

使用说明
编译安装

git clone https://github.com/zyguan/mysql-replay.git && cd mysql-replay
git checkout dev
go build

离线回放
先通过 tcpdump 到指定节点抓取数据库访问流量,获得 pcap 文件。
Tips: 可以通过 -G 和 -W 参数指定抓取的时间。
通过 mysql-replay replay 子命令离线回放
Replay pcap files

Usage:
mysql-replay replay [flags]

Flags:
–conn-cache-size uint packet cache size for each connection
–dry-run dry run mode (just print statements)
-h, --help help for replay
–ports ints ports to filter in (default [4000])
–speed float replay speed ratio (default 1)
–target-dsn string target dsn

Global Flags:
–log-level string log level (default “info”)
–log-output strings log output (default [stdout])

–dry-run 和 --target-dsn 需要选填一个:dry-run 指输出要执行的 sql 不实际连接数据库进行回放;target-dsn 格式需符合 go-sql-driver 规范。
–speed 用于控制回放速度,1 表示原速回放,0.5 和 2 分别表示半速和 2 倍速回放,0 表示全速,即能执行多快执行多快(受限于 target db)。
–ports 指定端口过滤条件,可理解为 bpf 过滤表达式 tcp port 。
在线回放
通过 mysql-replay serve 子命令启动 replay server
Serve for replay requests

Usage:
mysql-replay serve [flags]

Flags:
–addr string address to listen on (default “:5000”)
–archive-dir string directory to save dumped files (default “archives”)
–conn-cache-size uint packet cache size for each connection (default 128)
–dry-run dry run mode (just print statements)
-h, --help help for serve
–meta string path to meta data (default “meta.db”)
–ports ints ports to filter in (default [4000])
–speed float replay speed ratio (default 1)
–target-dsn string target dsn

Global Flags:
–log-level string log level (default “info”)
–log-output strings log output (default [stdout])

在需要截获流量的节点上启动 tcpdump ,并设置 post rotate action 脚本,脚本中通过 mysql-replay notify 子命令来通知 replay server ,可参考 tcpdump 简要说明 。
文本格式导出与回放
为了方便将用户场景导出、脱敏、带回到我们内部进行测试,新版本 mysql-replay 支持文本格式导出与回放(文本格式还支持 prepared statement ),可通过 text <dump|play> 进行操作。
文本格式定义
mysql-replay 能将 pcap 中的 mysql 报文解析成一系列逻辑事件 (MySQLEvent) ,目前主要支持 Query, StmtPrepare, StmtExecute 等类型,基本能覆盖绝大多数应用场景。导出格式是:每个 session 对应一个文件,文件中每行对应一个 event ,event 序列化格式类似如下 tsv

1629093374259 0 “test”
1629093374283 3 1 “SELECT c_discount, c_last, c_credit, w_tax FROM customer, warehouse WHERE w_id = ? AND c_w_id = w_id AND c_d_id = ? AND c_id = ?”
1629093374706 2 “START TRANSACTION”
1629093374709 4 1 [iii 23 6 2255
1629093374755 2 “COMMIT”

导出文本

mysql-replay text dump [–force-start] -o

参数说明:
–force-start 默认情况下 mysql-replay 会要求一个 session 从 tcp 建立连接开始,如果抓包时连接已存在则会忽略,指定改选项可以强行让 mysql-replay 处理这些连接(从连接中间开始处理可能会产生一些异常状态)。
输出的目录,每个 session 会生成一个文件,文件名为 ...tsv 。
输入的 pcap 文件列表,指定多个文件时需要保证这些文件连续。
执行文本

mysql-replay text play [flags]

flags:
–dry-run dry run mode (just print events)
–max-line-size int max line size (default 16777216)
–query-timeout duration timeout for a single query (default 1m0s)
–report-interval duration report interval (default 5s)
–speed float speed ratio (default 1)
–target-dsn string target dsn

参数说明
导出的文本目录
dry-run 仅打印要执行的 sql 不实际执行。
max-line-size 默认输入文件单行不能超过 16M,否则需要通过该参数设置更大的值。
query-timeout 单个 query 的超时时间,mysql-replay 会主动放弃超时的 query 。
report-interval 统计输出的频率,默认 5s 输出一条。
speed 回放速率,1 表示原始速度,1.5 表示 1.5 倍速,0 表示不限速。
target-dsn 目标数据库地址,格式见 go-sql-driver ,注意需要指定 dbname 。

1 个赞