主备延迟的模拟
1. 基本工具的安装
1.1 安装 percona-toolkit
这玩意儿工具挺全,有时间可以深入了解一下,我的系统是 debian,流程如下:
# 下载软件包
wget https://downloads.percona.com/downloads/percona-toolkit/3.3.0/binary/debian/buster/x86_64/percona-toolkit_3.3.0-1.buster_amd64.deb
# 安装,注意路径
apt install ./percona-toolkit_3.3.0-1.buster_amd64.deb
# 校验,随便一个模块 --version,这里选用 pt-find 模块
pt-find --version
如果你的系统不是,到官网获取对应的资源包再安装。
1.2 安装 sysbench
这个也很方便就可以安装:
# 关联仓库
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | bash
# 安装
apt -y install sysbench
一些基本参数(来源于网络)说明:
--threads=4500 表示发起4500个并发连接
--oltp-read-only=off 表示不要进行只读测试,也就是会采用读写混合模式测试
--report-interval=10 表示每10秒输出一次测试进度报告
--rand-type=uniform 表示随机类型为固定模式,其他几个可选随机模式:uniform,gaussian,special,pareto
--time=120 表示最大执行时长为 120 秒
--max-requests=0 表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长
--tables=10 表示10个表
--table-size=100000 单表100000条记录
--percentile=99 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值
SQL statistics:
queries performed:
read: 0 读操作
write: 233015 --写总数
other: 197026 --其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等)
total: 430041 --全部总数
transactions: 62617 (486.84 per sec.) --总事务数(每秒事务数)
queries: 430041 (3343.55 per sec.) --查询数(每秒查询数)
ignored errors: 27087 (210.60 per sec.) --忽略错误数
reconnects: 0 (0.00 per sec.) --重新连接次数
General statistics:
total time: 128.6147s --运行总时间
total number of events: 62617 --事件总数
Latency (ms):
min: 2.09
avg: 8957.64
max: 99069.80
95th percentile: 27846.48
sum: 560900840.54
Threads fairness: #线程平均数
events (avg/stddev): 13.9149/3.92
execution time (avg/stddev): 124.6446/2.39
详细说明看sysbench --help
输出即可。
**【注】**sysbench 自带一些测试的 lua 脚本,脚本所在目录 /usr/share/sysbench
(后面会用到)。sysbench对数据库进行压力测试的过程分为3个阶段:prepare 阶段,做准备的、比较说建立好测试用的表、并向表中填充数据;run 阶段,去跑压力测试的SQL;cleanup 阶段,清除数据的,即drop掉prepare阶段初始化好的表,下面是一个完整阶段的示例:
# 建表,初始化数据
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=ms_rep oltp_insert prepare
# 跑SQL,输出报告
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=ms_rep oltp_read_write run
# 清除测试数据
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=ms_rep oltp_read_write cleanup
上述过程如果执行报错:
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
FATAL: unable to connect to MySQL server on host '127.0.0.1', port 3306, aborting...
FATAL: error 1045: Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
FATAL: `sysbench.cmdline.call_command' function failed: ./oltp_common.lua:83: connection creation failed
解决方式,更改加密方式:
# 更新用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
# 更新用户的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
# 刷新权限
FLUSH PRIVILEGES;
上述已经打包好了镜像,可以直接使用docker pull registry.cn-shanghai.aliyuncs.com/hhu/mysql:wgl_8.0.24
。
2. 搭建延迟监控
先创建好一个测试的数据库 ms_rep,然后
# 主库:创建后台不断更改心跳表的线程
pt-heartbeat --user=root --ask-pass --host=127.0.0.1 --create-table -D ms_rep --interval=1 --update --replace --daemonize
# 验证后台线程正常在跑,必须验证
pgrep -fla pt-heartbeat
# 关闭后台线程(结束时执行)
pt-heartbeat --stop
# 从库:监控延迟,-h 后指定的是从库的地址,建议在各个从库执行,这样观察更直观
pt-heartbeat --user=root --ask-pass --host=127.0.0.1 --table=heartbeat --monitor -D ms_rep
通常刚建立的延迟监控输出都为0.00s [ 0.00s, 0.00s, 0.00s ]
,这时通过 sysbench 在 master 上生成不同的数据观察延迟即可。
# 在 master 上生成数据以便观察 binlog 重放的延迟
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=ms_rep --table-size=1000000 oltp_insert prepare
测试结果:
插入的记录数 延迟时间
1000 0
2000 0
2W 0
3W 0
4W 0.99
5W 0.9,1.0
6W 1
7W 1, 0.99
8W 1,1
9W 0.99, 1, 1
10W 1,1
11W 1,1,1
**【注】**在执行完pt-heartbeat --stop
后会提示创建文件/tmp/pt-heartbeat-sentinel
,下次再建立监控时必须删除此文件,否则会跑一下就挂了。在从节点建立监控后会出现类似于 5s [ 0.25s, 0.05s, 0.02s ]
标识延迟时间,默认是1m内、5m内、15m内的时间段,通过参数--frames
指定。
心跳表无须手动创建,指定参数--create-table
即可,心跳表的定义如下:
CREATE TABLE heartbeat (
ts varchar(26) NOT NULL,
server_id int unsigned NOT NULL PRIMARY KEY,
file varchar(255) DEFAULT NULL, -- SHOW MASTER STATUS
position bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS
relay_master_log_file varchar(255) DEFAULT NULL, -- SHOW SLAVE STATUS
exec_master_log_pos bigint unsigned DEFAULT NULL -- SHOW SLAVE STATUS
);