mha的应用

本文详细介绍了MHA(Master High Availability)在MySQL中的高级应用,包括快速Failover机制、数据补偿、VIP透明切换、故障提醒以及故障模拟与恢复流程。通过设置监控、配置文件和脚本,确保在主库宕机时能够自动选择新主,维持服务连续性,并在故障后有效恢复。
摘要由CSDN通过智能技术生成


节点的分布

192.168.80.90sjk1 主库 mha的node安装
192.168.80.91sjk2 从库 mha 的node安装
192.168.80.92sjk3 从库 mha 的node安装 和manager的安装,manager其实要安装单独的机器上,这里我们就以sjk3作为mha的管理节点

1主2从的搭建:该文章的第4章有搭建
https://blog.csdn.net/ncnhhm/article/details/121294148?spm=1001.2014.3001.5501
mha的搭建级软件分享这篇文章
https://blog.csdn.net/ncnhhm/article/details/121295291?spm=1001.2014.3001.5501

1. Failover

failover实现那些

1.快速的监控到主库的宕机
2.选择主库
3.数据补偿
4.解除从库的身份
5.剩余从库和新主库构建主从关系
6.应用透明
7.故障节点的自愈
8.故障提醒

1.1 mha的failover如何实现

启动—故障—转移—业务的恢复

1.mha通过masterha_manager脚本启动mha的功能
2.在manager启动之前,会自动的检查ssh互信he主从的状态
masterha_check_ssh masterha_check_repl
3.manager通过masterha_master_monitor脚本,每隔ping_interval秒
4.masterha_master_monitor探测主库三次无心跳以后,就认为主库宕机了
5.选择主的过程
   1.配置文件里边添加了强制选主
    candidate_master=1
	check_repl_delay=0
	2.自动的判断所有从库的日志两,将最接近的主库数据的从库新主
	3.按照配置文件主机的先后顺序进行选新主

2. 数据补偿

判断ssh的连接诶情况
1.能连接
调用save_binary_logs脚本,立即保存缺失的部分的binlog到各个从节点
2.无法连接
调用 apply_diff_relay_logs 脚本,计算从库的relaylog的差异,恢复到2号从库

3. mha的应用透明 VIP

文件的准备:
在这里插入图片描述
在mha安装的文章里边有分享的百度网盘的连接

cp master_ip_failover.txt /usr/local/bin/master_ip_failover

该文件的配置

vim  /usr/local/bin/master_ip_failover
my $vip = '10.0.0.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";


my $vip = '10.0.0.55/24'; 同一个网段没有用过的主机ip
yum install -y  dos2unix
dos2unix /usr/local/bin/master_ip_failover
chmod +x /usr/local/bin/master_ip_failover 
vim /etc/mha/app1.cnf 
master_ip_failover_script=/usr/local/bin/master_ip_failover

手工添加vip sjk1

 ifconfig eth0:1 192.168.80.120/24

重启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 &

masterha_check_status --conf=/etc/mha/app1.cnf

4. mha 故障提醒

cp -a email/* /usr/local/bin/
cd /usr/local/bin/
chmod +x *

测试邮箱:

cd /usr/local/bin/
vim testpl
#!/bin/bash
/usr/local/bin/sendEmail -o tls=no -f 13526091932@163.com -t 3307235355@qq.com -s smtp.163.com:25  -xu 13526091932@163.com -xp KPMLKXFILXLALGAA  -u "MHA Waring" -m "YOUR MHA MAY BE FAILOVER" &>/tmp/sendmail.log

修改的是只是邮箱账号,授权码,用的什么邮箱
sendemail的参数解释

-f 表示发送者的邮箱
-t 表示接收者的邮箱
-s 表示SMTP服务器的域名或者ip
-u 表示邮件的主题
-xu 表示SMTP验证的用户名
-xp 是smtp服务的授权码,不知邮箱账号的密码
-m 表示邮件的内容

测试:

cd /usr/local/bin 
./testpl

在这里插入图片描述

mha上的配置

vim /etc/mha/app1.cnf 
report_script=/usr/local/bin/send

重启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 &

masterha_check_status --conf=/etc/mha/app1.cnf

5. 额外的数据补偿(binlog_server)

找一台额外的机器,必须要有5.6以上版本的mysql,支持gtid
我们用sjk3也就是第二个从库

vim /etc/mha/app1.cnf 
[binlog1]
no_master=1
hostname=192.168.80.92
master_binlog_dir=/data/mysql/binlog

创建目录,目录不能与主库目录binlog 一样

mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*

拉取主库的binlog,必须进入到自己创建好的目录

cd /data/mysql/binlog 
mysqlbinlog  -R --host=192.168.80.90  --user=mha --password=mha  --raw  --stop-never mysql-bin.000001 &

拉取日志的起点,需要按照目前主库正在使用的binlog为起点.

[root@sjk3 binlog]# pwd
/data/mysql/binlog
[root@sjk3 binlog]# ll
total 12
-rw-r----- 1 root root  177 Nov 13 04:47 mysql-bin.000001
-rw-r----- 1 root root 1503 Nov 13 04:47 mysql-bin.000002
-rw-r----- 1 root root  194 Nov 13 04:47 mysql-bin.000003

重启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 &

总的配置文件 /etc/mha/app1.cnf

[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/binlog
master_ip_failover_script=/usr/local/bin/master_ip_failover
password=mha
ping_interval=2
repl_password=123
repl_user=repl
report_script=/usr/local/bin/send
ssh_user=root
user=mha

[server1]
hostname=192.168.80.90
port=3306
[server2]
hostname=192.168.80.91
port=3306
[server3]
hostname=192.168.80.92
port=3306

[binlog1]
no_master=1
hostname=192.168.80.92
master_binlog_dir=/data/mysql/binlog

6. 故障模拟及恢复

6.1 宕机掉数主库

sjk1

systemctl stop mysqld

邮件发送完成
在这里插入图片描述
看看vip sjk1
在这里插入图片描述
没有了,vipzai sjk2上
在这里插入图片描述

我们查看主从情况,这个时候我们的mha已经挂掉了

[root@sjk3 binlog]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
[1]+  Done

在sjk3上查看那个是主库哪个是从库

sjk3 [(none)]>show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.80.91
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60

这个时候就变成了1主1从

192.168.80.91sjk2 主
192.168.80.92sjk3 从

6.2 恢复

6.2.1 启动故障节点

systemctl start mysqld

6.2.2 恢复1主2从

sjk3

grep "CHANGE MASTER TO"  /var/log/mha/app1/manager

[root@sjk3 binlog]# grep "CHANGE MASTER TO"  /var/log/mha/app1/manager
Sat Nov 13 06:29:33 2021 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.80.91', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';

sjk1上执行
CHANGE MASTER TO MASTER_HOST='192.168.80.91', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';
sjk01[(none)]>start slave;

在这里插入图片描述

6.2.3恢复配置文件

vim /etc/mha/app1.cnf

[server1]
hostname=192.168.80.90
port=3306
[server2]
hostname=192.168.80.91
port=3306
[server3]
hostname=192.168.80.92
port=3306

[binlog1]
no_master=1
hostname=192.168.80.92
master_binlog_dir=/data/mysql/binlog

6.2.4 恢复binlog_server

cd /data/mysql/binlog    
rm -rf /data/mysql/binlog/*
mysqlbinlog  -R --host=192.168.80.90 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

6.2.5 启动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 &

masterha_check_status --conf=/etc/mha/app1.cnf

7. 要是想重新恢复到sjk1为主库

可以强制加参数,在stop sjk2就行,或者把sjk1的ip放前面

vim  /etc/mha/app1.cnf

[server1]
hostname=192.168.80.90
port=3306
candidate_master=1
check_repl_delay=0
[server2]
hostname=192.168.80.91
port=3306
[server3]
hostname=192.168.80.92
port=3306


或者  
[server1]
hostname=192.168.80.90
port=3306
[server2]
hostname=192.168.80.91
port=3306
[server3]
hostname=192.168.80.92
port=3306

然后stop sjk2,再按照6的步骤恢复即可
在这里插入图片描述

CHANGE MASTER TO MASTER_HOST='192.168.80.90', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';

恢复sjk1为主库完成
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长安有故里y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值