生产环境中MySQL数据库的高可用是保障业务稳定运行的核心需求,MHA作为成熟的开源高可用解决方案,能够在不影响业务的前提下实现主库故障自动切换。

MHA集群核心组件介绍
MHA全称Master High Availability,由日本DeNA公司开发,主要包含两个核心组件,分别是管理节点(Manager)和数据节点(Node)。
- Manager节点:负责整个集群的管理工作,包括主库状态监控、故障检测、自动切换决策、切换后从库同步关系调整等,通常部署在独立的服务器上,也可以和其他从库部署在同一台机器。
- Node节点:部署在每一台MySQL服务器上,负责执行Manager下发的指令,比如主库宕机后保存二进制日志、应用差异中继日志、切换主从关系等。
部署前置条件准备
在正式部署MHA集群前,需要完成以下基础准备工作:
- 准备至少3台服务器,1台作为主库,2台作为从库,另外可以单独准备1台作为Manager节点,所有服务器之间网络互通。
- 所有MySQL实例版本保持一致,建议5.7及以上版本,开启二进制日志,设置server_id且每台实例的server_id唯一。
- 所有服务器之间配置SSH免密登录,Manager节点需要能够免密登录所有MySQL节点,所有MySQL节点之间也需要互相免密登录。
- 所有从库开启中继日志,并且设置read_only参数,避免从库被误写入数据。
MySQL主从复制配置示例
首先完成主从复制的基础配置,主库配置文件添加如下内容:
[mysqld] server_id=1 log_bin=mysql-bin binlog_format=row expire_logs_days=7
从库配置文件添加如下内容:
[mysqld] server_id=2 log_bin=mysql-bin relay_log=relay-bin read_only=1
主库创建用于主从复制的账号:
CREATE USER 'repl'@'192.168.0.%' IDENTIFIED BY 'repl_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%'; FLUSH PRIVILEGES;
从库执行主从同步命令:
CHANGE MASTER TO MASTER_HOST='192.168.0.10', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE;
MHA软件安装
所有节点都需要安装MHA Node,Manager节点额外安装MHA Manager,安装前需要先安装依赖包。
依赖包安装
CentOS系统下执行以下命令安装依赖:
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-MakeMaker
Node节点安装
下载MHA Node安装包后执行安装:
tar -zxvf mha4mysql-node-0.58.tar.gz cd mha4mysql-node-0.58 perl Makefile.PL make && make install
Manager节点安装
Manager节点需要先安装Node,再安装Manager:
tar -zxvf mha4mysql-manager-0.58.tar.gz cd mha4mysql-manager-0.58 perl Makefile.PL make && make install
MHA配置文件编写
Manager节点需要创建MHA的配置文件,通常放在/etc/masterha/目录下,示例配置如下:
[server default] manager_log=/var/log/mha/app1/manager.log manager_workdir=/var/log/mha/app1 master_binlog_dir=/var/lib/mysql user=root password=root_password ping_interval=1 remote_workdir=/tmp repl_user=repl repl_password=repl_password ssh_user=root [server1] hostname=192.168.0.10 port=3306 master_binlog_dir=/var/lib/mysql [server2] hostname=192.168.0.11 port=3306 candidate_master=1 [server3] hostname=192.168.0.12 port=3306 no_master=1
配置说明:candidate_master=1表示该节点有资格成为新的主库,no_master=1表示该节点永远不会成为主库。
MHA集群检查与启动
配置完成后需要先检查SSH连通性和主从复制状态。
SSH连通性检查
masterha_check_ssh --conf=/etc/masterha/app1.cnf
如果输出所有节点SSH检查通过,说明免密配置正常。
主从复制状态检查
masterha_check_repl --conf=/etc/masterha/app1.cnf
检查通过后输出MySQL Replication Health is OK,说明主从复制状态正常。
启动MHA Manager
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
启动后可以通过masterha_check_status --conf=/etc/masterha/app1.cnf查看集群运行状态。
故障切换验证
可以手动停止主库的MySQL服务,模拟主库故障,观察MHA的切换过程。
systemctl stop mysqld
查看Manager节点的日志,可以看到MHA检测到主库故障后,自动选举了新的主库,并且将其他从库的主库指向切换到了新主库,整个切换过程通常在几十秒内完成,业务侧只需要重新建立数据库连接即可恢复服务。
注意事项
- 切换完成后需要及时修复故障的原主库,将其作为从库加入集群,并且更新MHA配置文件。
- 生产环境中建议将MHA Manager也做高可用,避免Manager节点单点故障。
- 定期检查MHA的运行日志,及时发现潜在问题。
- 如果业务写入量较大,需要评估切换过程中可能的二进制日志丢失风险,必要时可以结合半同步复制使用。