
目录1什么是 MHA2MHA 的组成3.MHA 的特点4.搭建 MySQL MHA环境设置配置 MySQL 主从复制1. 修改 MySQL 配置文件 (/etc/my.cnf)2. 创建软链接3. 配置主从复制安装 MHA 软件1. 安装依赖环境2.安装 MHA Node 组件3..安装 MHA Manager 组件配置无密码 SSH 认证1.在 Manager 节点上2.在 Master 节点上3.在 Slave1 节点上4.在 Slave2 节点上在 Manager 节点上配置 MHA1. 准备脚本和目录2. 修改 VIP 切换脚本 (/usr/local/bin/master_ip_failover)3. 修改 MHA 配置文件 (/etc/masterha/app1.cnf)4. 手动开启虚拟 IP测试与启动 MHA1. 测试 SSH 无密码认证2.测试 MySQL 主从复制3. 启动 MHA Manage实验1什么是MHAMHAMaster High Availability是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。MHA的出现就是解决MySQL单点的问题。MySQL故障切换过程中MHA能做到0-30秒内自动完成故障切换操作。MHA能在故障切换的过程中最大程度上保证数据的一致性以达到真正意义上的高可用。2MHA的组成MHA Node数据节点MHA Node运行在每台MySQL服务器上。MHA Manager管理节点检测MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群也可以部署在一台slave节点上。MHA Manager会定时探测集群中的master节点。当master出现故障时它可以自动将最新数据的slave提升为新的master然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。3.MHA的特点自动故障切换过程中MHA试图从宕机的主服务器上保存二进制日志最大程度的保证数据不丢失使用半同步复制可以大大降低数据丢失的风险如果只有一个slave已经收到了最新的二进制日志MHA可以将最新的二进制日志应用于其他所有的slave服务器上因此可以保证所有节点的数据一致性目前MHA支持一主多从架构最少三台服务即一主两从MHA Manger管理多组主从复制。4.搭建MySQL MHA环境设置首先在所有服务器Manager, Master, Slave1, Slave2上执行以下准备工作关闭防火墙和 SELinuxsystemctl stop firewalldsystemctl disable firewalldsetenforce 0# 永久关闭 SELinux 需修改 /etc/selinux/config 文件将 SELINUXenforcing 改为 disabled然后重启机器安装 MySQL 5.7在 Master、Slave1、Slave2 节点上安装 MySQL 5.7。修改主机名# 在 Master 节点执行hostnamectl set-hostname Master# 在 Slave1 节点执行hostnamectl set-hostname Slave1# 在 Slave2 节点执行hostnamectl set-hostname Slave2#在manager节点执行hostnamectl set-hostname manager配置 MySQL 主从复制1. 修改 MySQL 配置文件 (/etc/my.cnf)Master 节点 (10.8.0.11)[mysqld]server-id 1log_bin master-binlog-slave-updates trueSlave1 节点 (10.8.0.22)[mysqld]server-id 2log_bin master-binrelay-log relay-log-binrelay-log-index slave-relay-bin.indexSlave2 节点 (10.8.0.45)mysqld]server-id 3relay-log relay-log-binrelay-log-index slave-relay-bin.index修改完成后在所有数据库节点上重启 MySQL 服务systemctl restart mysqld2. 创建软链接在 Master、Slave1、Slave2 节点上都执行ln -s /usr/local/mysql/bin/mysql /usr/sbin/ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/3. 配置主从复制在所有数据库节点进行 MySQL 授权mysql -uroot -p-- 在 MySQL 命令行中执行以下 SQLgrant replication slave on *.* to myslave10.8.0.% identified by 123456;grant all privileges on *.* to mha10.8.0.% identified by manager;grant all privileges on *.* to mhaMaster identified by manager;grant all privileges on *.* to mhaSlave1 identified by manager;grant all privileges on *.* to mhaSlave2 identified by manager;flush privileges;在 Master 节点查看二进制日志文件名和位置show master status;-- 记录下 File 和 Position 的值例如master-bin.000001 和 1745在 Slave1、Slave2 节点执行同步操作change master tomaster_host10.8.0.11,master_usermyslave,master_password123456,master_log_filemaster-bin.000001, -- 使用上一步记录的文件名master_log_pos1745; -- 使用上一步记录的位置start slave;在 Slave1、Slave2 节点查看同步状态show slave status\G-- 确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes设置从库为只读模式在 Slave1、Slave2 节点上执行set global read_only1;安装 MHA 软件1. 安装依赖环境在所有服务器包括 Manager上安装yum install epel-release --nogpgcheck -yyum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN2.安装 MHA Node 组件在所有服务器上安装Manager 组件依赖 Node 组件cd /opttar zxvf mha4mysql-node-0.57.tar.gzcd mha4mysql-node-0.57perl Makefile.PLmake make install3..安装 MHA Manager 组件仅在 Manager 节点 上安装cd /opttar zxvf mha4mysql-node-0.57.tar.gzcd mha4mysql-node-0.57perl Makefile.PLmake make install配置无密码 SSH 认证1.在 Manager 节点上ssh-keygen -t rsa # 一路回车ssh-copy-id 10.8.0.11ssh-copy-id 10.8.0.22ssh-copy-id 10.8.0.452.在 Master 节点上ssh-keygen -t rsassh-copy-id 10.8.0.22ssh-copy-id 10.8.0.453.在 Slave1 节点上ssh-keygen -t rsassh-copy-id 10.8.0.11ssh-copy-id 10.8.0.454.在 Slave2 节点上ssh-keygen -t rsassh-copy-id 10.8.0.11ssh-copy-id 10.8.0.22在 Manager 节点上配置 MHA1. 准备脚本和目录# 复制脚本cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin# 创建配置文件目录mkdir /etc/masterhacp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/2. 修改 VIP 切换脚本 (/usr/local/bin/master_ip_failover)# 添加内容部分my $vip 192.168.10.200; # 虚拟 IP 地址my $brdc 192.168.10.255; # 广播地址my $ifdev ens33; # 绑定的网卡my $key 1; # 虚拟网卡序列号my $ssh_start_vip /sbin/ifconfig ens33:$key $vip;my $ssh_stop_vip /sbin/ifconfig ens33:$key down;注意请根据您的实际网络环境修改 $vip, $brdc, $ifdev 等变量3. 修改 MHA 配置文件 (/etc/masterha/app1.cnf)[server default]manager_log/var/log/masterha/app1/manager.logmanager_workdir/var/log/masterha/app1master_binlog_dir/usr/local/mysql/datamaster_ip_failover_script/usr/local/bin/master_ip_failovermaster_ip_online_change_script/usr/local/bin/master_ip_online_changepasswordmanagerping_interval1remote_workdir/tmprepl_password123456repl_usermyslavesecondary_check_script/usr/local/bin/masterha_secondary_check -s 10.8.0.22 -s 10.8.0.45shutdown_scriptssh_userrootusermha[server1]hostname10.8.0.11port3306[server2]candidate_master1check_repl_delay0hostname10.8.0.22port3306[server3]hostname10.8.0.45port33064. 手动开启虚拟 IP在 Master 节点上手动添加 VIP/sbin/ifconfig ens33:1测试与启动 MHA1. 测试 SSH 无密码认证在 Manager 节点 执行masterha_check_ssh -conf/etc/masterha/app1.cnf# 最后输出 All SSH connection tests passed successfully. 表示成功2.测试 MySQL 主从复制在 Manager 节点上执行masterha_check_repl -conf/etc/masterha/app1.cnf# 最后输出 MySQL Replication Health is OK. 表示成功3. 启动 MHA Manage在 Manager 节点上执行nohup masterha_manager --conf/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover /dev/null /var/log/masterha/app1/manager.log 21 4. 查看 MHA 状态masterha_check_status --conf/etc/masterha/app1.cnf# 如果正常运行会显示 app1 (pid:xxxxx) is running(0:PING_OK), master: 10.8.0.11实验在manager节点上监控观察日志记录tail -f /var/log/masterha/app1/manager.logsystemctl stop mysqld#在 Master节点master上停止mysql服务故障修复步骤修复mysqlsystemctl restart mysqld修复主从#在现主库服务器Mysql2slave1上 查看二进制文件和同步点show master status;#在原主库服务器mysql1执行同步操作change master to3在manager节点上修改配置文件app1.cnf再把这个记录添加进去因为它检测掉失效时候会自动消 失4在manager节点上启动MHAnohup masterha_manager --conf/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover /dev/null /var/log/masterha/app1/manager.log 21 总结整个实验过程并非一帆风顺而是一个典型的 “配置模板 - 语法报错 - 代码修正 - 验证通过” 的调试过程。MHA Manager监控节点负责检测主库状态并执行故障转移。MHA Node运行在 MySQL 服务器上的节点负责保存二进制日志等。VIP (10.8.0.200)对外提供服务的虚拟 IP随主库角色漂移。Failover Script核心自动化脚本负责执行 ifconfig 命令进行 IP 绑定与解绑。⚠️ 遇到的挑战与排查过程在实验过程中直接使用了官方提供的示例脚本导致了一系列 Perl 语法错误。这是学习 MHA 时最经典的“坑”。错误一编码与字符问题现象脚本中包含大量中文注释导致 Perl 解释器报错 Unrecognized character。解决清理了脚本中的中文字符或确保文件编码格式正确。错误二变量定义语法错误现象报错 Number found where operator expected。原因在定义 VIP 变量时漏写了赋值符号或引号使用不当。修正将代码规范为 my $vip 10.8.0.200;。错误三非代码文本混入现象脚本第 40 行出现 ens33:1 10.8.0.200 纯文本。原因从教程复制代码时误将命令行的输出结果粘贴到了脚本逻辑中。修正删除了这些无效的文本行。错误四占位符未处理现象报错 Bareword FIXME_xxx not allowed。原因官方脚本预留的 FIXME 标记提示用户在此处添加自定义逻辑被当作代码执行。修正注释掉了第 96 行和 101 行的 FIXME 代码。