MHA高可用与故障切换

一、MHA的概述

1、 MHA的概念

MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。

MHA 的出现就是解决MySQL 单点的问题。

MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

2.MHA 的组成

●MHA Node(数据节点)

MHA Node 运行在每台 MySQL 服务器上。

●MHA Manager(管理节点)

MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。

MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。

3.MHA 的特点

●自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失

●使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性

●目前MHA支持一主多从架构,最少三台服务,即一主两从

二、搭建 MySQL MHA的操作步骤

1、实验思路:

1.1、MHA架构

1)数据库安装

2)一主两从

3)MHA搭建

1.2、故障模拟

1)主库失效

2)备选主库成为主库

3)原故障主库恢复重新加入到MHA成为从库

2、环境准备

MHA manager 节点服务器:CentOS7.4(64 位) manager/192.168.229.50,安装MHA node 和 manager 组件

Master 节点服务器:CentOS7.4(64 位) mysql1/192.168.229.90,安装mysql5.7、MHA node 组件

Slave1 节点服务器:CentOS7.4(64 位) mysql2/192.168.229.80,安装mysql5.7、MHA node 组件

Slave2 节点服务器:CentOS7.4(64 位) mysql3/192.168.229.70,安装mysql5.7、MHA node 组件

systemctl stop firewalld
systemctl disable firewalld
setenforce 0 

3、修改 Master、Slave1、Slave2 节点的主机名

Master、Slave1、Slave2 节点上安装 mysql5.7

hostnamectl set-hostname Mysql1
hostnamectl set-hostname Mysql2
hostnamectl set-hostname Mysql3 

4、修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf

##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 #三台服务器的 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
 
systemctl restart mysqld  

5、在 Master、Slave1、Slave2 节点上都创建两个软链接

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

6、配置 mysql 一主两从

(1)所有数据库节点进行 mysql 授权

mysql -uroot -p
grant replication slave on *.* to 'myslave'@'192.168.229.%' identified by '12345';  #从数据库同步使用
grant all privileges on *.* to 'mha'@'192.168.229.%' 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;  

(2)在 Master 节点查看二进制文件和同步点

show master status;

(3)在 Slave1、Slave2 节点执行同步操作

change master to master_host='192.168.229.90',master_user='myslave',master_password='12345',master_log_file='master-bin.000001',master_log_pos=1215;
 
start slave; 

(4)在 Slave1、Slave2 节点查看数据同步结果

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

(5)两个从库必须设置为只读模式:

set global read_only=1; 

(6)插入数据测试数据库同步

##在 Master 主库插入条数据,测试是否同步##

create database test_db;
use test_db;
create table test(id int);
insert into test(id) values (1);

7、安装 MHA 软件

(1)所有服务器上都安装 MHA 依赖的环境,首先安装 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 

(2)安装 MHA 软件包,先在所有服务器上必须先安装 node 组件

对于每个操作系统版本不一样,这里 CentOS7.4 必须选择 0.57 版本。

在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。

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

(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_manger 启动 manager的脚本

masterha_check_status 检测当前 MHA 运行状态

masterha_master_monitor 检测 master 是否宕机

masterha_master_switch 控制故障转移(自动或者手动)

masterha_conf_host 添加或删除配置的 server 信息

masterha_stop 关闭manager

#node 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:

save_binary_logs 保存和复制 master 的二进制日志

apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave

filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)

purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)

8.在所有服务器上配置无密码认证

(1)在 manager 节点上配置到所有数据库节点的无密码认证

ssh-keygen -t rsa #一路按回车键
ssh-copy-id 192.168.229.80
ssh-copy-id 192.168.229.70
ssh-copy-id 192.168.229.90 

(2)在 mysql1 上配置到数据库节点 mysql2 和 mysql3 的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.229.80
ssh-copy-id 192.168.229.70 

(3)在 mysql2 上配置到数据库节点 mysql1 和 mysql3 的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.229.90
ssh-copy-id 192.168.229.80 

(4)在 mysql3 上配置到数据库节点 mysql1 和 mysql2 的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.229.90
ssh-copy-id 192.168.229.80

9.在 manager 节点上配置 MHA

(1)在 manager 节点上复制相关脚本到/usr/local/bin 目录

cp -rp /opt/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)复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin  

(3)修改内容如下:(删除原有内容,直接复制并修改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.229.200';    #指定vip的地址
my $brdc = '192.168.229.255';   #指定vip的广播地址
my $ifdev = 'ens33';    #指定vip绑定的网卡
my $key = '1';  #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   #代表此变量值为ifconfig ens33:1 192.168.229.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";    #代表此变量值为ifconfig ens33:1 192.168.229.200 down
my $exit_code = 0;  #指定退出状态码为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 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
 
vim /etc/masterha/app1.cnf  #删除原有内容,直接复制并修改节点服务器的IP地址
[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
ping_interval=1
remote_workdir=/tmp
repl_password=12345
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.229.80 -s 192.168.229.70
shutdown_script=""
ssh_user=root
user=mha
 
[server1]
hostname=192.168.229.90
port=3306
 
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.229.80
port=3306
 
[server3]
hostname=192.168.229.70
port=3306  

-------------------------------解释---------------------------------------------------------------------------

[server default]
manager_log=/var/log/masterha/app1/manager.log                         #manager日志
manager_workdir=/var/log/masterha/app1.log                            #manager工作目录
master_binlog_dir=/usr/local/mysql/data/                             #master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便MHA能找到
master_ip_failover_script=/usr/local/bin/master_ip_failover              #设置自动failover时候的切换脚本,也就是上面的那个脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change    #设置手动切换时候的切换脚本
password=manager                                                       #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1                                                            #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp                                                    #设置远端mysql在发生切换时binlog的保存位置
repl_password=12345                                                    #设置复制用户的密码
repl_user=myslave                                                      #设置复制用户的用户
report_script=/usr/local/send_report                                    #设置发生切换后发送的报警的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.229.80 -s 192.168.229.70  #指定检查的从服务器IP地址
shutdown_script=""                                                      #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root                                                               #设置ssh的登录用户名
user=mha                                                                #设置监控用户root
 
[server1]
hostname=192.168.229.90
port=3306
 
[server2]
hostname=192.168.229.80
port=3306
candidate_master=1
#设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个从库不是集群中最新的slave
 
check_repl_delay=0
#默认情况下如果一个slave落后master 超过100M的relay logs的话,MHA将不会选择该slave作为一个新的master, 因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
 
[server3]
hostname=192.168.229.70
port=3306

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

/sbin/ifconfig ens33:1 192.168.229.200/24 

11、在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出 successfully,如下所示。

masterha_check_ssh -conf=/etc/masterha/app1.cnf
 
Tue Nov 26 23:09:45 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Nov 26 23:09:45 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Tue Nov 26 23:09:45 2020 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Tue Nov 26 23:09:45 2020 - [info] Starting SSH connection tests..
Tue Nov 26 23:09:46 2020 - [debug]
Tue Nov 26 23:09:45 2020 - [debug] Connecting via SSH from root@192.168.229.80(192.168.229.80:22) to root@192.168.229.70(192.168.229.70:22)..
Tue Nov 26 23:09:46 2020 - [debug] ok.
Tue Nov 26 23:09:47 2020 - [debug]
Tue Nov 26 23:09:46 2020 - [debug] Connecting via SSH from root@192.168.229.80(192.168.229.80:22) to root@192.168.229.70(192.168.229.70:22)..
Tue Nov 26 23:09:47 2020 - [debug] ok.
Tue Nov 26 23:09:47 2020 - [info] All SSH connection tests passed successfully.    

12、在 manager 节点上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常。如下所示。

masterha_check_repl -conf=/etc/masterha/app1.cnf
[root@192 masterha]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
Tue Sep  7 12:51:38 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Sep  7 12:51:38 2021 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Tue Sep  7 12:51:38 2021 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Tue Sep  7 12:51:38 2021 - [info] Starting SSH connection tests..
Tue Sep  7 12:51:39 2021 - [debug]
Tue Sep  7 12:51:38 2021 - [debug]  Connecting via SSH from root@192.168.229.90(192.168.229.90:22) to root@192.168.229.80(192.168.229.80:22)..
Tue Sep  7 12:51:38 2021 - [debug]   ok.
Tue Sep  7 12:51:38 2021 - [debug]  Connecting via SSH from root@192.168.229.90(192.168.229.90:22) to root@192.168.229.70(192.168.229.70:22)..
Tue Sep  7 12:51:38 2021 - [debug]   ok.
Tue Sep  7 12:51:39 2021 - [debug]
Tue Sep  7 12:51:38 2021 - [debug]  Connecting via SSH from root@192.168.229.80(192.168.229.80:22) to root@192.168.229.90(192.168.229.90:22)..
Tue Sep  7 12:51:38 2021 - [debug]   ok.
Tue Sep  7 12:51:38 2021 - [debug]  Connecting via SSH from root@192.168.229.80(192.168.229.80:22) to root@192.168.229.70(192.168.229.70:22)..
Tue Sep  7 12:51:39 2021 - [debug]   ok.
Tue Sep  7 12:51:40 2021 - [debug]
Tue Sep  7 12:51:39 2021 - [debug]  Connecting via SSH from root@192.168.229.70(192.168.229.70:22) to root@192.168.229.90(192.168.229.90:22)..
Tue Sep  7 12:51:39 2021 - [debug]   ok.
Tue Sep  7 12:51:39 2021 - [debug]  Connecting via SSH from root@192.168.229.70(192.168.229.70:22) to root@192.168.229.80(192.168.229.80:22)..
Tue Sep  7 12:51:39 2021 - [debug]   ok.
Tue Sep  7 12:51:40 2021 - [info] All SSH connection tests passed successfully.  g]  ok.``Tue Sep 7 12:51:40 2021 - [info] All SSH connection tests passed successfully.  

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。
----------------------------------------------------------------------------------------------------------

14、查看 MHA 状态,可以看到当前的 master 是 Mysql1 节点。

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

15. 查看 MHA 日志,也以看到当前的 master 是 192.168.229.90,如下所示。

cat /var/log/masterha/app1/manager.log | grep "current master" 

16.查看 Mysql1 的 VIP 地址 192.168.229.200 是否存在,这个 VIP 地址不会因为 manager 节点停止 MHA 服务而消失。

ifconfig   

//若要关闭 manager 服务,可以使用如下命令。

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

或者可以直接采用 kill 进程 ID 的方式关闭。

三、故障模拟以及故障恢复的步骤

1、故障模拟

#在 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 

2、故障切换备选主库的算法:

一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。

数据一致的情况下,按照配置文件顺序,选择备选主库。

设定有权重(candidate_master=1),按照权重强制指定备选主。

(1)默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。

(2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。

3、故障修复步骤:

3.1.修复mysql

systemctl restart mysqld  

3.2.修复主从

#在现主库服务器 Mysql2 查看二进制文件和同步点

show master status;  

#在原主库服务器 mysql1 执行同步操作

change master to master_host='192.168.229.80',master_user='myslave',master_password='12345',master_log_file='master-bin.000001',master_log_pos=1745;
 
start slave;

3.3.在 manager 节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)

vi /etc/masterha/app1.cnf
......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.229.90 -s 192.168.229.70
......
[server1]
hostname=192.168.229.80
port=3306
 
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.229.90
port=3306
 
[server3]
hostname=192.168.229.70
port=3306   

3.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 & 

#解决中英字不兼容报错的问题

dos2unix /usr/local/bin/master_ip_failover

四、实例操作:搭建MySQL MHA

环境准备(主从服务器已安装mysql):

MHA manager 节点服务器:CentOS7(64 位) manager/192.168.2.22,安装MHA node 和 manager 组件

Master 节点服务器:CentOS7(64 位) mysql1/192.168.2.99,安装mysql5.7、MHA node 组件

Slave1 节点服务器:CentOS7(64 位) mysql2/192.168.2.66,安装mysql5.7、MHA node 组件

Slave2 节点服务器:CentOS7(64 位) mysql3/192.168.2.200,安装mysql5.7、MHA node 组件

1、搭建主从复制(一主两从)

1.1 关闭所有服务器的防火墙

1.2 修改 Master、Slave1、Slave2 节点的主机名

1.3 在所有服务器上/etc/hosts添加IP与主机名的解析并进行ping测试

1.4 修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf

##Master 节点##

##Slave1、Slave2 节点##

1.5 在 Master、Slave1、Slave2 节点上都创建两个软链接

1.6 所有数据库节点进行 mysql 授权(一主两从)

1.7 在 Master 节点查看二进制文件和同步点

1.8 在 Slave1、Slave2 节点执行同步操作,并查看数据同步结果

1.9 两个从库必须设置为只读模式:

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

2、MHA搭建

2.1 所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源

2.2 安装 MHA 软件包,先在所有服务器上必须先安装 node 组件

2.3 在 MHA manager 节点上安装 manager 组件

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

2.4.1 在 manager 节点上配置到所有数据库节点的无密码认证

2.4.2 在 mysql1 上配置到数据库节点 mysql2 和 mysql3 的无密码认证

2.4.3 在 mysql2 上配置到数据库节点 mysql1 和 mysql3 的无密码认证

2.4.4 在 mysql3 上配置到数据库节点 mysql1 和 mysql2 的无密码认证

2.5 在 manager 节点上配置 MHA

2.5.1 在 manager 节点上复制相关脚本到/usr/local/bin 目录

2.5.2 复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换

2.5.3 修改内容如下:(删除原有内容,直接复制并修改vip相关参数)

2.5.4 创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

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

2.5.6 在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出 successfully

2.5.7 在 manager 节点上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常


经排查是因为/etc/masterha/aap1.cnf中的datadir路径与master中bin-log的位置不一致导致的,去master的/etc/my.cnf文件中查找bin-log的存储路径

2.5.8 在 manager 节点上启动 MHA

2.5.9 查看 MHA 状态,可以看到当前的 master 是 Mysql1 节点。

2.5.10 查看 MHA 日志,也以看到当前的 master 是 192.168.229.90

2.5.11 查看 Mysql1 的 VIP 地址 192.168.229.200 是否存在,这个 VIP 地址不会因为 manager 节点停止 MHA 服务而消失

在master查看VIP信息

对manager 节点停止 MHA 服务

再次查看master的VIP是否存在

3、故障模拟

3.1 在 manager 节点上监控观察日志记录

3.2 在 Master 节点 Mysql1 上停止mysql服务  

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

查看master的IP

在manager服务器查看日志记录并在mysql2 服务器中查看mysql2是否接管 VIP

manager服务器上的日志记录

在mysql2 服务器中查看IP

4、故障修复:

4.1 修复mysql,在mysql1重启服务

4.2 修复主从

4.2.1 在现主库服务器 Mysql2 查看二进制文件和同步点

4.2.2 在原主库服务器 mysql1 执行同步操作

4.3 在 manager 节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)

master宕机之后,MHA服务会停止,修改完文件之后要开启MHA服务,即恢复故障

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20688.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端需要注意和了解的SEO

SEO的基本了解 1.什么是SEO? SEO&#xff08;Search Engine Optimization又叫做搜索引擎优化。是一种方式&#xff1a;利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。 2. 前端怎么理解SEO? 对于SEO引擎&#xff0c;在前端需要的是做出来的网站&#xff0c;页面…

揭秘物联网平台设备管理核心!Java代码示例对比,一篇文章全知道!

《高并发系统实战派》-- 值得拥有 一、 设备管理模块的意义 设备管理模块是物联网平台的核心模块之一&#xff0c;主要负责设备的接入、注册、管理、监控等工作&#xff0c;是构建物联网平台的基础。通过设备管理模块&#xff0c;可以实现对设备的资源动态管理、设备状态实时…

服务(第二十一篇)mysql高级查询语句(二)

①视图表&#xff1a; 视图表是虚拟表&#xff0c;用来存储SQL语句的定义 如果视图表和原表的字段相同&#xff0c;是可以进行数据修改的&#xff1b; 如果两者的字段不通&#xff0c;不可以修改数据。 语法&#xff1a; 创建&#xff1a;create view 试图表名 as ... 查…

vue3项目搭建超详解

vue3安装与目录讲解 文章目录 vue3安装与目录讲解安装node.jsnpm绑定淘宝镜像安装vue脚手架创建vue项目目录解释推荐使用vscode 安装node.js http://nodejs.cn/download/ 根据自己电脑的位数自行下载。可安装到任意盘哈&#xff0c;因为我C盘比较大&#xff0c;我就直接在C盘了…

springboot项目如何优雅停机

文章目录 前言kill -9 pid的危害如何优雅的停机理论步骤优雅方式1、kill -15 pid 命令停机2、ApplicationContext close停机3、actuator shutdown 停机4、ApplicationListener 监听延时停机 前言 相信很多同学都会用Kill -9 PID来杀死进程&#xff0c;如果用在我们微服务项目里…

快速入门matlab——变量练习

学习目标&#xff1a;1.掌握matlab编程中最常用的几种变量类型 2.对变量类型的属性有所熟悉&#xff0c;不要求记忆&#xff0c;知道了解即可 3.要求熟练运用这几种变量类型创建自己的变量 clear all; % 清除Workspace中的所有…

FreeRTOS_移植和配置

目录 1. 什么是FreeRTOS&#xff1f; 2. FreeRTOS 特点 3. FreeRTOS 移植 3.1 验证程序 1. 什么是FreeRTOS&#xff1f; 我们先看 FreeRTOS 的名字&#xff0c;可以分成两部分&#xff1a;Free 和 RTOS&#xff0c;Free 就是免费的、自由的、不受约束的意思&#xff0c;RTO…

ERP、SCM与CRM系统的关系和区别是什么?

在当今数字化时代&#xff0c;企业管理系统扮演着至关重要的角色&#xff0c;而ERP、SCM和CRM系统是其中三个核心组成部分。 虽然它们都在企业管理中发挥着关键作用&#xff0c;但它们各自的功能和应用领域存在一些区别。 我们先来看看&#xff0c;ERP、SCM与CRM系统分别是啥…

DevExpress:报表控件绑定数据库数据源的三种方式(Winform)

1.写在前面 如果你是和我一样&#xff0c;第一次接触DevExpress&#xff0c;并且因为网上资源眼花缭乱无从下手&#xff0c;然后脑子一转直接到DevExpress官网寻找官方使用文档的&#xff0c;那我们的了解顺序应该差不多是一致的。 DevExpress官网&#xff1a;https://www.de…

(十六)数据编辑——图形编辑②

数据编辑——图形编辑② 目录 数据编辑——图形编辑②1.5线要素的延长和裁剪1.5.1线要素延长1.5.2线要素裁剪 1.6要素的变形与缩放1.6.1要素变形操作1.6.2要素缩放操作 1.7要素结点的编辑1.7.1添加结点1.7.2删除结点1.7.3移动结点 1.5线要素的延长和裁剪 单击编辑器下拉菜单&a…

ChatGPT 联网和插件功能,下周起可直接使用,无需排队!

夕小瑶科技说 分享 来源 | 新智元 OpenAI和谷歌&#xff0c;已经打得急红了眼&#xff0c;ChatGPT Plus用户&#xff0c;下周就可以体验联网和插件功能&#xff0c;无需再排队。鲨疯了&#xff0c;真的鲨疯了&#xff01; ChatGPT&#xff0c;下周开始联网&#xff0c;并开放插…

字典翻译EasyTrans简单使用分享

前言 最近太忙了&#xff0c;一直按在项目上摩擦&#xff0c;都没有时间写分享了。今天终于市把所有负责的模块都写完了&#xff0c;本次迭代引入了字典翻译&#xff0c;借这个机会顺便分享下。 一、什么是字典翻译 所谓的字典翻译其实简单理解就是一些不常更新的有键值对属性的…

如何利用python调用API接口获取数据进行测试

一、Python 可以使用 requests 库来调用 API 接口获取数据。以下是基本的步骤&#xff1a; 1.安装 requests 库 pip install requests 2.导入 requests 库 import requests 3.构建 API 请求的 URL 根据 API 文档&#xff0c;构建请求的URL。 例如&#xff0c; https://a…

从BinDiff到0day 在IE中利用CVE-2019-1208

前言 如上所述&#xff0c;CVE-2019-1208是UAF漏洞&#xff0c;这类安全漏洞可以破坏有效数据、引发进程crash、并且可以精心利用最终导致任意代码执行。而对于本文介绍的CVE-2019-1208而言&#xff0c;成功利用此漏洞的攻击者可以获得系统当前用户权限。如果当前用户具有admi…

C++: 计时器类的设计和实现

文章目录 1. 目的2. 功能列表3. 基础功能&#xff1a;获取耗时4. API 设计: Timer 类5. 单元测试6. API 实现 1. 目的 使用 C Class 的形式&#xff0c;封装原本 C语言的获取时间的函数&#xff0c;提供更容易使用的计时器调用。 使用 C03&#xff0c;原因是和先前的线程安全队…

python+vue流浪动物公益科普宠物在线领养网站

使用动物在线领养网站的用户分管理员和用户两个角色的权限子模块。 开发语言&#xff1a;Python 框架&#xff1a;django/flask Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 系统所要实现的功…

AI 时代,知识工作者的生存指南

最近&#xff0c;大家可能已经见识过 AI 的威力了吧&#xff0c;以 ChatGPT 为代表的 人工智能&#xff08;AI&#xff09;展现出接近人一样的回答水准。 来自 Craft AI Assitant AI 就在那里&#xff0c;是房间里的大象&#xff0c;大家不能总装做对自己没有影响。要知道&…

[架构之路-199] - 可靠性需求与可靠性分析:鱼骨图、故障树分析法FTA、失效模式与影响DFMEA,找到影响故障的主要因素

目录 引言&#xff1a; 第1章 故障树分析法与鱼骨图的比较 1.1 相同点 1.2 区别点 第2章 鱼骨图 第3章 故障树 3.1 示意图 3.2 故障树解读 3.3 故障树常见符号 第4章 产品失效(Failure)模式分析DFMEA 引言&#xff1a; 目标系统/产品的可靠性和性能在客户需求阶段就…

脂溶性荧光染料Cy7标记羧酸Cy7-COOH/Carboxylic acids星戈瑞

CY7-COOH是一种含有羧基的化合物&#xff0c;它的分子式为C37H45ClN2O2&#xff0c;分子量519.12。其化学结构中包含有一个吲哚菁骨架&#xff0c;以及一个羧基&#xff08;COOH&#xff09;官能团。它的分子式为C37H45ClN2O2&#xff0c;分子量519.12。CY7-COOH是一种近红外荧…

requset页面的代码逻辑

1. 封装请求基地址 在src目录下 放上一个专门写请求相关的文件夹 然后在里面新建一个专门放用户请求的use.js 用axios发送请求 在use.js文件夹里导入request 并且根据接口文档 写请求 然后把这个请求封装成一个函数&#xff0c;这个函数里需要传入两个参数 这两个参数 都放在d…