MTR全称MySQL Test Run,是MySQL官方提供的自动化测试框架,原本主要用于单实例MySQL的功能与回归测试,经过适配后也可以很好地服务于MySQL数据库集群的测试工作,覆盖集群部署验证、故障模拟、功能校验等多个核心场景。

MTR框架核心特性
MTR基于Perl脚本实现,核心能力包括用例批量执行、结果自动比对、测试环境自动初始化与清理,原生支持单实例MySQL的启动、停止与配置修改。在集群场景下,只需要扩展节点管理逻辑,就可以实现多节点集群的测试调度。
原生MTR的适配点
- 支持同时管理多个MySQL实例的启停,适配集群多节点架构
- 可以自定义集群初始化脚本,完成主从复制、组复制等集群模式的搭建
- 提供结果校验机制,可对比多个节点的数据一致性
MySQL集群中部署MTR的步骤
以下以MySQL组复制集群为例,说明MTR的部署流程。
环境准备
首先需要在测试服务器上安装Perl运行环境,然后获取对应MySQL版本的MTR源码,通常位于MySQL源码包的mysql-test目录下。同时准备好三个MySQL实例的安装包,分别作为组复制集群的三个节点。
配置文件调整
修改MTR的全局配置文件,添加集群节点的基础配置模板,示例配置如下:
[group_replication_node1] basedir=/usr/local/mysql datadir=/data/mysql/node1 port=3306 server_id=1 gtid_mode=ON enforce_gtid_consistency=ON group_replication_single_primary_mode=ON [group_replication_node2] basedir=/usr/local/mysql datadir=/data/mysql/node2 port=3307 server_id=2 gtid_mode=ON enforce_gtid_consistency=ON group_replication_single_primary_mode=ON [group_replication_node3] basedir=/usr/local/mysql datadir=/data/mysql/node3 port=3308 server_id=3 gtid_mode=ON enforce_gtid_consistency=ON group_replication_single_primary_mode=ON
初始化集群测试环境
编写MTR的初始化脚本,实现三个节点的依次启动与组复制配置,脚本核心逻辑如下:
# 启动第一个节点并初始化组复制
system("$basedir/bin/mysqld --defaults-file=node1.cnf --initialize-insecure");
system("$basedir/bin/mysqld --defaults-file=node1.cnf --daemonize");
# 执行组复制初始化SQL
my $node1_conn = DBI->connect("DBI:mysql:host=127.0.0.1;port=3306", "root", "");
$node1_conn->do("SET SQL_LOG_BIN=0");
$node1_conn->do("CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_pass'");
$node1_conn->do("GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'");
$node1_conn->do("SET SQL_LOG_BIN=1");
$node1_conn->do("CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl_pass' FOR CHANNEL 'group_replication_recovery'");
$node1_conn->do("INSTALL PLUGIN group_replication SONAME 'group_replication.so'");
$node1_conn->do("SET GLOBAL group_replication_bootstrap_group=ON");
$node1_conn->do("START GROUP_REPLICATION");
$node1_conn->do("SET GLOBAL group_replication_bootstrap_group=OFF");
# 启动第二个、第三个节点并加入集群
# 逻辑与第一个节点类似,省略重复代码
集群场景下的MTR用例编写
适配完成后,就可以编写针对集群的测试用例,常见测试场景包括数据同步验证、故障切换测试、数据一致性校验等。
数据同步测试用例
用例目标:验证主节点写入数据后,从节点可以正常同步。用例代码如下:
--source include/group_replication_init.inc # 主节点写入数据 connection node1; CREATE DATABASE test_db; USE test_db; CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20)); INSERT INTO t1 VALUES (1, 'test_data'); # 等待从节点同步 sleep 2; # 校验从节点数据 connection node2; USE test_db; SELECT * FROM t1; # 预期结果:返回1行数据,id为1,name为test_data --source include/group_replication_cleanup.inc
节点故障模拟测试
用例目标:验证主节点故障后,集群可以自动选举新主节点。用例核心逻辑如下:
# 获取当前主节点
my $master = get_group_replication_primary();
# 停止主节点
stop_mysql_server($master);
# 等待集群选举新主
sleep 5;
# 获取新主节点
my $new_master = get_group_replication_primary();
# 校验新主节点可用
my $conn = DBI->connect("DBI:mysql:host=127.0.0.1;port=$new_master->{port}", "root", "");
$conn->do("CREATE TABLE test_db.t2 (id INT)");
# 重启原主节点,验证可以重新加入集群
start_mysql_server($master);
sleep 3;
# 校验原主节点状态为ONLINE
测试注意事项
- 测试前需要清理历史测试数据,避免残留数据影响结果准确性
- 故障模拟测试后需要及时恢复集群状态,保证后续用例正常执行
- 集群节点的端口、数据目录需要提前规划,避免端口冲突
- 结果校验时需要考虑同步延迟,适当增加等待时间
通过合理适配MTR框架,可以大幅降低MySQL集群的测试成本,覆盖更多边界场景,提升集群运行的稳定性。实际使用中可以根据业务需求扩展更多测试场景,完善集群测试体系。