Mysql数据库—MHA高可用配置及故障切换

一、MHA概述

1.MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件
2.MHA 的出现就是解决MySQL单点的问题
3.MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作
4.MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用

二、MHA的组成

1.MHA Node(数据节点)
MHA Node运行在每台MySQL服务器上
2.MHA Manager(管理节点)
1)MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台slave节点上
2)MHA Manager 会定时探测集群中的master节点。当master出现故障时,它可以自动将最新数据的slave提升为新的master, 然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明

三、MHA的特点

1.自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
2.使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
3.目前MHA支持一主多从架构,最少三台服务,即一主两从

四、搭建MHA

4.1 服务器准备

主机 ip 功能 所需组件
manager 192.168.80.14 manager管理节点 manager组件,node组件
master 192.168.80.11 mysql5.7主数据库 node组件
slave1 192.168.80.12 mysql5.7从数据库 node组件
slave2 192.168.80.13 mysql5.7从数据库 node组件

4.2 思路

1.先使用三台mysql服务器,配置一主两从,实现主从复制
2.安装MHA软件
3.配置免密登录和MHA的高可用
4.模拟故障并进行查看

4.3 三个节点安装mysql5.7并修改主机名

#数据库前面都装过了,这边就不具体安装了

#关闭防火墙和安全功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

#修改主机名
hostnamectl set-hostname Mysql1(master)
hostnamectl set-hostname Mysql2(slave1)
hostnamectl set-hostname Mysql3(slave2)

4.4 修改三个节点的Mysql主配置文件

#Master节点
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true

systemctl restart mysqld

#Slave1、Slave2 节点
vim /etc/my.cnf
server-id = 2/3						#三台服务器的 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

systemctl restart mysqld



4.5 在三个节点上都创建两个软链接

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

4.6 配置mysql一主两从

4.6.1 三个节点进行mysql授权

mysql -uroot -p264196
grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '264196';		    #从数据库同步使用
grant all privileges on *.* to 'mha'@'192.168.80.%' identified by 'manager';		#manager 使用

grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';				#防止从库通过主机名连接不上主库
grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
flush privileges;

4.6.2 master节点查看二进制文件和同步点

show master status;

4.6.3 slave1、slave2节点执行同步操作

change master to master_host='192.168.80.11',master_user='myslave',master_password='264196',master_log_file='master-bin.000003',master_log_pos=1745; 

start slave;      #开启从节点同步

4.6.4 Slave1、Slave2节点查看数据同步结果

show slave status\G	
	
#确保IO和SQL线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

4.6.5 两个从节点必须设置为只读模式

set global read_only=1;

4.6.6 插入数据测试数据库同步


4.7 安装MHA软件

4.7.1 所有服务器(4台)都安装MHA环境

systemctl stop firewalld
setenforce 0

#安装epel源
yum install epel-release --nogpgcheck -y

yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

4.7.2 所有服务器安装MHA软件包

#在所有服务器上必须先安装node组件
对于每个操作系统版本不一样,这里 CentOS7.4 必须选择 0.57 版本
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

4.7.3 MHA manager节点上安装manager组件

cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install

#manager 安装后在/usr/local/bin目录下会生成几个工具,主要包括以下:
	
masterha-check_ssh  		检查MHA的SSH配置状况
masterha_check_repl  		检查MySQL复制状况
masterha_manager 			启动manager的脚本
masterha_check_status 		检查当前MHA运行状态
masterha_master_monitor 	检查master是否宕机
masterha_master_switch 		控制故障转移(自动或者手动)
masterha_conf_host 			添加或删除配置的server信息
masterha_stop  				关闭manager


#node 安装后也会在/usr/local/bin目录下生成几个脚本,需要进行检查,主要包括以下
save_binary_logs			#保存和复制master的二进制日志
apply_diff_relay_logs 		#识别差异的中继日志事件,并将其差异的事件应用于其他的slave
filter_mysqlbinlog			#去除不必要的ROLLBACK回滚事件(MHA 已不适用这个工具)
purge_relay_logs			#清除中继日志(不会阻塞SQL线程)


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

#一、在mannager上配置到所有数据库节点的无密码认证
#一路回车
ssh-keygen -t rsa
ssh-copy-id 192.168.80.11
ssh-copy-id 192.168.80.12
ssh-copy-id 192.168.80.13

#二、在master上配置到slave1和salve2的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.80.12
ssh-copy-id 192.168.80.13

#三、在slave1上配置到master和salve2的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.80.11
ssh-copy-id 192.168.80.13

#四、在slave2上配置到master和salve1的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.80.11
ssh-copy-id 192.168.80.12




4.9 manager节点上配置MHA

1、在MHA节点上复制相关脚本到/usr/local/bin目录
cp -ra /root/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.复制上述的master_ip_failover(自动切换时VIP管理的脚本)到/usr/local/bin目录 这里使用脚本管理VIP
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

3.修改master_ip_failover内容(删除原有内容,直接复制并修改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 = '192.168.80.200';			    #浮动IP
my $brdc = '192.168.80.255';			#广播地址
my $ifdev = 'ens33';					#使用的网卡为ens33
my $key = '1';							#虚拟接口
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";							#使用ifoconfig命令将其启动,同时设置浮动地址
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";							#可以使用ifconfig命令将其down掉(关闭)
my $exit_code = 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软件目录并拷贝配置文件
mkdir /etc/masterha
cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
vim /etc/masterha/app1.cnf
#以下部分配置节点相关信息

[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
user=mha					
ping_interval=1
remote_workdir=/tmp
repl_password=264196
repl_user=myslave		
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.12-s 192.168.80.13
shutdown_script=""
ssh_user=root			

[server1]
hostname=192.168.80.11
port=3306

[server2]
candidate_master=1
hostname=192.168.80.12
check_repl_delay=0
port=3306

[server3]
hostname=192.168.80.13
port=3306

---------------------------------------------
说明:
#manager日志
manager_log=/var/log/masterha/app1/manager.log

#manager工作目录
manager_workdir=/var/log/masterha/app1

#master保存binlog的位置,这里的路径要于master里配置的binlog的路径一致,以便MHA能找到
master_binlog_dir=/usr/local/mysql/data

#设置自动failover时候切换脚本,也就是上一个配置的脚本
master_ip_failover_script=/usr/local/bin/master_ip_failover

#设置手动切换时候的切换脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change

#此处密码为之前创建监控用户的密码
password=manager

#设置监控用户
user=mha

#设置监控主库,发送ping包的事件间隔,默认为3秒,尝试三次没有回应的时候自动进性failover
ping_interval=1

#设置远端的MySQL在发生切换时binlog的(临时)保存位置
remote_workdir=/tmp

#设置复制(slaves)用户的密码
repl_password=264196

#设置复制用户的账户
repl_user=myslave

#设置发生切换后发送的报警的脚本
report_script=/usr/local/send_report

#设置检查从服务器的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.12 -s 192.168.80.13

#设置故障发生后关闭故障主机脚本
shutdown_script=""

#设置ssh的登录用户名
ssh_user=root

[server2]
#设置候选master,如果设置了此参数,发生主从切换后,会将此库提升为主库
candidate_master=1
#支持复制的检查,默认情况下如果一个slave落后master 100M的relay logs(中继日志)的话,
MHA将不会选择该slave作为新的master,设置为0的话会忽略此规则
check_repl_delay=0

hostname=192.168.80.12
port=3306


4.10 第一次配置需要在Master节点上手动开启虚拟IP

/sbin/ifconfig ens33:1 192.168.80.200/24

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

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

4.12 manager节点上测试mysql主从连接情况

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

4.13 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 &

----------------------------------------------------------

--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--manger_log:日志存放位置。
--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记目录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover

4.14 查看MHA状态

masterha_check_status --conf=/etc/masterha/app1.cnf
可以看到当前的 master 是 Mysql1 节点。

4.15 查看当前日志信息

cat /var/log/masterha/app1/manager.log 

4.16 查看Mysql1的VIP地址

ifconfig
VIP地址不会因为manager节点停止MHA服务而消失

4.17 关闭manager服务

masterha_stop --conf=/etc/masterha/app1.cnf
或者可以直接采用kill进程ID的方式关闭

五、故障模拟

#在manager节点上监控观察日志记录
tail -f /var/log/masterha/app1/manager.log

#在Master节点Mysql1上停止mysql服务
systemctl stop mysqld
或
pkill -9 mysql

#正常自动切换一次后,MHA进程会退出。HMA会自动修改app1.cnf文件内容,将宕机的mysql1节点删除。查看mysql2是否接管VIP

ifconfig

---------------------------------------------
故障切换备选主库的算法:
1.一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。
2.数据一致的情况下,按照配置文件顺序,选择备选主库。
3.设定有权重(candidate_master=1),按照权重强制指定备选主。
(1)默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
(2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主



六、故障修复

1.修复mysql
systemctl restart mysqld

2.修复主从
#在现主库服务器 Mysql2 查看二进制文件和同步点
mysql -uroot -p264196
show master status;

#在原主库服务器mysql1执行同步操作
change master to master_host='192.168.80.12',master_user='myslave',master_password='264196',master_log_file='master-bin.000001',master_log_pos=154;

start slave;

3.在manager节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
vi /etc/masterha/app1.cnf
......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.10 -s 192.168.80.12
......
[server1]
hostname=192.168.80.12
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.80.11
port=3306

[server3]
hostname=192.168.80.13
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 &

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




posted @ 2021-09-06 18:37  落寞1111  阅读(296)  评论(0编辑  收藏  举报