文章目录
MySQL MHA (Master High Availability) 高可用与故障切换
在数据库系统中,确保数据库的高可用性和故障切换是保障系统稳定性的重要环节。MHA (Master High Availability) 是一种用于 MySQL 主从复制架构下的高可用解决方案,它可以实现自动化的故障切换,确保数据库集群的持续可用。本文将详细介绍 MHA 的工作原理、组件及其配置过程。
1. 什么是 MHA?
MHA 是一套专为 MySQL 设计的高可用环境中的自动故障切换和主从复制管理软件。其主要用于解决 MySQL 单点故障问题,保障 MySQL 在主库宕机时能够快速切换到从库,避免数据丢失和长时间宕机。
MHA 的优势:
- 快速故障切换:MHA 能够在 0-30 秒内自动完成主从切换。
- 数据一致性:MHA 能够最大程度上保留主库的二进制日志,确保数据不丢失,保证所有从库的数据与新主库一致。
2. MHA 组件
MHA 主要由两个部分组成:
- MHA Node(数据节点):运行在每个 MySQL 服务器上,负责管理 MySQL 节点的数据状态。
- MHA Manager(管理节点):管理多个 MySQL 主从集群,负责检测主库状态并在主库故障时自动进行故障切换。
3. MHA 的工作原理
MHA 的工作流程可以总结为以下步骤:
- 保存二进制日志:在主库宕机时,MHA 尽可能从主库保存二进制日志(binlog),确保数据不丢失。
- 识别最新数据的从库:通过比较从库的日志,找到含有最新更新的从库。
- 应用中继日志:将差异的中继日志应用于其他从库,确保所有从库的数据一致。
- 切换主库:提升一个从库为新的主库。
- 重建复制关系:将其他从库重新指向新的主库,完成故障切换。
MHA 的特点
- 自动故障切换时,最大限度保证数据不丢失。
- 支持一主多从架构,通常至少需要三台服务器(一个主库,两个从库)。
4. MHA 的搭建与配置
以下是 MHA 部署和配置的完整步骤,以实现 MySQL 的高可用和故障切换。
4.1 实验架构
- MHA Manager:192.168.10.13
- Master:192.168.10.16
- Slave1:192.168.10.14
- Slave2:192.168.10.15
4.2 环境准备
-
关闭防火墙和 SELinux:
systemctl stop firewalld systemctl disable firewalld setenforce 0
-
安装 MySQL:在 Master、Slave1 和 Slave2 节点上安装 MySQL 5.7。
-
修改主机名:
hostnamectl set-hostname Master hostnamectl set-hostname Slave1 hostnamectl set-hostname Slave2
-
修改 MySQL 配置文件
/etc/my.cnf
:-
Master 节点:
[mysqld] server-id = 1 log_bin = master-bin log-slave-updates = true
-
Slave1 节点:
[mysqld] server-id = 2 log_bin = master-bin relay-log = relay-log-bin relay-log-index = slave-relay-bin.index
-
Slave2 节点:
[mysqld] server-id = 3 relay-log = relay-log-bin relay-log-index = slave-relay-bin.index
-
-
创建软链接:
ln -s /usr/local/mysql/bin/mysql /usr/sbin/ ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
4.3 配置 MySQL 主从复制
-
MySQL 授权:
grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by '123456'; grant all privileges on *.* to 'mha'@'192.168.10.%' identified by 'manager'; flush privileges;
-
查看主库状态:
show master status;
-
从库同步操作:
change master to master_host='192.168.10.16', master_user='myslave', master_password='123456', master_log_file='master-bin.000001', master_log_pos=1745; start slave;
-
查看从库同步状态:
show slave status\G
-
设置从库为只读模式:
set global read_only=1;
-
测试数据同步:
在主库插入数据并检查从库是否同步。
4.4 安装 MHA 组件
-
安装 MHA 依赖:
yum install epel-release -y yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
-
安装 MHA Node 组件:
在所有服务器上安装:tar zxvf mha4mysql-node-0.57.tar.gz cd mha4mysql-node-0.57 perl Makefile.PL make && make install
-
安装 MHA Manager 组件(仅 Manager 节点):
tar zxvf mha4mysql-manager-0.57.tar.gz cd mha4mysql-manager-0.57 perl Makefile.PL make && make install
4.5 配置 SSH 免密码认证
在所有节点之间配置 SSH 免密码认证,确保 MHA 可以在各个节点之间自由访问。
4.6 配置 MHA
-
配置 MHA 脚本和虚拟 IP:
在/usr/local/bin/master_ip_failover
中配置虚拟 IP,确保故障切换时能够切换到新的主库。 -
配置 MHA 配置文件
/etc/masterha/app1.cnf
:[server default] manager_log=/var/log/masterha/app1/manager.log master_binlog_dir=/usr/local/mysql/data master_ip_failover_script=/usr/local/bin/master_ip_failover repl_user=myslave repl_password=123456 user=mha ssh_user=root [server1] hostname=192.168.10.16 port=3306 [server2] hostname=192.168.10.14 candidate_master=1 check_repl_delay=0 [server3] hostname=192.168.10.15 port=3306
-
测试 MHA 配置:
-
测试 SSH 无密码认证:
masterha_check_ssh --conf=/etc/masterha/app1.cnf
-
测试 MySQL 主从连接:
masterha_check_repl --conf=/etc/masterha/app1.cnf
-
-
启动 MHA:
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
5. 故障模拟与恢复
5.1 故障模拟
-
在 Master 节点上停止 MySQL:
systemctl stop mysqld
-
查看 MHA 日志,确认从库接管主库:
tail -f /var/log/masterha/app1/manager.log
-
查看从库是否接管虚拟 IP:
ifconfig
5.2 故障修复
-
修复主库:
重启主库并重新加入集群。 -
更新 MHA 配置文件并重新启动:
将原主库重新添加到 MHA 配置文件,并重新启动 MHA 管理服务。
总结
MHA 是一种优秀的 MySQL 高可用解决方案,
anager.log
3. **查看从库是否接管虚拟 IP**:
```bash
ifconfig
5.2 故障修复
-
修复主库:
重启主库并重新加入集群。 -
更新 MHA 配置文件并重新启动:
将原主库重新添加到 MHA 配置文件,并重新启动 MHA 管理服务。
总结
MHA 是一种优秀的 MySQL 高可用解决方案,
能够在主库故障时快速切换并保证数据一致性。通过 MHA 的自动故障切换和主从复制机制,可以确保 MySQL 集群在高并发、高负载的环境下稳定运行,是大规模数据库部署中的重要工具。