Skip to content

MySQL 切换演练

切换演练是 MySQL 高可用运维的重要组成部分,通过定期演练可以验证切换流程的正确性,提高 DBA 团队的应急响应能力,确保在真实故障发生时能够快速、准确地进行切换。本文将详细介绍 MySQL 切换演练的流程和实践,包括计划性切换演练和故障切换演练,兼顾不同 MySQL 版本的差异,帮助 DBA 团队制定和执行有效的切换演练方案。

切换演练概述

1. 切换演练的目的

  • 验证切换流程:验证切换流程的正确性和可行性
  • 提高团队能力:提高 DBA 团队的应急响应能力
  • 发现潜在问题:发现切换过程中可能存在的问题
  • 减少业务影响:减少真实故障发生时的业务中断时间
  • 符合合规要求:满足行业合规要求

2. 切换演练的类型

演练类型特点适用场景
计划性切换演练主库正常运行,按照预定流程进行切换计划性维护前的验证
故障切换演练模拟主库故障,测试故障检测和切换能力故障恢复能力验证
灾难恢复演练模拟数据中心级故障,测试灾备能力灾难恢复能力验证

3. 切换演练的关键要素

  • 演练计划:详细的演练步骤和时间表
  • 演练环境:与生产环境相似的演练环境
  • 演练团队:明确的团队分工和职责
  • 监控和记录:详细监控和记录演练过程
  • 回滚计划:完整的回滚方案
  • 演练评估:演练后的评估和改进

切换演练准备

1. 演练环境准备

1.1 环境要求

  • 与生产环境相似的硬件和软件配置
  • 与生产环境相似的复制拓扑
  • 与生产环境相似的应用负载(可选)
  • 独立的网络环境,避免影响生产环境

1.2 环境搭建

bash
# 搭建演练环境的步骤
1. 准备演练服务器
2. 安装 MySQL 数据库
3. 配置主从复制或 MGR
4. 配置监控和告警
5. 部署应用模拟工具(可选)

2. 演练计划制定

2.1 演练目标

  • 明确演练的具体目标和范围
  • 确定演练的成功标准
  • 确定演练的时间和时长

2.2 演练步骤

  • 详细的演练步骤和时间点
  • 每个步骤的责任人和操作内容
  • 预期结果和验证方法

2.3 回滚计划

  • 详细的回滚步骤
  • 回滚的触发条件
  • 回滚后的验证方法

2.4 沟通计划

  • 演练前的通知范围和方式
  • 演练过程中的沟通渠道
  • 演练后的总结和报告

3. 演练团队准备

3.1 团队分工

角色职责
演练负责人负责演练的整体协调和指挥
DBA 团队负责数据库切换操作
应用团队负责应用切换和验证
监控团队负责监控演练过程
运维团队负责服务器和网络支持
业务团队负责业务验证

3.2 培训和准备

  • 确保所有团队成员了解演练流程
  • 确保所有团队成员掌握必要的技能
  • 准备必要的工具和脚本

计划性切换演练流程

1. 演练前准备

1.1 环境检查

sql
-- 检查主从状态
SHOW SLAVE STATUS\G

-- 检查复制延迟
SHOW GLOBAL STATUS LIKE 'Seconds_Behind_Master';

-- 检查主库状态
SHOW MASTER STATUS;

-- 检查数据库连接
SHOW GLOBAL STATUS LIKE 'Threads_connected';

1.2 应用准备

  • 通知应用团队演练时间
  • 确保应用可以承受短暂的业务中断
  • 准备应用验证脚本

2. 演练执行

2.1 切换前验证

bash
# 记录当前主库状态
mysql -u root -pRoot@123456 -e "SHOW MASTER STATUS\G" > master_status_before.txt

# 记录当前从库状态
mysql -u root -pRoot@123456 -e "SHOW SLAVE STATUS\G" > slave_status_before.txt

# 执行数据一致性检查
pt-table-checksum h=192.168.1.101,u=checksum,p=Checksum@123456 --databases=test

2.2 执行切换

sql
-- 1. 主库锁定表
FLUSH TABLES WITH READ LOCK;

-- 2. 记录主库二进制日志位置
SHOW MASTER STATUS;

-- 3. 从库等待复制完成
SELECT MASTER_POS_WAIT('mysql-bin.000001', 156);

-- 4. 从库停止复制
STOP SLAVE;
RESET SLAVE ALL;

-- 5. 从库解除只读模式
SET GLOBAL read_only = 0;
SET GLOBAL super_read_only = 0;

-- 6. 主库解锁表
UNLOCK TABLES;

-- 7. 主库设置为只读
SET GLOBAL read_only = 1;
SET GLOBAL super_read_only = 1;

-- 8. 主库作为从库连接到新主库
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.102',
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'Repl@123456',
  MASTER_AUTO_POSITION = 1;

-- 9. 启动复制
START SLAVE;

2.3 应用切换

  • 更新应用的数据库连接配置
  • 重启应用或刷新连接池
  • 验证应用连接

2.4 切换后验证

sql
-- 验证新主库状态
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Queries';

-- 测试写操作
CREATE DATABASE test_switchover_drill;
CREATE TABLE test_switchover_drill.test_table (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20));
INSERT INTO test_switchover_drill.test_table (name) VALUES ('drill_test');
SELECT * FROM test_switchover_drill.test_table;

-- 验证从库复制状态
SHOW SLAVE STATUS\G;

3. 演练后处理

3.1 恢复原拓扑(可选)

sql
-- 1. 新主库锁定表
FLUSH TABLES WITH READ LOCK;

-- 2. 原主库等待复制完成
SELECT MASTER_POS_WAIT('mysql-bin.000001', 156);

-- 3. 原主库停止复制
STOP SLAVE;
RESET SLAVE ALL;

-- 4. 原主库解除只读模式
SET GLOBAL read_only = 0;
SET GLOBAL super_read_only = 0;

-- 5. 新主库解锁表
UNLOCK TABLES;

-- 6. 新主库设置为只读
SET GLOBAL read_only = 1;
SET GLOBAL super_read_only = 1;

-- 7. 新主库作为从库连接到原主库
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.101',
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'Repl@123456',
  MASTER_AUTO_POSITION = 1;

-- 8. 启动复制
START SLAVE;

3.2 演练总结

  • 记录演练过程中的问题和解决方案
  • 评估演练的成功与否
  • 提出改进建议
  • 编写演练报告

故障切换演练流程

1. 演练前准备

1.1 环境检查

sql
-- 检查主从状态
SHOW SLAVE STATUS\G

-- 检查复制延迟
SHOW GLOBAL STATUS LIKE 'Seconds_Behind_Master';

-- 检查监控状态
-- 确保监控系统正常运行

1.2 故障模拟准备

bash
# 准备故障模拟工具和脚本
# 1. 网络中断模拟脚本
# 2. MySQL 进程终止脚本
# 3. 服务器关机脚本

2. 演练执行

2.1 故障模拟

bash
# 模拟主库网络中断
iptables -A INPUT -s 192.168.1.102 -p tcp --dport 3306 -j DROP

# 或模拟 MySQL 进程终止
pkill -9 mysqld

# 或模拟服务器关机
echo b > /proc/sysrq-trigger

2.2 故障检测

sql
-- 监控系统检测到主库故障
-- 记录故障检测时间

-- 从库检查主库状态
SHOW SLAVE STATUS\G;

-- 检查从库是否自动提升为主库(如果配置了自动切换)
SHOW GLOBAL VARIABLES LIKE 'read_only';

2.3 手动切换(如果自动切换失败)

sql
-- 1. 选择合适的从库
-- 2. 停止从库复制
STOP SLAVE;
RESET SLAVE ALL;

-- 3. 从库解除只读模式
SET GLOBAL read_only = 0;
SET GLOBAL super_read_only = 0;

-- 4. 如果使用 GTID 复制,确保所有事务已提交
SET @@GLOBAL.gtid_purged = (SELECT @@GLOBAL.gtid_executed);

2.4 应用切换和验证

  • 更新应用的数据库连接配置
  • 重启应用或刷新连接池
  • 验证应用连接和业务功能

2.5 其他从库重新指向新主库

sql
-- 其他从库停止复制
STOP SLAVE;

-- 重置从库复制信息
RESET SLAVE ALL;

-- 重新指向新主库
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.102',
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'Repl@123456',
  MASTER_AUTO_POSITION = 1;

-- 启动复制
START SLAVE;

-- 验证复制状态
SHOW SLAVE STATUS\G;

3. 演练后处理

3.1 故障恢复

bash
# 恢复主库网络
iptables -D INPUT -s 192.168.1.102 -p tcp --dport 3306 -j DROP

# 或重启 MySQL 进程
systemctl start mysqld

# 或重启服务器
# 服务器自动重启

3.2 原主库重新加入集群

sql
-- 原主库作为从库连接到新主库
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.102',
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'Repl@123456',
  MASTER_AUTO_POSITION = 1;

-- 启动复制
START SLAVE;

-- 验证复制状态
SHOW SLAVE STATUS\G;

3.3 演练总结

  • 记录故障检测时间和切换时间
  • 分析故障切换过程中的问题
  • 评估故障切换的效果
  • 提出改进建议
  • 编写演练报告

不同 MySQL 版本的切换演练差异

MySQL 5.6

  • 复制延迟可能较高,影响切换演练的效果
  • GTID 支持有限,切换流程复杂
  • 自动切换方案选择有限
  • 监控和管理工具相对简单

MySQL 5.7

  • 增强了 GTID 复制的可靠性,切换流程简化
  • 支持基于逻辑时钟的并行复制,减少复制延迟
  • 支持更多自动切换方案
  • 增强了监控和管理工具

MySQL 8.0

  • 引入了 MGR,原生支持自动故障切换
  • 增强了 GTID 复制的性能
  • 支持基于 WRITESET 的并行复制,进一步减少复制延迟
  • 与 MGR 集成良好,支持自动故障切换
  • 增强了监控和管理工具

切换演练最佳实践

1. 演练计划

  • 制定详细的演练计划和回滚计划
  • 选择合适的演练时间,避免业务高峰期
  • 提前通知相关团队和业务方
  • 明确演练的目标和范围

2. 演练环境

  • 使用与生产环境相似的演练环境
  • 定期更新演练环境,确保与生产环境一致
  • 隔离演练环境,避免影响生产环境

3. 演练执行

  • 严格按照演练计划执行
  • 详细记录演练过程和时间点
  • 实时监控演练过程,及时处理异常
  • 执行完整的回滚测试

4. 演练评估

  • 演练后进行全面评估
  • 分析演练过程中的问题和改进点
  • 编写详细的演练报告
  • 跟踪改进措施的落实

5. 自动化辅助

  • 使用自动化工具辅助演练
  • 编写自动化脚本,减少人为错误
  • 利用监控工具记录演练过程
  • 实现演练结果的自动分析

切换演练工具

1. pt-switchover

1.1 工具介绍

pt-switchover 是 Percona Toolkit 中的一个工具,用于自动化 MySQL 主从切换,支持计划性切换和故障切换。

1.2 使用示例

bash
# 计划性切换演练
pt-switchover --master-host=192.168.1.101 --master-port=3306 --master-user=root --master-password=Root@123456 \
--slave-host=192.168.1.102 --slave-port=3306 --slave-user=root --slave-password=Root@123456 \
--force --verbose --dry-run

# 实际执行切换
pt-switchover --master-host=192.168.1.101 --master-port=3306 --master-user=root --master-password=Root@123456 \
--slave-host=192.168.1.102 --slave-port=3306 --slave-user=root --slave-password=Root@123456 \
--force --verbose

2. Orchestrator

2.1 工具介绍

Orchestrator 是一个开源的 MySQL 复制拓扑管理工具,支持自动故障切换、复制拓扑管理和可视化监控。

2.2 使用示例

bash
# 使用 Orchestrator 进行手动切换
curl -X POST -u admin:Admin@123456 "http://orchestrator:3000/api/switchover?master=192.168.1.101:3306&slave=192.168.1.102:3306"

# 使用 Orchestrator 进行故障切换
curl -X POST -u admin:Admin@123456 "http://orchestrator:3000/api/recover?instance=192.168.1.101:3306"

3. MGR 自动切换

3.1 工具介绍

MGR 是 MySQL 8.0 引入的原生高可用方案,支持自动故障切换。

3.2 演练示例

sql
-- 查看 MGR 状态
SELECT * FROM performance_schema.replication_group_members;

-- 模拟主库故障
pkill -9 mysqld

-- 查看 MGR 自动切换结果
SELECT * FROM performance_schema.replication_group_members;

切换演练常见问题与解决方案

1. 演练环境与生产环境不一致

症状:演练环境与生产环境的配置或拓扑不一致,导致演练结果不可靠

解决方案

  • 定期更新演练环境,确保与生产环境一致
  • 使用配置管理工具同步配置
  • 建立演练环境的自动构建机制

2. 演练过程中出现意外问题

症状:演练过程中出现预期之外的问题,影响演练进度

解决方案

  • 制定详细的回滚计划
  • 提前准备应急方案
  • 演练团队保持沟通,及时处理问题

3. 切换时间超过预期

症状:切换时间超过预期,影响业务可用性

解决方案

  • 优化切换流程,减少切换步骤
  • 提高团队的操作熟练度
  • 考虑使用自动化工具

4. 应用切换失败

症状:数据库切换成功,但应用无法连接或功能异常

解决方案

  • 提前测试应用的切换兼容性
  • 优化应用的连接管理
  • 实现应用的自动重连机制

总结

切换演练是 MySQL 高可用运维的重要组成部分,通过定期演练可以验证切换流程的正确性,提高 DBA 团队的应急响应能力。计划性切换演练和故障切换演练是两种主要的演练类型,需要根据实际需求选择合适的演练方式。不同 MySQL 版本的切换演练流程略有差异,需要根据实际版本进行调整。

在进行切换演练时,需要注意以下几点:

  1. 制定详细的演练计划和回滚计划
  2. 使用与生产环境相似的演练环境
  3. 严格按照演练计划执行
  4. 详细记录演练过程和时间点
  5. 演练后进行全面评估和总结
  6. 跟踪改进措施的落实

通过合理的切换演练,可以确保在真实故障发生时,DBA 团队能够快速、准确地进行切换,减少业务中断时间,提高系统的可用性。