MHA集群通过主从复制、SSH免密登录和VIP漂移实现MySQL高可用,主库故障时自动选举最优从库升主并重定向服务,确保10-30秒内恢复。

搭建MySQL MHA(Master High Availability)集群可以有效实现主库故障自动切换,保障数据库服务的高可用性。MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点),其核心功能是在主库宕机时,从多个从库中选举出一个最优节点进行主库切换,并将其他从库指向新的主库。
搭建MHA前需确保以下环境条件:
示例拓扑:
确保主从复制正常运行是MHA的前提。
主库配置(my.cnf):[mysqld] server-id = 1 log-bin = mysql-bin binlog-format = ROW gtid-mode = ON enforce-gtid-consistency = ON
从库配置:
server-id = 2 # 每个从库ID不同 relay-log = relay-bin log-slave-updates = ON read-only = ON gtid-mode = ON enforce-gtid-consistency = ON
在主库创建复制用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'replpass'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
从库执行CHANGE MASTER命令,启动复制并确认IO/SQL线程运行正常(SHOW SLAVE STATUS\G)。
MHA Node需在每个MySQL节点(包括主从)安装:
yum install perl-DBD-MySQL -y rpm -ivh mha4mysql-node-0.58-0.el7.noarch.rpm
MHA Manager只在管理节点安装:
yum install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y rpm -ivh mha4mysql-manager-0.58-0.el7.noarch.rpm
创建MHA工作目录:
mkdir -p /etc/masterha mkdir -p /var/log/masterha/app1
在MHA Manager节点生成密钥,并分发到所有MySQL节点:
ssh-keygen -t rsa ssh-copy-id root@192.168.1.10 ssh-copy-id root@192.18.1.11 ssh-copy-id root@192.168.1.12
测试SSH互通无密码登录,这是MHA执行远程操作的基础。
创建配置文件 /etc/masterha/app1.cnf:
[server default] manager_workdir=/var/log/masterha/app1 manager_log=/var/log/masterha/app1/manager.log master_ip_failover_script=/usr/local/bin/master_ip_failover shutdown_script="" ssh_user=root repl_user=repl repl_password=replpass ping_interval=1 master_binlog_dir=/var/lib/mysql <p>[server1] hostname=192.168.1.10 candidate_master=1</p><p>[server2] hostname=192.168.1.11 candidate_master=1</p><p>[server3] hostname=192.168.1.12 no_master=1</p>
说明:candidate_master=1 表示可参与主库选举;no_master=1 表示不可升为主库。
MHA本身不带VIP漂移功能,需自定义脚本实现。创建 /usr/local/bin/master_ip_failover:
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
<p>use Getopt::Long;</p><p>my (
$command,        $ssh_user,      $orig_master_host,
$orig_master_ip, $orig_master_port, $new_master_host,
$new_master_ip,  $new_master_port
);</p><p>GetOptions(
'command=s'             => \$command,
'ssh_user=s'            => \$ssh_user,
'orig_master_host=s'    => \$orig_master_host,
'orig_master_ip=s'      => \$orig_master_ip,
'orig_master_port=i'    => \$orig_master_port,
'new_master_host=s'     => \$new_master_host,
'new_master_ip=s'       => \$new_master_ip,
'new_master_port=i'     => \$new_master_port,
);</p><p>my $vip = '192.168.1.100';
my $interface = 'eth0';
my $key = '1';
my $ssh_start_vip = "sudo /sbin/ifconfig $interface:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig $interface:$key down";</p><p>if ( $command eq "stop" || $command eq "stopssh" ) {
print "Disabling the VIP on old master: $orig_master_host \n";
system("ssh $ssh_user\@$orig_master_host \"$ssh_stop_vip\"");
}</p><p>if ( $command eq "start" ) {
print "Enabling the VIP on new master: $new_master_host \n";
system("ssh $ssh_user\@$new_master_host \"$ssh_start_vip\"");
}
exit 0;</p>赋予执行权限:chmod +x /usr/local/bin/master_ip_failover
确保各节点root用户可通过sudo执行ifconfig命令(配置visudo)。
先检查配置是否正确:
masterha_check_ssh --conf=/etc/masterha/app1.cnf
masterha_check_repl --conf=/etc/masterha/app1.cnf
两项检查均通过后,启动MHA Manager:
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 &
模拟主库宕机:
systemctl stop mysqld # 在主库执行
观察MHA日志(/var/log/masterha/app1/manager.log),会自动完成:
基本上就这些。只要主从复制稳定、SSH畅通、脚本权限正确,MHA能快速完成故障切换,通常在10-30秒内恢复服务。注意定期检查MHA状态,避免脑裂或配置遗漏问题。
以上就是如何在mysql中搭建MHA高可用集群的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号