欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > MySQL高可用MHA

MySQL高可用MHA

2025/2/24 6:36:27 来源:https://blog.csdn.net/2201_75444658/article/details/142324199  浏览:    关键词:MySQL高可用MHA

目录

一、MHA概述

1.MHA是什么

2.MHA的组成 

3.MHA特点 

4.MHA工作原理 

二、MySQL部署MHA 

1.配置主从复制

2.配置MHA高可用

2.1所有服务器安装MHA依赖环境

2.2所有服务器上安装node组件

2.3在MHA manager节点上安装manager组件

2.4在所有服务器上配置无密码认证

2.5在manager节点上配置MHA

2.6在Master节点服务器手动开启虚拟IP 

2.7在 manager 节点上测试 ssh 无密码认证 

2.8在manager节点上测试mysql主从连接

2.9在manager节点上启动MHA并查看状态以及日志

2.10故障模拟 

2.11故障修复 


一、MHA概述

1.MHA是什么

MHA(Master High Availability)是用于MySQL高可用性环境的一个软件解决方案,旨在解决单点故障问题。它能够在0-30秒内自动完成故障切换,并在故障转移过程中最大程度地保障数据一致性

2.MHA的组成 

MHA Node(数据节点):每个MySQL服务器上运行的组件
MHA Manager(管理节点):可以独立部署或在某个slave节点上运行,负责管理多个master-slave集群,定期监测master节点的状态,并在故障时自动提升slave为新的master

3.MHA特点 

自动故障切换:在故障发生时,尽量从宕机的主服务器保存二进制日志,降低数据丢失风险
半同步复制:确保只有在最新的slave接收到二进制日志后,才会进行故障切换,以保持数据一致性
支持一主多从架构:至少需要三台服务器(一个master和两个slave)

4.MHA工作原理 

1. 监测主节点状态:
MHA Manager定期检查主节点的健康状态,以确定其是否正常运行

2. 检测故障:
当主节点出现故障时,MHA Manager会自动识别并确认故障

3. 保存二进制日志:
在故障发生时,MHA尝试从宕机的主节点保存最新的二进制日志事件,以尽量减少数据丢失

4. 确定最新的从节点:
MHA Manager会扫描从节点,找出接收了最新数据的从节点

5. 提升新的主节点:
将选定的最新从节点提升为新的主节点,确保其成为新的数据源

6. 更新其他从节点:
MHA会将其他从节点指向新的主节点,并应用其上保存的二进制日志事件和中继日志,以保持数据一致性

7. 透明切换:
整个故障转移过程对应用程序是透明的,最小化业务中断

二、MySQL部署MHA 

服务器名IP地址安装的服务
MHA manager 节点服务器172.16.58.40安装MHA node 和 manager 组件
Master 节点服务器172.16.58.10安装mysql5.7、MHA node 组件
Slave01 节点服务器172.16.58.20安装mysql5.7、MHA node 组件
Slave02 节点服务器172.16.58.30安装mysql5.7、MHA node 组件

1.配置主从复制

主从复制的步骤可参考下面的博客连接(所需要的机器有Master、Slave01、Slave02)

MySQL主从复制、读写分离-CSDN博客

2.配置MHA高可用

2.1所有服务器安装MHA依赖环境

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-CPAN

2.2所有服务器上安装node组件

在所有服务器上必须先安装node组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make installnode 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:
save_binary_logs      #保存和复制 master 的二进制日志
apply_diff_relay_logs #识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog    #去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs      #清除中继日志(不会阻塞 SQL 线程)

2.3在MHA manager节点上安装manager组件

cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make installmanager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:
masterha_check_ssh      #检查 MHA 的 SSH 配置状况
masterha_check_repl     #检查 MySQL 复制状况
masterha_manger         #启动 manager的脚本
masterha_check_status   #检测当前 MHA 运行状态
masterha_master_monitor #检测 master 是否宕机
masterha_master_switch  #控制故障转移(自动或者 手动)
masterha_conf_host      #添加或删除配置的 server 信息
masterha_stop           #关闭manager

2.4在所有服务器上配置无密码认证

(1)在 manager 节点上配置到所有数据库节点的无密码认证
ssh-keygen -t rsa 				#一路按回车键
ssh-copy-id 172.16.58.10
ssh-copy-id 172.16.58.20
ssh-copy-id 172.16.58.30(2)在 master 上配置到数据库节点 slave1 和 slave2 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 172.16.58.20
ssh-copy-id 172.16.58.30(3)在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 172.16.58.10
ssh-copy-id 172.16.58.20(4)在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 172.16.58.10
ssh-copy-id 172.16.58.30

2.5在manager节点上配置MHA

(1)在 manager 节点上复制相关脚本到/usr/local/bin 目录
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin拷贝后会有四个执行文件
ll /usr/local/bin/scripts/master_ip_failover  		#自动切换时 VIP 管理的脚本
master_ip_online_change 	#在线切换时 vip 的管理
power_manager 				#故障发生后关闭主机的脚本
send_report 				#因故障切换后发送报警的脚本
(2)复制上述的自动切换时VIP管理的脚本到/usr/local/bin目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
(3)修改内容如下:(删除原有所有内容,直接复制并修改vip相关参数)
vim /usr/local/bin/master_ip_failover#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';use Getopt::Long;my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);my $vip = '172.16.58.100';			#指定vip的地址
my $brdc = '172.16.58.255';			#指定vip的广播地址
my $ifdev = 'ens33';				#指定vip绑定的网卡
my $key = '1';						#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		
#代表此变量值为ifconfig ens33:1 172.16.58.100
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		
#代表此变量值为ifconfig ens33:1 172.16.58.100 down
my $exit_code = 0;											#指定退出状态码为0
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";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,
);exit &main();sub main {print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";if ( $command eq "stop" || $command eq "stopssh" ) {my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
## A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
(4)创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理mysql节点服务器
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterhavim /etc/masterha/app1.cnf			#删除原有内容,直接复制并修改节点服务器的IP地址
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 172.16.58.20 -s 172.16.58.20
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=172.16.58.10
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=172.16.58.20
port=3306[server3]
hostname=172.16.58.30
port=3306

2.6在Master节点服务器手动开启虚拟IP 

第一次配置需要手动开启虚拟IP
/sbin/ifconfig ens33:0 172.16.58.100/24

2.7在 manager 节点上测试 ssh 无密码认证 

masterha_check_ssh -conf=/etc/masterha/app1.cnf如果正常最后会输出 successfully

2.8在manager节点上测试mysql主从连接

masterha_check_repl -conf=/etc/masterha/app1.cnf最后出现 MySQL Replication Health is OK 字样说明正常

2.9在manager节点上启动MHA并查看状态以及日志

启动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 &查看MHA状态
masterha_check_status --conf=/etc/masterha/app1.cnf查看MHA日志
cat /var/log/masterha/app1/manager.log | grep "current master"查看master的VIP地址172.16.58.100是否存在
ifconfig若要关闭manager服务,可以使用如下命令:
masterha_stop --conf=/etc/masterha/app1.cnf
或者可以直接采用 kill 进程 ID 的方式关闭

2.10故障模拟 

在manager节点上监控观察日志记录
tail -f /var/log/masterha/app1/manager.log在Master节点上停止mysql服务
systemctl stop mysqld正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将宕机的 master 节点删除。查看 slave1 是否接管 VIP
ifconfig

2.11故障修复 

(1)修复mysql(在master节点上重启mysql服务)
systemctl restart mysqld(2)修复主从
在现主库服务器slave01查看二进制文件和同步点
show master status;在原主库服务器master执行同步操作
change master to master_host='172.16.58.20',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1745;start slave;(3)在manager节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
vim /etc/masterha/app1.cnf
......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 172.16.58.20 -s 172.16.58.30
......
[server1]
hostname=172.16.58.10
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=172.16.58.20
port=3306[server3]
hostname=172.16.58.30
port=3306(4)在manager节点上启动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 &

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词