MHA:Master High Availability
对主节点进行监控,可实现自动故障转移至其它从节点;通过提
升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主
多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台
充当master,一台充当备用master,另外一台充当从库
我的理解是当主节点宕机后,自动找到一个从节点作为主节点
MHA软件由两部分组成 :Manager工具包和Node工具包
- MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃
的master保存二进制日志事件(binlog events) - 识别含有最新更新的slave
- 应用差异的中继日志(relay log)到其他的slave
- 应用从master保存的二进制日志事件(binlog events)
- 提升一个slave为新的master
- 使其他的slave连接新的master进行复制
实验前须知:
环境:四台主机
10.0.0.7 CentOS7 MHA管理端
10.0.0.8 CentOS8 MySQL8.0 Master
10.0.0.18 CentOS8 MySQL8.0 Slave1
10.0.0.28 CentOS8 MySQL8.0 Slave2
在管理节点上安装两个包mha4mysql-manager和mha4mysql-node
mha4mysql-manager-0.56-0.el6.noarch.rpm 不支持CentOS 8,只支持CentOS7 以下版本
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm 支持MySQL5.7和MySQL8.0 ,但和CentOS8
版本上的Mariadb -10.3.17不兼容
两个安装包
mha4mysql-manager
mha4mysql-node
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58 下载0.58版的node包
由于相互之间要复制日志,所以四个节点要key安装和rsync安装
需要特别注意的是拥有candidate_master=1 优先成为主节点
第一步: 安装软件
MHA端上安装两个包 0.58的manager和node
其他三个只需要node包mha4mysql-node
在Mha上
yum -y install mha4mysql-*.rpm
在master 8和两个slave(18和28)上只安装node
yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
第二步 在所有节点实现基于keygen验证 在mha上执行 ssh-keygen
先发给mha主机
再将key复制给三台主机
rsync -a .ssh 10.0.0.8:/root/
rsync -a .ssh 10.0.0.18:/root/
rsync -a .ssh 10.0.0.28:/root/
注意若出现以下报错
表示rsync没有连接,在7和 其他三台8上都需要安装:
测试可连接
在mha上建立配置文件
文件夹:mkdir /etc/mastermha/
文件:vim /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=magedu
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=magedu
ping_interval=1
master_ip_failover_script=/usr/local/bin/master_ip_failover
report_script=/usr/local/bin/sendmail.sh
check_repl_delay=0
master_binlog_dir=/data/mysql/
[server1]
hostname=10.0.0.8
candidate_master=1
[server2]
hostname=10.0.0.18
candidate_master=1
[server3]
hostname=10.0.0.28
格式如图所示:
执行cat -A /etc/mastermha/app1.cnf 检查文本或者在文本里执行set list查看是否有空格(不允许有空格)
在mha上搭建一个发邮件的
vim /etc/mail.rc 在最后放入
(红色是我自己的QQ 最后一行隐藏的是授权码,获取方式请参见我的另外博客https://blog.csdn.net/Lcongming/article/details/115877053)
cat > /usr/local/bin/sendmail.sh加入:
#!/bin/bash
echo “MySQL is down” | mail -s “MHA Warning” (qq邮箱)
操作如图所示
这一步设置后要测试
执行bash /usr/local/bin/sendmail.sh 看看邮件有没有发到预设的邮箱
我这里是点击发送后 秒收
加上权限: chmod +x /usr/local/bin/sendmail.sh
相关脚本:
[root@ansible ~]#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 = '10.0.0.100/24';
my $gateway = '10.0.0.254';
my $interface = 'eth0';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig $interface:$key $vip;/sbin/arping -I $interface -c 3 -s $vip $gateway >/dev/null 2>&1";
my $ssh_stop_vip = "/sbin/ifconfig $interface:$key down";
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" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed.
# If you manage master ip address at global catalog database,
# invalidate orig_master_ip here.
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" ) {
# all arguments are passed.
# If you manage master ip address at global catalog database,
# activate new_master_ip here.
# You can also grant write access (create user, set read_only=0, etc) here.
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";
`ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
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";
}
将脚本拖入mha主机 然后将脚本移动到 /usr/local/bin
因为我这里有准备好的脚本所以,所以 可以像上面那样输入,也可以直接上传(注意,上传要先安装lrzsz软件)
执行 mv master_ip_failover /usr/local/bin
加上权限
chmod +x /usr/local/bin/master_ip_failover
第二步,创建主从复制;
mkdir /data/mysql/
chown mysql.mysql /data/mysql/ 在三台服务器上都要操作
master8上 更改配置文件: vim /etc/my.cnf
[mysqld]
server_id=8
log-bin=/data/mysql/mysql-bin
skip_name_resolve=1
general_log #观察结果,非必须项,生产无需启用
然后启用 mysql systemctl enable --now mysqld
master主节点登录后 执行 show master logs;
记录下二进制文件
创建账号create user repluser@‘10.0.0.%’ identified by ‘magedu’;
授权 grant replication slave on . to repluser@‘10.0.0.%’ ;
单独建立一个账号管理mysql的服务配置
create user mhauser@‘10.0.0.%’ identified by ‘magedu’;
grant all on . to mhauser@‘10.0.0.%’ ;
创建虚拟vip ifconfig eth0:1 10.0.0.100/24
slave上18和28 更改配置文件vim /etc/my.cnf
改配置文件:18的
[mysqld]
server_id=18和28
log-bin=/data/mysql/mysql-bin
read_only
relay_log_purge=0
skip_name_resolve=1
general_log
设置后 启动 mysqld : systemctl enable --now mysqld
进入mysql
CHANGE MASTER TO
MASTER_HOST=‘10.0.0.8’,
MASTER_USER=‘repluser’,
MASTER_PASSWORD=‘magedu’,
MASTER_PORT=3306,
MASTER_LOG_FILE=‘mysql-bin.000003’,
MASTER_LOG_POS=156;
启动服务:start slave;
查看连接状态:show slave status\G
主从设置完成 ;如果不放心,可以验证一下数据是否可以同步,我验证了可以,这里不发图片。有想了解的可以看看我之前的博客。
第三步:开启mha
首先环境检查 在mha上:
检查环境: masterha_check_ssh --conf=/etc/mastermha/app1.cnf
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6209616a06eeed74569ce9e1eb2a3137.png)
检查其他复制关系: masterha_check_repl --conf=/etc/mastermha/app1.cnf
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/279f95f821e4a8be69dc2e2c841ffb1a.png)
查看状态masterha_check_status --conf=/etc/mastermha/app1.cnf 若还未复制,提示
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/45ddbc63b403b25b3ff0b33b4a77470e.png)
执行启动命令:
nohup masterha_manager --conf=/etc/mastermha/app1.cnf &> /dev/null 若为生产环境,后台运行
测试环境 直接运行;masterha_manager --conf=/etc/mastermha/app1.cnf
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e6c95c677d4d5053227b64952b9af3e1.png)
卡住表示主节点没有宕机 在监控中 而且只监控主节点
而此刻 查看状态masterha_check_status --conf=/etc/mastermha/app1.cnf
查看到8是主节点是正常的
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aafd1fe6c78bfd9485c6ac7cb9974ab6.png)
第四步;模拟生产环境
我们先上传两个文件hellodb_innodb.sql和testlog.sql 执行;
mysql < hellodb_innodb.sql
mysql hellodb < testlog.sql
验证: 目前18和28是只读属性开启
在8master上 进入 mysql 执行 call sp_testlog;
在slave1 上查看
在slave2上查看
然后停止master数据库
systemctl stop mysqld 或者直接断电 email会第一时间收到警报
在mha上查看 程序原本显示在监听,现在提示无法找到:
可以看到主节点直接从8到18了;
在主机28上slave2执行show slave status\G查看 目前主节点指向从8变成了18
并且18上的只读属性已经关闭,目前是可写了哦
18查看show slave status;
也就是说,在生产环境中,当主节点down的时候,自动将一个从节点变成了主节点,从而保证数据正常运行
第五步:重新启动master作为主节点
当重新启动master后 查看show master logs; 记录二进制文件
然后在18主机salve1和28主机slave2 执行stop slave;后 执行change master to重新连接
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.8',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='magedu',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mysql-bin.000003',
-> MASTER_LOG_POS=156;
如图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210523215227328.png)
18 和28的 主节点重新指向8
然后重新启动: masterha_manager --conf=/etc/mastermha/app1.cnf
执行 masterha_check_status --conf=/etc/mastermha/app1.cnf 查看
重新指向了master主机
至此MHA设置完毕
谢谢观赏