mha的高级应用
节点的分布
192.168.80.90 | sjk1 主库 mha的node安装 |
---|---|
192.168.80.91 | sjk2 从库 mha 的node安装 |
192.168.80.92 | sjk3 从库 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.91 | sjk2 主 |
---|---|
192.168.80.92 | sjk3 从 |
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为主库完成