ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MySQL高可用集群实战:MHA配置与故障切换详解

MySQL高可用集群实战:MHA配置与故障切换详解

1. MySQL高可用集群环境搭建实战:MHA配置详解

在数据库运维领域,高可用性一直是核心需求之一。最近我在生产环境部署了一套基于MHA(Master High Availability)的MySQL高可用解决方案,经历了从环境准备到故障切换的全过程。本文将详细记录这次实战经验,特别适合需要构建MySQL高可用架构的DBA和运维工程师参考。

MHA是一套成熟的MySQL高可用解决方案,能在主库发生故障时,快速自动地将数据最新的从库提升为新主库,并让其他从库自动指向新主库。相比传统的主从切换方案,MHA的最大优势是能够最大程度保证数据一致性,通常只需10-30秒即可完成故障转移。下面我就从环境准备开始,逐步展示整个配置过程。

2. 环境准备与基础配置

2.1 实验环境规划

我们采用四台服务器搭建测试环境,具体规划如下:

设备主机名IP地址角色说明
主机1MYSQL1192.168.220.33初始主库(Master)
主机2MYSQL2192.168.220.34从库(Slave),候选主库
主机3MYSQL3192.168.220.35从库(Slave),仅作为从库
主机4MHA192.168.220.36MHA管理节点

注意:在实际生产环境中,建议将MHA管理节点部署在独立服务器上,避免与MySQL实例争抢资源。同时,所有节点的时间必须同步,建议配置NTP服务。

2.2 MySQL主从复制配置

在安装MHA之前,需要先建立好MySQL主从复制环境。以下是关键步骤:

  1. 主库配置(MYSQL1):
# 编辑my.cnf文件 [mysqld] server-id = 1 log-bin = mysql-bin binlog_format = ROW gtid_mode = ON enforce_gtid_consistency = ON binlog_group_commit_sync_delay = 100 binlog_group_commit_sync_no_delay_count = 10
  1. 从库配置(MYSQL2和MYSQL3):
[mysqld] server-id = 2 # MYSQL2设为2,MYSQL3设为3 log-bin = mysql-bin binlog_format = ROW gtid_mode = ON enforce_gtid_consistency = ON log_slave_updates = ON read_only = ON
  1. 创建复制账号: 在主库上执行:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  1. 配置主从关系: 在每个从库上执行:
CHANGE MASTER TO MASTER_HOST='192.168.220.33', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_AUTO_POSITION=1; START SLAVE;

3. MHA管理节点安装与配置

3.1 安装必要组件

首先在MHA管理节点上安装所需软件包:

# 安装基础依赖 dnf install perl perl-DBD-MySQL perl-CPAN -y # 通过CPAN安装额外Perl模块 cpan install Config::Tiny install Log::Dispatch install Mail::Sender install Parallel::ForkManager exit # 安装MHA管理包 rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm \ mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps

经验分享:安装Mail::Sender时,当提示"Specify defaults for Mail::Sender?"选择y,然后编码选择n。其他模块安装直接按回车使用默认选项即可。

3.2 在所有节点安装MHA Node包

需要在所有MySQL节点上安装mha4mysql-node包:

for i in 33 34 35; do scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@192.168.220.$i:/root/ ssh root@192.168.220.$i "rpm -ivh /root/mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps" done

3.3 修改MHA检测代码

为避免版本检测问题,需要修改NodeUtil.pm文件:

vim /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm # 注释掉以下代码段 # sub parse_mysql_major_version($) { # my $str = shift; # my $result = sprintf( '%03d%03d', $str =~ m/(\d+)/g ); # return $result; # }

4. MHA配置文件详解

4.1 创建配置文件模板

mkdir -p /etc/masterha tar zxf mha4mysql-manager-0.58.tar.gz cd mha4mysql-manager-0.58 cat samples/conf/masterha_default.cnf samples/conf/app1.cnf > /etc/masterha/app1.cnf

4.2 配置文件关键参数解析

以下是经过优化的配置文件示例:

[server default] user=root password=your_mysql_root_password ssh_user=root repl_user=repl repl_password=repl_password master_binlog_dir=/var/lib/mysql remote_workdir=/tmp secondary_check_script=masterha_secondary_check -s 192.168.220.33 -s 192.168.220.34 ping_interval=3 manager_workdir=/etc/masterha manager_log=/etc/masterha/mha.log [server1] hostname=192.168.220.33 candidate_master=1 check_repl_delay=0 [server2] hostname=192.168.220.34 candidate_master=1 check_repl_delay=0 [server3] hostname=192.168.220.35 no_master=1

关键参数说明:

  • candidate_master=1:标记该节点为候选主库
  • check_repl_delay=0:不检查复制延迟
  • no_master=1:该节点永远不会被提升为主库
  • secondary_check_script:用于多路径检测主库是否真的宕机

5. MHA运行与测试

5.1 检查复制集群状态

masterha_check_repl --conf=/etc/masterha/app1.cnf

正常输出应显示所有节点状态正常,类似如下:

Fri Feb 27 16:23:51 2026 - [info] Alive Servers: Fri Feb 27 16:23:51 2026 - [info] 192.168.220.33(192.168.220.33:3306) Fri Feb 27 16:23:51 2026 - [info] 192.168.220.34(192.168.220.34:3306) Fri Feb 27 16:23:51 2026 - [info] 192.168.220.35(192.168.220.35:3306)

5.2 主库无故障切换测试

masterha_master_switch \ --conf=/etc/masterha/app1.cnf \ --master_state=alive \ --new_master_host=192.168.220.34 \ --new_master_port=3306 \ --orig_master_is_new_slave \ --running_updates_limit=10000

切换过程中会提示确认,输入"yes"继续。切换完成后,可以检查各从库状态确认是否已指向新主库。

5.3 主库故障模拟与自动切换

  1. 启动MHA监控:
masterha_manager --conf=/etc/masterha/app1.cnf &
  1. 模拟主库故障:
# 在主库上执行 /etc/init.d/mysqld stop
  1. 观察MHA日志:
tail -f /etc/masterha/mha.log

正常情况下,MHA会在30秒内完成故障检测和主从切换。

6. 故障恢复与日常维护

6.1 故障恢复流程

当原主库修复后,需要重新加入集群:

  1. 删除failover标记文件:
rm -f /etc/masterha/app1.failover.complete
  1. 启动原主库MySQL服务:
/etc/init.d/mysqld start
  1. 配置为从库指向新主库:
CHANGE MASTER TO MASTER_HOST='192.168.220.34', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_AUTO_POSITION=1; START SLAVE;

6.2 日常维护建议

  1. 定期检查:使用masterha_check_repl定期检查集群状态
  2. 日志监控:监控MHA日志文件/etc/masterha/mha.log
  3. 邮件报警:配置report_script参数实现故障邮件通知
  4. VIP切换:结合master_ip_failover_script实现虚拟IP自动漂移

7. 常见问题与解决方案

7.1 SSH连接问题

问题现象:MHA无法通过SSH连接到MySQL节点

解决方案:

  1. 确保所有节点间配置了SSH免密登录
  2. 检查ssh_user参数是否正确
  3. 测试SSH连接:ssh root@192.168.220.33 date

7.2 复制延迟导致切换失败

问题现象:切换时因复制延迟被中止

解决方案:

  1. 设置check_repl_delay=0临时忽略延迟检查
  2. 优化MySQL参数减少复制延迟
  3. 对于确实延迟较大的从库,设置no_master=1

7.3 切换后应用连接问题

问题现象:切换后应用仍连接旧主库

解决方案:

  1. 实���读写分离中间件(如ProxySQL)
  2. 使用DNS别名或虚拟IP
  3. 配置应用连接字符串自动更新机制

在实际生产环境中部署MHA时,建议先在测试环境充分验证,并制定详细的回滚方案。同时,MHA应与数据库监控系统集成,确保能及时发现和处理故障。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进