MySQL MHA 单主架构 主从切换 高可用

news2024/11/18 4:45:40

        MHA (Master High AvailabilityManager and tools for MySQL) 目前在MySQL高可用方面是一个相对成熟的解决方案,它是由日本人youshimaton采用Perl语言编写的一个脚本管理工具。目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器,一主二从,即一台充当Master,一台充当备用Master,另一台充当从库。

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

 MHA单主架构 MMM双主结构

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支持一主多从架构,最少三台服务,即一主两从

MHA工作原理(面试题)

MHA可以管理多个主从复制集群

每个机器都是一个mha node。并且有一个mha manage管理所有node(包括mha manage那台机器也是一个mha node)。【manage节点部署mha_manage和mha_node,其余节点只需部署mha_node】

MHA Manager 会定时探测集群中的 master 节点(发送ping包),若某个复制组中的master宕机(ping包不回),MHA manage就会做故障切换(将VIP地址漂移到新的主服务器上),将拥有最全数据的slave【给予VIP地址】提升为新的master(可以手动指定),然后将所有其他的slave 重新指向新的master做主从复制。

对于客户端来说对数据库的连接通过VIP地址,不知道内部发生过切换,对客户端是透明的。




----------------------搭建 MySQL MHA--------------------------------

MHA部署过程(面试可能问)

  1. 所有 MySQL 做主从复制用户授权,和 mha-manager 访问数据库用户的授权
  2. 先做时间同步和 MySQL 主从复制,并设置从为只读模式
  3. 所有节点安装 mha-node 组件,在 manager 节点安装 mha-manager 组件
  4. 所有节点做 SSH 秘钥对免交互登录认证
  5. 在mha-manager节点上准备好 故障切换脚本 和 manager 进程配置文件
  6. 在master节点使用ifconfig创建VIP
  7. 使用masterha_check_ssh和masterha_check_rep1 做好mha启动前的检查,再使用 mha-manager 启动 mha-manager 进程
  8. 做故障切换测试(故障切换后 mha-manager 进程会自动退出,配置文件自动删除旧的master配置,vip会自动漂移到新的master节点,其他slave会自动更新 master做主从复制)

实验思路


1.MHA架构
1)数据库安装
2)一主两从
3)MHA搭建

2.故障模拟
1)主库失效
2)备选主库成为主库
3)原故障主库恢复重新加入到MHA成为从库

服务器分配

MHA manager 节点服务器manager192.168.80.30安装MHA node 和 manager 组件
Master 节点服务器 mysql1192.168.80.11安装MHA node 组件、mysql5.7
Slave1 节点服务器mysql2192.168.80.12安装MHA node 组件、mysql5.7
Slave2 节点服务器mysql3192.168.80.13安装MHA node 组件、mysql5.7
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

1.Master、Slave1、Slave2 节点上安装 mysql5.7,并且NTP同步时间

ntpdate ntp.aliyun.com

2.修改 Master、Slave1、Slave2 节点的主机名,设置hosts域名解析(可以不做,但是方便辨识,方便下面的命令用短域名替换长地址)

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

su
vim /etc/hosts

192.168.80.30 manager
192.168.80.11 mysql1
192.168.80.12 mysql2
192.168.80.13 mysql3

 

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

##Master 节点##Slave1、Slave2 节点##

vim /etc/my.cnf

[mysqld]
server-id = 1 #三台服务器的 server-id 不能一样
log_bin = mysql-bin
binlog_format=mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index

··················································

[mysqld]
server-id = 1 #三台服务器的 server-id 不能一样
log_bin = mysql-bin
binlog_format=mixed 
#由于可能发生主从切换成为主服务器,所以所有MySQL服务器都要开启二进制日志以便主从复制

log-slave-updates = true 
#由于可能发生主从切换,此选项规定slave 从 master 复制的数据也要写入二进制日志文件。
#当本服务器故障后变为slave,仍记录完整的二进制日志以便恢复为master后继续共享给从服务器。

relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
#开启中继日志,主服务器切换为从服务器时需要使用
--------------------------------------------------
由于会发生主从切换,建议在所有服务器上都开启
log_bin/binlog_format【二进制日志】
relay-log/relay-log-index 【中继日志】
log-slave-updates=true 【slave从master复制得到的数据也会写入二进制文件】
systemctl restart mysqld

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

        以便之后的脚本中可以调用命令

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

5.配置 mysql 一主两从

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

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

···························································································

mysql -uroot -p
grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '123456';
grant all privileges on *.* to 'mha'@'192.168.80.%' identified by '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 节点执行同步master操作

change master to master_host='192.168.80.11',master_port=3306,master_user='myslave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=154;

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);

6.安装 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 线程)
 

7.在所有服务器上配置无密码认证(ssh免交互登录)

所有服务器设置

可以先在各服务器上更改ssh配置,这样就不用ssh连接其他主机时需要输入yes,更加方便

vim /etc/ssh/ssh_config

    #取消35行注释并设置no 
    StrictHostKeyChecking no

使用SSHPASS插件进行SSH输入密码免交互登录 ,更加方便

yum install -y sshpass
sshpass -p '密码' ssh-copy-id mysql1

 

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

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

若使用SSHPASS组件进行免交互输入(之前已经设置了host,地址写了域名)
#ssh-keygen -t rsa
#sshpass -p '密码' ssh-copy-id mysql1
#sshpass -p '密码' ssh-copy-id mysql2
#sshpass -p '密码' ssh-copy-id mysql3

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

ssh-keygen -t rsa
ssh-copy-id 192.168.80.12
ssh-copy-id 192.168.80.13

若使用SSHPASS组件进行免交互输入(之前已经设置了host,地址写了域名)
#ssh-keygen -t rsa
#sshpass -p '密码' ssh-copy-id mysql2
#sshpass -p '密码' ssh-copy-id mysql3

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

ssh-keygen -t rsa
ssh-copy-id 192.168.80.11
ssh-copy-id 192.168.80.13

若使用SSHPASS组件进行免交互输入(之前已经设置了host,地址写了域名)
#ssh-keygen -t rsa
#sshpass -p '密码' ssh-copy-id mysql1
#sshpass -p '密码' ssh-copy-id mysql3

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

ssh-keygen -t rsa
ssh-copy-id 192.168.80.11
ssh-copy-id 192.168.80.12

若使用SSHPASS组件进行免交互输入(之前已经设置了host,地址写了域名)
#ssh-keygen -t rsa
#sshpass -p '密码' ssh-copy-id mysql1
#sshpass -p '密码' ssh-copy-id mysql2

8.在 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相关参数。可在拷贝前输入 :set paste 解决vim粘贴乱序问题)

代码段1(代码段1也可使用,但是本次实验使用下方代码段2,代码段2只需要设置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';									#指定vip的地址
my $brdc = '192.168.80.255';								#指定vip的广播地址
my $ifdev = 'ens33';										#指定vip绑定的网卡
my $key = '1';												#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此变量值为ifconfig ens33:1 192.168.80.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此变量值为ifconfig ens33:1 192.168.80.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";
}

 代码段2(本次实验使用此段代码,只需要设置VIP地址,实验可行)

#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
 
use Getopt::Long;
 
my (
    $command, $orig_master_host, $orig_master_ip,$ssh_user,
    $orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
    $orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);
 
# 这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效
my $vip = '192.168.80.200/24';   #✨本段代码只需要设置VIP地址
my $key = '1';
# 这里的网卡名称 “ens33” 需要根据你机器的网卡名称进行修改
# 如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一
# 我这边实际情况是修改成统一的网卡名称
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip"; #✨如果不是ens33网卡才修改
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down"; #✨如果不是ens33网卡才修改
my $ssh_Bcast_arp= "sudo /sbin/arping -I ens33 -c 3 -A $vip"; #✨如果不是ens33网卡才修改

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,
    'orig_master_ssh_port=i' => \$orig_master_ssh_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
    'new_master_ssh_port' => \$new_master_ssh_port,
    'new_master_user' => \$new_master_user,
    'new_master_password' => \$new_master_password
 
);
 
exit &main();
 
sub main {
    $ssh_user = defined $ssh_user ? $ssh_user : 'root';
    print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();
        &start_arp();
            $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 \"`;
}
sub stop_vip() {
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
 
sub start_arp() {
    `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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 节点服务器

在各个服务器创建MHA工作目录

manage节点创建mha与mha-node

cd /opt
mkdir -p /opt/mysql-mha/mha
#mha工作目录
mkdir -p /opt/mysql-mha/mha-node
#远程主机工作目录
其余MySQL服务器创建mha-node

mkdir -p /opt/mysql-mha/mha-node
#远程主机工作目录

 在manager服务器编辑配置文件

cd /opt/mysql-mha
vim /opt/mysql-mha/mysql-mha.cnf

#删除原有内容,直接复制并修改节点服务器的IP地址

[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha
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
user=mha
password=manager
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_password=123456
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
check_repl_delay=0
hostname=192.168.80.12
port=3306

[server3]
hostname=192.168.80.13
port=3306

----------------------------------------------------------------------------------------------------------
[server default]
manager_log=/opt/mysql-mha/manager.log  #manager日志
manager_workdir=/opt/mysql-mha/mha       #✨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  #设置手动切换时候的切换脚本
user=mha					#✨设置mysql用户
password=manager			#✨设置mysql用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1				#设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/opt/mysql-mha/mha-node	#设置mha在远程节点上的工作目录(远端mysql在发生切换时binlog的保存位置)
repl_user=myslave			#✨设置主从复制用户的用户名
repl_password=123456	    #✨设置主从复制用户的密码
ssh_user=root				#设置ssh的登录用户名
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	#指定检查的从服务器IP地址
shutdown_script=""			#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)

[server1]
hostname=192.168.80.11
port=3306

[server2]
hostname=192.168.80.12
port=3306
candidate_master=1
#设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个从库不是集群中最新的slave
check_repl_delay=0 #由于设置了候选master,忽略中继日志的延迟,就是无论如何都让server2作为候选
#默认情况下如果一个slave落后master 超过100M的relay logs的话,MHA将不会选择该slave作为一个新的master, 因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master

[server3]
hostname=192.168.80.13
port=3306
----------------------------------------------------------------------------------------------------------

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

/sbin/ifconfig ens33:1 192.168.80.200/24

需要保证VIP与网卡 与vim /usr/local/bin/master_ip_failover中VIP地址与网卡key设置一致

 

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

masterha_check_ssh -conf=/opt/mysql-mha/mysql-mha.cnf

Tue Jun 27 19:24:48 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Jun 27 19:24:48 2023 - [info] Reading application default configuration from /opt/mysql-mha/mysql-mha.cnf..
Tue Jun 27 19:24:48 2023 - [info] Reading server configuration from /opt/mysql-mha/mysql-mha.cnf..
Tue Jun 27 19:24:48 2023 - [info] Starting SSH connection tests..
Tue Jun 27 19:24:49 2023 - [debug]
Tue Jun 27 19:24:48 2023 - [debug]  Connecting via SSH from root@192.168.80.11(192.168.80.11:22) to root@192.168.80.12(192.168.80.12:22)..
Tue Jun 27 19:24:49 2023 - [debug]   ok.
Tue Jun 27 19:24:49 2023 - [debug]  Connecting via SSH from root@192.168.80.11(192.168.80.11:22) to root@192.168.80.13(192.168.80.13:22)..
Tue Jun 27 19:24:49 2023 - [debug]   ok.
Tue Jun 27 19:24:50 2023 - [debug]
Tue Jun 27 19:24:49 2023 - [debug]  Connecting via SSH from root@192.168.80.13(192.168.80.13:22) to root@192.168.80.11(192.168.80.11:22)..
Tue Jun 27 19:24:50 2023 - [debug]   ok.
Tue Jun 27 19:24:50 2023 - [debug]  Connecting via SSH from root@192.168.80.13(192.168.80.13:22) to root@192.168.80.12(192.168.80.12:22)..
Tue Jun 27 19:24:50 2023 - [debug]   ok.
Tue Jun 27 19:24:50 2023 - [debug]
Tue Jun 27 19:24:48 2023 - [debug]  Connecting via SSH from root@192.168.80.12(192.168.80.12:22) to root@192.168.80.11(192.168.80.11:22)..
Tue Jun 27 19:24:49 2023 - [debug]   ok.
Tue Jun 27 19:24:49 2023 - [debug]  Connecting via SSH from root@192.168.80.12(192.168.80.12:22) to root@192.168.80.13(192.168.80.13:22)..
Tue Jun 27 19:24:50 2023 - [debug]   ok.
Tue Jun 27 19:24:50 2023 - [info] All SSH connection tests passed successfully.

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

masterha_check_repl -conf=/opt/mysql-mha/mysql-mha.cnf


Tue Jun 27 19:51:04 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Jun 27 19:51:04 2023 - [info] Reading application default configuration from /opt/mysql-mha/mysql-mha.cnf..
Tue Jun 27 19:51:04 2023 - [info] Reading server configuration from /opt/mysql-mha/mysql-mha.cnf..
Tue Jun 27 19:51:04 2023 - [info] MHA::MasterMonitor version 0.57.
Tue Jun 27 19:51:05 2023 - [info] GTID failover mode = 0
Tue Jun 27 19:51:05 2023 - [info] Dead Servers:
Tue Jun 27 19:51:05 2023 - [info] Alive Servers:
Tue Jun 27 19:51:05 2023 - [info]   192.168.80.11(192.168.80.11:3306)
Tue Jun 27 19:51:05 2023 - [info]   192.168.80.12(192.168.80.12:3306)
Tue Jun 27 19:51:05 2023 - [info]   192.168.80.13(192.168.80.13:3306)
Tue Jun 27 19:51:05 2023 - [info] Alive Slaves:
Tue Jun 27 19:51:05 2023 - [info]   192.168.80.12(192.168.80.12:3306)  Version=5.7.41-log (oldest major version between slaves) log-bin:enabled
Tue Jun 27 19:51:05 2023 - [info]     Replicating from 192.168.80.11(192.168.80.11:3306)
Tue Jun 27 19:51:05 2023 - [info]     Primary candidate for the new Master (candidate_master is set)
Tue Jun 27 19:51:05 2023 - [info]   192.168.80.13(192.168.80.13:3306)  Version=5.7.41-log (oldest major version between slaves) log-bin:enabled
Tue Jun 27 19:51:05 2023 - [info]     Replicating from 192.168.80.11(192.168.80.11:3306)
Tue Jun 27 19:51:05 2023 - [info] Current Alive Master: 192.168.80.11(192.168.80.11:3306)
Tue Jun 27 19:51:05 2023 - [info] Checking slave configurations..
Tue Jun 27 19:51:05 2023 - [info]  read_only=1 is not set on slave 192.168.80.12(192.168.80.12:3306).
Tue Jun 27 19:51:05 2023 - [warning]  relay_log_purge=0 is not set on slave 192.168.80.12(192.168.80.12:3306).
Tue Jun 27 19:51:05 2023 - [warning]  relay_log_purge=0 is not set on slave 192.168.80.13(192.168.80.13:3306).
Tue Jun 27 19:51:05 2023 - [info] Checking replication filtering settings..
Tue Jun 27 19:51:05 2023 - [info]  binlog_do_db= , binlog_ignore_db=
Tue Jun 27 19:51:05 2023 - [info]  Replication filtering check ok.
Tue Jun 27 19:51:05 2023 - [info] GTID (with auto-pos) is not supported
Tue Jun 27 19:51:05 2023 - [info] Starting SSH connection tests..
Tue Jun 27 19:51:07 2023 - [info] All SSH connection tests passed successfully.
Tue Jun 27 19:51:07 2023 - [info] Checking MHA Node version..
Tue Jun 27 19:51:08 2023 - [info]  Version check ok.
Tue Jun 27 19:51:08 2023 - [info] Checking SSH publickey authentication settings on the current master..
Tue Jun 27 19:51:08 2023 - [info] HealthCheck: SSH to 192.168.80.11 is reachable.
Tue Jun 27 19:51:08 2023 - [info] Master MHA Node version is 0.57.
Tue Jun 27 19:51:08 2023 - [info] Checking recovery script configurations on 192.168.80.11(192.168.80.11:3306)..
Tue Jun 27 19:51:08 2023 - [info]   Executing command: save_binary_logs --command=test --start_pos=4 --binlog_dir=/usr/local/mysql/data --output_file=/opt/mysql-mha/mha-node/save_binary_logs_test --manager_version=0.57 --start_file=mysql-bin.000003
Tue Jun 27 19:51:08 2023 - [info]   Connecting to root@192.168.80.11(192.168.80.11:22)..
  Creating /opt/mysql-mha/mha-node if not exists..    ok.
  Checking output directory is accessible or not..
   ok.
  Binlog found at /usr/local/mysql/data, up to mysql-bin.000003
Tue Jun 27 19:51:09 2023 - [info] Binlog setting check done.
Tue Jun 27 19:51:09 2023 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers..
Tue Jun 27 19:51:09 2023 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='mha' --slave_host=192.168.80.12 --slave_ip=192.168.80.12 --slave_port=3306 --workdir=/opt/mysql-mha/mha-node --target_version=5.7.41-log --manager_version=0.57 --relay_log_info=/usr/local/mysql/data/relay-log.info  --relay_dir=/usr/local/mysql/data/  --slave_pass=xxx
Tue Jun 27 19:51:09 2023 - [info]   Connecting to root@192.168.80.12(192.168.80.12:22)..
  Checking slave recovery environment settings..
    Opening /usr/local/mysql/data/relay-log.info ... ok.
    Relay log found at /usr/local/mysql/data, up to relay-log-bin.000002
    Temporary relay log file is /usr/local/mysql/data/relay-log-bin.000002
    Testing mysql connection and privileges..mysql: [Warning] Using a password on the command line interface can be insecure.
 done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Tue Jun 27 19:51:09 2023 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='mha' --slave_host=192.168.80.13 --slave_ip=192.168.80.13 --slave_port=3306 --workdir=/opt/mysql-mha/mha-node --target_version=5.7.41-log --manager_version=0.57 --relay_log_info=/usr/local/mysql/data/relay-log.info  --relay_dir=/usr/local/mysql/data/  --slave_pass=xxx
Tue Jun 27 19:51:09 2023 - [info]   Connecting to root@192.168.80.13(192.168.80.13:22)..
  Checking slave recovery environment settings..
    Opening /usr/local/mysql/data/relay-log.info ... ok.
    Relay log found at /usr/local/mysql/data, up to relay-log-bin.000002
    Temporary relay log file is /usr/local/mysql/data/relay-log-bin.000002
    Testing mysql connection and privileges..mysql: [Warning] Using a password on the command line interface can be insecure.
 done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Tue Jun 27 19:51:09 2023 - [info] Slaves settings check done.
Tue Jun 27 19:51:09 2023 - [info]
192.168.80.11(192.168.80.11:3306) (current master)
 +--192.168.80.12(192.168.80.12:3306)
 +--192.168.80.13(192.168.80.13:3306)

Tue Jun 27 19:51:09 2023 - [info] Checking replication health on 192.168.80.12..
Tue Jun 27 19:51:09 2023 - [info]  ok.
Tue Jun 27 19:51:09 2023 - [info] Checking replication health on 192.168.80.13..
Tue Jun 27 19:51:09 2023 - [info]  ok.
Tue Jun 27 19:51:09 2023 - [info] Checking master_ip_failover_script status:
Tue Jun 27 19:51:09 2023 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.80.11 --orig_master_ip=192.168.80.11 --orig_master_port=3306


IN SCRIPT TEST====root|sudo /sbin/ifconfig ens33:1 down==root|sudo /sbin/ifconfig ens33:1 192.168.80.200/24===

Checking the Status of the script.. OK
Tue Jun 27 19:51:09 2023 - [info]  OK.
Tue Jun 27 19:51:09 2023 - [warning] shutdown_script is not defined.
Tue Jun 27 19:51:09 2023 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

 故障排除

在实验中,由于设置主库崩溃,从库成为主库,此时无法MHA重新启动,报错,有两个主库。将新出的主库取消,重新设置主从同步即可。

#取消主库
reset master;
#指向主库
change master to master_host='192.168.80.11',master_port=3306,master_user='myslave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154;
#开启从库功能
start slave;

 

12.在 manager 节点上启动 MHA,后台运行

nohup masterha_manager \
--conf=/opt/mysql-mha/mysql-mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/manager.log 2>&1 &

--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。(MHA主从切换后MHA配置文件会有什么变化?[])
--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong效应。不连续切换,保证数据完整性。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在 app1.failover.complete 日志文件中记录,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换, 除非在第一次切换后删除该文件,

为了实验进行故障恢复方便,这里设置为--ignore_last_failover。生产环境不写。

●使用&后台运行程序:结果会输出到终端;使用Ctrl+C发送SIGINT信号,程序免疫;关闭session发送SIGHUP信号,程序关闭。
●使用nohup运行程序:结果默认会输出到nohup.out;使用Ctrl+C发送SIGINT信号,程序关闭;关闭session发送SIGHUP信号,程序免疫。
●使用nohup和&配合来启动程序nohup ./test &:同时免疫SIGINT和SIGHUP信号。

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

masterha_check_status --conf=/opt/mysql-mha/mysql-mha.cnf

 

 

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

cat /opt/mysql-mha/manager.log | grep "current master"

 

 

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

ifconfig

 

 

//若要关闭 manager 服务,可以使用如下命令。或者可以直接采用 kill 进程 ID 的方式关闭。

masterha_stop --conf=/opt/mysql-mha/mysql-mha.cnf


---------------------- 故障模拟 --------------------------------

#新开一个SSH会话,在 manager 节点上监控观察日志记录

tail -f /opt/mysql-mha/manager.log

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

systemctl stop mysqld
或
pkill -9 mysql

切回查看日志的SSH会话,查看日志,可见能够完成主从切换 

 

 

 

#正常自动切换一次后,MHA 进程会退出。

masterha_check_status --conf=/opt/mysql-mha/mysql-mha.cnf 

#并且由于HMA 启动时设置了--remove_dead_master_conf \ 会自动修改 app1.cnf 文件内容,将宕机的 mysql1 节点删除。

查看配置文件,server1已经被除名

cat /opt/mysql-mha/mysql-mha.cnf

  

查看 mysql2 是否接管 VIP 

ifconfig

MySQL1的VIP 被迁移到MySQL2上。

 

 

在MySQL3上登录,查看主服务器为MySQL2 

mysql -uroot -p
show slave status\G

 

 

故障切换备选主库的算法

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

故障修复步骤

故障修复的思路是

  1. 重启mysql1
  2. mysql2现在为主服务器那mysql1就老老实实做从服务器,mysql1把mysql2作为主服务器做主从同步
  3. 然后再mysql-mha.cnf配置文件中重新加入mysql1,设置候选从服务器选项
  4. 重启MHA

1.重启mysql1

systemctl restart mysqld

2.修复主从

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

show master status;

 

 

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

change master to master_host='192.168.80.12',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;

start slave;

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

vim /opt/mysql-mha/mysql-mha.cnf

......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.11 -s 192.168.80.13
......
[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=/opt/mysql-mha/mysql-mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/manager.log 2>&1 &

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

dos2unix /usr/local/bin/master_ip_failover 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于java+swing+mysql选课管理系统V2.0

基于javaswingmysql选课管理系统V2.0 一、系统介绍二、功能展示1.项目骨架2.项目内容3.登陆4.注册界面5、主界面6、添加选课8、修改选课 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java SE项目&#xff08;GUI图形界面&#xff09; 项目名称&…

深入浅出设计模式 - 桥接模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

68、基于51单片机语音识别控制小车行走系统设计(程序+原理图+PCB源文件+参考论文+开题报告+任务书+元器件清单等)

摘 要 随着电子工业的发展&#xff0c;具有语音控制功能的小车越来越受到人们的青睐&#xff0c;在人们的日常消费生活中起着不可忽视的作用。目前&#xff0c;声控技术已在很多领域得到使用。 本文对语音控制功能的小车概况做了阐述。在硬件设计方面&#xff0c;本论文以凌阳…

【Java高级语法】(二十)数学运算类:全面讲解Java数学计算的高级类库,BigDecimal、Math、Random、DecimalFormat...~

Java高级语法详解之数学运算类 1️⃣ 概念&#x1f50d; 数学运算类汇总 2️⃣ 优势和缺点3️⃣ 使用3.1 各数学计算支持类使用案例3.2 Math类解析3.3 BigDecimal类解析3.4 Random类解析3.5 DecimalFormat类解析 4️⃣ 应用场景5️⃣ 使用技巧&#x1f33e; 总结&#x1f4d1; …

ssm校园防疫管理系统-计算机毕设 附源码80315

ssm校园防疫管理系统 摘 要 2019年12月19号中国武汉发生第一例新冠病毒的到来&#xff0c;大家都在听从政府的号召在居家隔离&#xff0c;不管是在城市还是在乡镇、农村&#xff0c;这引起我的注目&#xff0c;设计一套大学ssm校园防疫管理系统&#xff0c;疫情防疫需要大家共同…

配置了git config --global credential.helper store后,还是弹出输入密码框

使用http协议拉取代码时,每次pull/push都会弹出账号密码框,可以使用git的配置credential.helper来保存每次输入的账号密码到硬盘上,命令git config --global credential.helper store,store表示存到硬盘中,但是按照这样操作后git pull还是弹出密码框,通过git config --list发现…

ESP32(MicroPython) WS2812 RGB流水灯 新版

ESP32&#xff08;MicroPython&#xff09; RGB流水灯 新版 本程序相比上一个程序&#xff0c;改用了24灯的环形WS2812模块&#xff0c;数据引脚改用13脚。增加了把相应颜色重复2次&#xff08;即前半部分和后半部分的灯颜色排列相同&#xff09;和4次的模式&#xff0c;模式增…

关于element-ui form表单必填项已经选入值并回填了,但是还会报错必填提示

哈喽 大家好啊 今天用el-form表单的时候 发现明明已经选入值并回填了 发现还是会触发必填报错 如图所示&#xff1a; 因为我这里是点击后右边是一个select选项帮助 然后点击确认后回填 经过发现&#xff0c;是因为rule表单触发校验规则 receiverName: [{ required: true, t…

HiveSQL之datediff、date_add、date_sub详解及注意坑点

文章目录 datediff介绍&#xff1a;示例1&#xff1a;正常情况示例2&#xff1a;负值情况注意&#xff1a;使用场景示例总结 date_add介绍&#xff1a; date_sub介绍&#xff1a; 注意&#xff1a; datediff 介绍&#xff1a; datediff语法: datediff(string enddate,string …

2023上半年Java高频面试题库总结(600+java面试真题含答案解析)

不知什么时候起&#xff0c;互联网行业掀起一股寒冬之风&#xff0c;到处都给人一种岌岌可危的寒颤之感&#xff0c;总觉得是要见不到明日的太阳一般&#xff0c;细细想来&#xff0c;最近的行业内的各种状况确实让不少人有此担忧。 从我认识的好几个程序员口中了解到&#xff…

8.0、Java_IO流 - 如何利用缓冲区提高读写效率 ?

8.0、Java_IO流 - 如何利用缓冲区提高读写效率 &#xff1f; 简单介绍&#xff1a; FileInputStream 通过字节的方式读取文件&#xff0c;适合读取所有类型的文件&#xff08;图像、视频、文本文件等&#xff09;&#xff1b;Java 也提供了 FileReader 字符流 专门读取文本文件…

linux系统之lvm方式挂载磁盘

目录 一、简介二、创建LVM三、删除 一、简介 LVM&#xff1a;逻辑卷管理(Logical Volume Manager) 它是Linux环境下对磁盘分区进行管理的一种机制。LVM是建立在硬盘和分区之上的一个逻辑层&#xff0c;来提高磁盘分区管理的灵活性。它由ibm公司提出。目的&#xff1a;在原始设…

简单认识Nginx配置块location及rewrite

文章目录 一、location配置块1、分类2、location 常用的匹配规则3、location 优先级&#xff1a;4.location 匹配流程5、location实际使用规则1、直接匹配网站根目录首页2、处理静态文件请求3、通用规则 二、rewrite配置块1、简介2、rewrite跳转实现3、rewrite 执行顺序4.rewri…

数据结构——归并排序和计数排序的介绍

文章目录 归并排序归并排序的思想单趟排序的实现归并排序实现非递归版本的实现特性总结 计数排序计数排序的思想计数排序的实现特性总结 归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治&#xff08;Divide and…

【Java】Map和Set

目录 一、搜索树 1、概念 2、操作-查找 3、操作-插入 4、操作-删除&#xff08;难点&#xff09; 6、性能分析 二、搜索 1、概念及场景 2、模型 三、Map 的使用 1、关于Map的说明 2、关于Map.Entry的说明,> 3、Map 的常用方法说明 4、TreeMap的使用案例 四、…

Django之ORM

一、Django模型层之ORM介绍 使用Django框架开发web应用的过程中&#xff0c;不可避免地会涉及到数据的管理操作&#xff08;增、删、改、查&#xff09;&#xff0c;而一旦谈到数据的管理操作&#xff0c;就需要用到数据库管理软件&#xff0c;例如mysql、oracle、Microsoft S…

护航行业安全!安全狗入选2023年度中国数字安全能力图谱(行业版)

近日&#xff0c;数世咨询正式发布了《2023年度中国数字安全能力图谱&#xff08;行业版&#xff09;》。 作为国内云原生安全领导厂商&#xff0c;安全狗也入选多个细项。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;成立于2013年&#xff0c;…

8大service mesh框架大比拼,Istio不是唯一的选择!

文章目录 一、IsitoConsulLinkerdKumaOpen Service MeshMesheryTraefik MeshService Mesh Interface&#xff08;SMI&#xff09; 公众号&#xff1a; MCNU云原生&#xff0c;文章首发地&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;第一时间掌握&#xff01…

Linux bluez蓝牙开发的准备工作

最近为了搞这个蓝牙的事情&#xff0c;忙碌了好几天&#xff0c;我就是想结合 bluez 的代码随便玩一下蓝牙设备&#xff0c;而且能够参考源码写点测试程序来操作这个蓝牙设备。这里只是说明 Linux 下的准备工作而非嵌入式的arm。 1&#xff0c;系统支持 我用的是真机安装的 D…

路由与交换技术(H3C)①——计算机网络基础

系列文章目录 ①——计算机网络基础 路由与交换技术&#xff08;H3C&#xff09;①——计算机网络概述 系列文章目录一 计算机网络概述1.1 计算机网络1.2 计算机网络的基本功能1.2.1 资源共享1.2.2 分布式处理与负载均衡1.2.3 综合信息服务 二 计算机网络的演进2.1 主机互联时…