美文网首页运维
MHA 高可用说明

MHA 高可用说明

作者: 麟之趾a | 来源:发表于2020-04-06 17:29 被阅读0次

MHA架构软件结构说明

节点规划

数据库节点必须是一主两从独立实例,
MHA的管理节点最好是一台独立的机器

mha.png

MHA的软件构成

manager工具主要包括以下几个工具

masterha_manager     启动mha
masterha_check_ssh   检查mha的ssh配置状况
masterha_check_repl   检查mysql的复制状况
masterha_master_monitor  检查master是否宕机
masterha_master_switch  控制故障转移(自动或手动)
masterha_conf_host  添加或删除配置的server信息

Node工具软件

save_binary_logs  保存和复制master的二进制日志
apply_diff_relay_logs  识别差异的中继日志事件将差异事件应用于其他的
purge_relay_logs     清除中继日志(不会阻塞SQL线程)

MHA 配置过程细节说明

软连接

ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql  /usr/bin/mysql
# 这是为了让MHA调用命令,MHA并不能走环境变量

配置互信

主库宕机了,从库没有追上主库日志,需要ssh连上主库,获取二进制日志。以补全数据

配置文件说明

一套manager可以管理多套应用,通过配置文件区分不同的业务

[root@db03 ~]# cat /etc/mha/app1.cnf 
[server default]       # server端的默认配置
manager_log=/var/log/mha/app1/manager        #manager程序的日志
manager_workdir=/var/log/mha/app1               #manager日志的目录
master_binlog_dir=/data/binlog       #主库二进制节点的位置
user=mha                             #     mha的管理用户   
password=mha                               
ping_interval=2           #探测心跳时间(如果3次ping不通,就认为主库宕机默认3次)
repl_password=123       # 复制用户相关的信息
repl_user=repl
ssh_user=root                   #配置互信的用户            
[server1]                            #后端节点         
hostname=10.0.0.11
port=3306                                  
[server2]            
hostname=10.0.0.12
port=3306
[server3]
hostname=10.0.0.13
port=3306

状态检查

masterha_check_ssh  --conf=/etc/mha/app1.cnf
masterha_check_repl  --conf=/etc/mha/app1.cnf

启动

nohup masterha_manager --conf=/etc/mha/app1.cnf  --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1.cnf  2>&1 &
# --conf  指定使用哪个配置文件
# --remove_dead_master_conf:  当主库宕机时,自动在配置文件中将宕机主库去掉
# --ignore_last_failover: 忽略上一次切换,mha自动切换有保护机制,在第一次切换成功后。多少时间内,不能再次进行故障切换

什么是failover

故障转移,主库宕机一直到业务恢复正常的处理过程

自己如何实现failover

  • 快速监控主键宕机 mysqladmin ping(可以)
  • 选择新主
  • 数据补偿
  • 解除从库
  • 重新构建主从关系
  • 应用透明VIP
  • 故障节自愈
  • 故障提醒

MHA如何是的的failover

  • masterha_manager 启动MHA的功能
  • 在manager 启动之前,会先自动进行互信masterha_check_ssh和主从复制检查masterha_check_repl
  • MHA-manager节点是通过masterha_master_monitor脚本检测主库状态的(每隔ping_interval秒)
  • masterha_master_monitor探测主库3次,无心跳之后,就认为主库宕机了
  • 进行选主
    算法一

读取配置文件中是否有强制选主的参数
candidate_master=1 强制选主
check_repl_delay=0 从库延时不检查
都在server标签下设置,如果只设置candidate_master=1这个参数,当选主时,会自动进行从库延时检查。如果这个从库延时过大,比如超过100M,就不选这个从库为主了

应用场景

1.早期的MHA+Keepalive
Keepalive只能负责主和备的VIP漂移,而MHA的VIP漂移是到两个从库。不确定往哪个从库漂
2.多地多中心
将此参数放于最接近运维的server标签下,方便出现故障。运维能快速过去解决

算法二

如果配置文件中没有配置参数,就根据两个从库的哪个数据最接近主库,就选哪个

算法三

如果两个主库日志量一致,就根据配置文件中server标签的顺序

  • 数据补偿
    判断ssh联通性
    情况一:ssh能连

调用save_binary_logs 脚本,立即保存缺失部分的binlog,到各个节点恢复

情况二:ssh不能连

调用apply_diff_relay_logs脚本计算从库的relaylog差异,恢复到2号从库

为什么要用GTID

因为在数据补偿阶段,在对比binlog差异。如果没有gtid,会花费很长的时间。有了gtid花费资源更少,减少故障切换时间

  • 解除从库关系
  • 重新构建主从关系
  • 进行切换
    配置VIP
cp master_ip_failover  /usr/local/bin
vim /usr/local/bin/master_ip_failover
my $vip = '10.0.0.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";

chmod +x /usr/local/bin/master_ip_failover
vim /etc/mha/app1.cnf
[server default]
master_ip_failover_script=/usr/local/bin/master_ip_failover
**主库**
`ifconfig ens33:1  10.0.0.55/24`
  • 配置故障提醒
cp -r email /usr/local/bin
chmod +x /usr/local/bin/send
send 为发送邮件报警指令
vim /etc/mha/app1.cnf
report_script=/usr/local/bin/send

额外的数据补偿

由于当ssh不能连时,会导致数据丢失。
设计理念:找一台机器,实时保存主库的二进制日志文件。必须是5.6以上的版本,支持GTID。这里我们直接用db02

[binlog1]
no_master=1        #不参与选主
hostname=10.0.0.13   #本机的ip地址
master_binlog_dir=/data/mysql/binlog  #保存主库的binlog到什么位置,注意不能和主库位置一样
。因为这是主从,应该单独保存主库的binlog
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/
mysqlbinlog -R --host=10.0.0.11 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &   拉取二进制日志

重启MHA

masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf  --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>& 1

测试

主库
systemctl stop mysql
结果
故障报警未实现

故障恢复

  • 启动故障节点
  • 恢复一主两从
[root@db03 binlog]# grep -i 'change master to' /var/log/mha/app1/manager
Sun Apr  5 17:36:33 2020 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='10.0.0.12', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';
  • 故障库执行
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.12', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
  • 恢复mha的配置文件
vim /etc/mha/app1.cnf
[server1]  添加到配置文件
hostname=10.0.0.11
port=3306
[binlog1]    移动最后面
hostname=10.0.0.13
master_binlog_dir=/data/mysql/binlog
no_master=1
  • 启动mha
    nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
  • 启动binlogserver
rm -rf /data/mysql/binlog
mysqlbinlog -R --host=10.0.0.12 --user=mha --password=mha  --raw  --stop-never mysql-bin.000001 &

MHA的binlog server 为什么能实时保存成功,而不像从库有延时

因为主库commit时,一方面要往本地写入binlog,而是往远程的binlog server写入binlog,只有这两个执行成功,才会commit成功
MHA进行切换时,当主库连不上,才会去找binlog server ???

MHA故障排查

  • 搭建过程中排查

1 .masterha_check_ssh 和 masterha_check_repl检查必须要过
2 .检查配置文件
节点配置不对地址和端口
vip 和 发送邮件 脚本,指定位置和权限
3 .软连接
mysqlbinlog 和 mysql

  • 切换过程中的问题

查看/var/log/mha/app1/manager 日志文件 一般脚本问题多一些

  • 恢复MHA故障

1 .检查各个节点是否启动成功
2 .找到主库是谁show slave status\G
3 .恢复一主两从
4 .检查配置文件
5 .检查vip 和binlog server

  • 恢复过程

1 .检查vip是否在主库上,如果不在需要手动调整
2 .重新开始binlog server,拉取现有的主库日志
3 .启动manager

GTID补充说明

当500G大数据做主从时,应该怎么做?
1 .先进行XBK物理备份
2 .在从库进行恢复
因为GTID是逻辑的,物理备份XBK恢复时,并没有执行--set-purge-gtid,所以从库没有记录GTID
解决
1 .手动进行set-purge-gtid
2 .在从库change master to 中 master_auto_positon=1 改为从库的binlog中最后一个GTID+1 ,比如master binlog中最后一个GTID是10000,则从库 master_auto_position=10001,在XBK的binlog中查看GTID,是否和主库的一样。
平时
master_auto_positon=1,只从第一个gtid来进行备份,只不过在mysqldump主库数据时,已经自动加入了参数set-purge-gtid,所以从库执行change master to就自动跳过备份文件中已有的gtid了

GTID主从监控

show slave status\G;
  Retrieved_Gtid_Set:     # 已接收到的GTID,relay log中读到的
  Executed_Gtid_Set:   #已经执行到的GTID

相关文章

网友评论

    本文标题:MHA 高可用说明

    本文链接:https://www.haomeiwen.com/subject/bdxpphtx.html