MySQL MHA故障切换

目录

一、案例分析

1.1、案例概述 

1.2、案例前置知识点

1)什么是 MHA 

2)MHA 的组成 

3)MHA 的优势 

4)MHA 现状 

1.3、案例环境 

1)本案例环境 

​编辑 2)案例需求 

3)案例实现思路 

二、案例实施 

2.1、安装 MySQL 数据库 

1)修改 Master 的配置文件

2)配置从服务器 

2.2、配置 mysql 一主两从 

1)MySQL 授权 

2)查看二进制文件和同步点 

3)执行同步操作 

4)查看数据同步结果 

 5)插入数据测试数据库同步

2.3、安装 MHA 软件 

2.4、配置无密码认证 

2.5、配置 MHA 

2.6、模拟 Master 故障 

1)自动切换 


一、案例分析

1.1、案例概述 

目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA 的出现就是解决 MySQL 单点的问题。另外随着企业数据量越来越庞大,数据库的压力又成为企业的另一个 瓶颈,MySQL 多主多从架构的出现可以减轻 MySQL 本身的压力。本章将主要介绍 MHA 的搭建和模拟 MySQL 故障自动切换的过程。 

1.2、案例前置知识点

1)什么是 MHA 

MHA(MasterHigh Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本 DeNA 公司 youshimaton(现就职于 Facebook 公司)开发,是一套优秀的 MySQL 高可用环境下故障切换和主从复制的软件。在 MySQL 故障切换过程中,MHA 能做 到在 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。 

2)MHA 的组成 

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

3)MHA 的优势 

在 MHA 自动故障切换过程中,MHA 试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过SSH 访问,MHA 没法保存二进制日志,就会出现只进行故障转移但丢失了最新的数据的情 况。使用 MySQL 5.5 的半同步复制,可以大大降低数据丢失的风险。MHA 可以与半同步复制结合起来。如果只有一个 slave 已经收到了最新的二进制日志,MHA 可以将最新的二进制日志应用于其他所有的 slave 服务器上,因此可以保证所有节点的数据一致性。 

4)MHA 现状 

目前 MHA 主要支持一主多从的架构,要搭建 MHA 要求一个复制集群中必须最少有三台数据库服务器,即一台充当 master,一台充当备用 master,另外一台充当从库。因为至少需要三台服务器,出于机器成本的考虑,淘宝在该基础上进行了改造,目前淘宝 TMHA 已经支持一主一从。 

1.3、案例环境 

1)本案例环境 

本案例环境如下表所示:

主机操作系统主机名/IP地址角色
服务器CentOS7.6(64 位)MHA-manager/192.168.23.205管理节点,安装 manager 组件
服务器CentOS7.6(64 位)mysql1/192.168.23.202Master 节点,安装 node 组件
服务器CentOS7.6(64 位)mysql2/192.168.23.203Slave 节点,安装 node 组件
服务器CentOS7.6(64 位)mysql3/192.168.23.204Slave 节点,安装 node 组件

本案例中用到 MySQL 版本请从官网进行下载,MHA 的版本请从一些相关资源进行下载。因为 google 官网上面最新的还是 2012 年 0.55 版本,而且 0.55 版本只支持到 CentOS6, 这里操作系统是 CentOS7 版本,所以这里下载 MHA 版本是 0.57。MHA 架构如下图所示。 

 MHA架构图

上图中 MHA 可以同时监控并管理多个 MySQL 复制组,本案例只实验其中的一个复制组,具体拓扑图如下图所示

 2)案例需求 

本案例要求通过 MHA 监控 MySQL 数据库在故障时进行自动切换,不影响业务。 

3)案例实现思路 

  1. 安装 MySQL 数据库;
  2. 配置 MySQL 一主两从;
  3. 安装 MHA 软件;
  4. 配置无密码认证;
  5. 配置 MySQL MHA 高可用;
  6. 模拟 master 故障切换。 

二、案例实施 

2.1、安装 MySQL 数据库 

  • 在三台 mysql 节点上分别安装数据库,MySQL 版本使用 5.7.28。

下面只在 Mysql1 上面做演示,其他机器步骤相同,

[root@mysql1 ~]# vim /etc/yum.repos.d/mysql57.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=0

[root@mysql1 ~]# yum -y install mysql mysql-server


  • 启动 MySQL 数据库 
[root@mysql1 ~]# systemctl start mysqld
[root@mysql1 ~]# systemctl enable mysqld
  • 修改数据库密码 
[root@mysql1 ~]# grep password /var/log/mysqld.log   //查看数据库初始密码
2024-03-15T03:47:37.948606Z 1 [Note] A temporary password is generated for root@localhost: Pi/QNiztE8vK
[root@mysql1 ~]# mysql -u root -p'Pi/QNiztE8vK'

mysql> set password=password('Cisco@123');  //修改密码
Query OK, 0 rows affected, 1 warning (0.01 sec)

1)修改 Master 的配置文件

[root@mysql1 ~]# vim /etc/my.cnf  //添加以下几行内容
server-id=1
log-bin=mysql-bin
log-slave-updates=true
default-storage-engine=INNODB

[root@mysql1 ~]# systemctl restart mysqld  //重启服务

2)配置从服务器 

在/etc/my.cnf 中增加下面内容。 

[root@mysql2 ~]# vim /etc/my.cnf
server-id=2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
log-bin=mysql-bin
relay_log_purge=0

[root@mysql2 ~]# systemctl restart mysqld  //重启服务

注意:server-id 不能相同,两台 slave 服务器的 id 分别配置为 2 和 3,其他相同 

2.2、配置 mysql 一主两从 

MySQL 的主从配置相对比较简单。本章实验要配置一个主数据库、两个从数据库。 

1)MySQL 授权 

在所有数据库节点上授权两个用户,一个是从数据库同步使用,另外一个是 manager 使用。 

mysql> grant replication slave on *.* to 'myslave'@'192.168.23.%' identified by 'Cisco@123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> grant all privileges on *.* to 'mha'@'192.168.23.%' identified by 'Cisco@123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

下面三条授权按理论是不用添加的,但是在做案例实验时通过 MHA 检查 MySQL 主从有报错,报两个从库通过主机名连接不上主库,所以三个数据库都添加下面的授权。 

mysql> grant all privileges on *.* to 'mha'@'mysql1' identified by 'Cisco@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'mysql2' identified by 'Cisco@123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> grant all privileges on *.* to 'mha'@'mysql3' identified by 'Cisco@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

2)查看二进制文件和同步点 

在 Mysql1 主机上查看二进制文件和同步点

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1593 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3)执行同步操作 

在 Mysql2 和 Mysql3 分别执行同步 

mysql> change master to master_host='192.168.23.202',master_user='myslave',master_password='Cisco@123',master_log_file='mysql-bin.000001',master_log_pos=1593;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

4)查看数据同步结果 

查看 IO 和 SQL 线程都是 yes 代表同步是否正常 

mysql> show slave status\G
*************************** 1. row ***************************
           ......//省略部分内容
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
           ......//省略部分内容
mysql> 

 必须设置两个从库为只读模式,在两个从库上分别执行

mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)

 5)插入数据测试数据库同步

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

mysql> create database auth;
Query OK, 1 row affected (0.00 sec)

mysql> use auth;
Database changed
mysql> create table info(id int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into info values(1);
Query OK, 1 row affected (0.01 sec)

mysql> 

在两个从库分别查询,出现如下所示执行结果则说明主从同步正常。 

mysql> select * from auth.info;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> 

2.3、安装 MHA 软件 

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

[root@mysql1 ~]# yum -y install epel-release
[root@mysql1 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
  • MHA 软件包对于每个操作系统版本不一样,这里 CentOS7.6 必须选择 0.57 版本。 在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件, 因为 manager 依赖 node 组件。下面是在 Mysql1 上操作演示安装 node 组件 
[root@mysql1 ~]# tar zxf mha4mysql-node-0.57.tar.gz 
[root@mysql1 ~]# cd mha4mysql-node-0.57/
[root@mysql1 mha4mysql-node-0.57]# perl Makefile.PL
[root@mysql1 mha4mysql-node-0.57]# make && make install
  • 在 MHA-manager 上安装 manager 组件 
[root@mha-manager ~]# tar zxf mha4mysql-manager-0.57.tar.gz 
[root@mha-manager ~]# cd mha4mysql-manager-0.57/
[root@mha-manager mha4mysql-manager-0.57]# perl Makefile.PL
[root@mha-manager mha4mysql-manager-0.57]# make && make install

manager 安装后在/usr/local/bin 下面会生成几个工具,主要包括:

  • masterha_check_ssh:检查 MHA 的 SSH 配置状况。
  • masterha_check_repl:检查 MySQL 复制状况。
  • masterha_manger:启动 MHA。
  • masterha_check_status:检测当前 MHA 运行状态。
  • masterha_master_monitor:检测 master 是否宕机。
  • masterha_master_switch:控制故障转移(自动或者手动)。
  • masterha_conf_host:添加或删除配置的 server 信息。 

node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHA Manager 的脚本触发,无需人为操作)。 

  • save_binary_logs:保存和复制 master 的二进制日志。
  • apply_diff_relay_logs:识别差异的中继日志事件并将其差异的事件应用于其他的 slave。
  • filter_mysqlbinlog:去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)。
  • purge_relay_logs:清除中继日志(不会阻塞 SQL 线程)。 

2.4、配置无密码认证 

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

[root@mha-manager ~]# ssh-keygen -t rsa  //一路按回车键
[root@mha-manager ~]# ssh-copy-id 192.168.23.202
[root@mha-manager ~]# ssh-copy-id 192.168.23.203
[root@mha-manager ~]# ssh-copy-id 192.168.23.204

2)在 Mysql1 上配置到数据库节点的无密码认证 

[root@mysql1 ~]# ssh-keygen -t rsa
[root@mysql1 ~]# ssh-copy-id 192.168.23.203
[root@mysql1 ~]# ssh-copy-id 192.168.23.204

3)在 Mysql2 上配置到数据库节点的无密码认证 

[root@mysql2 ~]# ssh-keygen -t rsa
[root@mysql2 ~]# ssh-copy-id 192.168.23.202
[root@mysql2 ~]# ssh-copy-id 192.168.23.204

4)在 Mysql3 上配置到数据库节点的无密码认证 

[root@mysql3 ~]# ssh-keygen -t rsa
[root@mysql3 ~]# ssh-copy-id 192.168.23.202
[root@mysql3 ~]# ssh-copy-id 192.168.23.203

2.5、配置 MHA 

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

[root@mha-manager ~]# ls /root/mha4mysql-manager-0.57/samples/scripts/
master_ip_failover  master_ip_online_change  power_manager  send_report
[root@mha-manager ~]# cp /root/mha4mysql-manager-0.57/samples/scripts/* /usr/local/bin/

脚本具体作用如下所示:

  • master_ip_failover:自动切换时 VIP 管理的脚本
  • master_ip_online_change:在线切换时 vip 的管理
  • power_manager:故障发生后关闭主机的脚本
  • send_report:因故障切换后发送报警的脚本

复制“master_ip_failover”脚本到/usr/local/bin 目录,这里使用脚本管理 VIP,也是推荐的一种方式,生产环境不建议使用 Keepalived。 

2)使用下面内容完整替换 master_ip_failover 文件的内容,IP 部分更换为自己的 IP 地址。 

[root@mha-manager ~]# cat /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.23.200/24';
my $key = '1';
my $ssh_start_vip = "/usr/sbin/ifconfig ens33:$key $vip up";
my $ssh_stop_vip = "/usr/sbin/ifconfig ens33:$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" ) {
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 \"`;
}
sub stop_vip() {
return 0 unless ($ssh_user);
`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";
}

[root@mha-manager ~]# 

3)创建 MHA 软件目录并拷贝配置文件 

[root@mha-manager ~]# mkdir /etc/masterha
[root@mha-manager ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
[root@mha-manager ~]# mkdir -p /var/log/masterha/app1
[root@mha-manager ~]# cat /etc/masterha/app1.cnf 
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir=/var/lib/mysql
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=Cisco@123
ping_interval=1
remote_workdir=/tmp
repl_user=myslave
repl_password=Cisco@123
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.23.203 -s 192.168.23.204
shutdown_script=""
ssh_user=root
[server1]
hostname=192.168.23.202
port=3306
[server2]
hostname=192.168.23.203
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=192.168.23.204
port=3306

[root@mha-manager ~]# 

candidate_master 与 check_repl_delay 的主要作用如下所示 

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

4)测试 ssh 无密码认证,如果正常最后会输出 successfully,如下所示 

[root@mha-manager ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
Fri Mar 15 14:41:34 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Mar 15 14:41:34 2024 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Fri Mar 15 14:41:34 2024 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Fri Mar 15 14:41:34 2024 - [info] Starting SSH connection tests..
Fri Mar 15 14:41:37 2024 - [debug] 
Fri Mar 15 14:41:34 2024 - [debug]  Connecting via SSH from root@192.168.23.202(192.168.23.202:22) to root@192.168.23.203(192.168.23.203:22)..
Fri Mar 15 14:41:35 2024 - [debug]   ok.
Fri Mar 15 14:41:35 2024 - [debug]  Connecting via SSH from root@192.168.23.202(192.168.23.202:22) to root@192.168.23.204(192.168.23.204:22)..
Fri Mar 15 14:41:36 2024 - [debug]   ok.
Fri Mar 15 14:41:37 2024 - [debug] 
Fri Mar 15 14:41:35 2024 - [debug]  Connecting via SSH from root@192.168.23.203(192.168.23.203:22) to root@192.168.23.202(192.168.23.202:22)..
Fri Mar 15 14:41:35 2024 - [debug]   ok.
Fri Mar 15 14:41:35 2024 - [debug]  Connecting via SSH from root@192.168.23.203(192.168.23.203:22) to root@192.168.23.204(192.168.23.204:22)..
Fri Mar 15 14:41:36 2024 - [debug]   ok.
Fri Mar 15 14:41:37 2024 - [debug] 
Fri Mar 15 14:41:35 2024 - [debug]  Connecting via SSH from root@192.168.23.204(192.168.23.204:22) to root@192.168.23.202(192.168.23.202:22)..
Fri Mar 15 14:41:36 2024 - [debug]   ok.
Fri Mar 15 14:41:36 2024 - [debug]  Connecting via SSH from root@192.168.23.204(192.168.23.204:22) to root@192.168.23.203(192.168.23.203:22)..
Fri Mar 15 14:41:36 2024 - [debug]   ok.
Fri Mar 15 14:41:37 2024 - [info] All SSH connection tests passed successfully.
[root@mha-manager ~]# 

5)测试 mysq 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常,如下所示。

[root@mha-manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf
Fri Mar 15 14:46:49 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Mar 15 14:46:49 2024 - [info] Reading application default configuration from 
Fri Mar 15 14:46:51 2024 - [info] GTID failover mode = 0
Fri Mar 15 14:46:51 2024 - [info] Dead Servers:
Fri Mar 15 14:46:51 2024 - [info] Alive Servers:
Fri Mar 15 14:46:51 2024 - [info]   192.168.23.202(192.168.23.202:3306)
Fri Mar 15 14:46:51 2024 - [info]   192.168.23.203(192.168.23.203:3306)
Fri Mar 15 14:46:51 2024 - [info]   192.168.23.204(192.168.23.204:3306)
Fri Mar 15 14:46:51 2024 - [info] Alive Slaves:
Fri Mar 15 14:46:51 2024 - [info]   192.168.23.203(192.168.23.203:3306)  Version=5.7.44-log (oldest major version between slaves) log-bin:enabled
Fri Mar 15 14:46:51 2024 - [info]     Replicating from 192.168.23.202(192.168.23.202:3306)
Fri Mar 15 14:46:51 2024 - [info]     Primary candidate for the new Master (candidate_master is set)
Fri Mar 15 14:46:51 2024 - [info]   192.168.23.204(192.168.23.204:3306)  Version=5.7.44-log (oldest major version between slaves) log-bin:enabled
Fri Mar 15 14:46:51 2024 - [info]     Replicating from root@192.168.23.202(192.168.23.202:22).. 
  Creating /tmp if not exists..    ok.
......//省略部分内容
Fri Mar 15 14:46:57 2024 - [info] Checking replication health on 192.168.23.203..
Fri Mar 15 14:46:57 2024 - [info]  ok.
Fri Mar 15 14:46:57 2024 - [info] Checking replication health on 192.168.23.204..
Fri Mar 15 14:46:57 2024 - [info]  ok.
Fri Mar 15 14:46:57 2024 - [info] Checking master_ip_failover_script status:
Fri Mar 15 14:46:57 2024 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.23.202 --orig_master_ip=192.168.23.202 --orig_master_port=3306 


IN SCRIPT TEST====/usr/sbin/ifconfig ens33:1 down==/usr/sbin/ifconfig ens33:1 192.168.23.200/24 up===

Checking the Status of the script.. OK 
Fri Mar 15 14:46:57 2024 - [info]  OK.
Fri Mar 15 14:46:57 2024 - [warning] shutdown_script is not defined.
Fri Mar 15 14:46:57 2024 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.
[root@mha-manager ~]# 

6)首次配置 MHA 的 VIP 地址需要手动进行配置,在 Mysql1 上执行如下命令。

[root@mysql1 ~]# ifconfig ens32:1 192.168.23.200
[root@mysql1 ~]# ifconfig ens32:1
ens32:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.23.200  netmask 255.255.255.0  broadcast 192.168.23.255
        ether 00:0c:29:a6:5d:e7  txqueuelen 1000  (Ethernet)

[root@mysql1 ~]# 

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

7)启动 MHA

[root@mha-manager ~]# 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 &
[1] 69834

配置参数具体作用如下所示。 

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

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

[root@mha-manager ~]# masterha_stop --conf=/etc/masterha/app1.cnf

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

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

[root@mha-manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:69834) is running(0:PING_OK), master:192.168.23.202
[root@mha-manager ~]#

9)查看 MHA 日志,也以看到当前的 master 是 192.168.23.202,如下所示 

[root@mha-manager ~]# cat /var/log/masterha/app1/manager.log
......//省略部分内容
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Fri Mar 15 14:52:25 2024 - [info] Slaves settings check done.
Fri Mar 15 14:52:25 2024 - [info] 
192.168.23.202(192.168.23.202:3306) (current master)
 +--192.168.23.203(192.168.23.203:3306)
 +--192.168.23.204(192.168.23.204:3306)

Fri Mar 15 14:52:25 2024 - [info] Checking master_ip_failover_script status:
Fri Mar 15 14:52:25 2024 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.23.202 --orig_master_ip=192.168.23.202 --orig_master_port=3306 


IN SCRIPT TEST====/usr/sbin/ifconfig ens33:1 down==/usr/sbin/ifconfig ens33:1 192.168.23.200/24 up===

Checking the Status of the script.. OK 
Fri Mar 15 14:52:25 2024 - [info]  OK.
192.168.23.202(192.168.23.202:3306)..
Fri Mar 15 14:52:25 2024 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
[root@mha-manager ~]# 

2.6、模拟 Master 故障 

1)自动切换 

  • 手动 kill 掉当前的 master 
[root@mysql1 ~]# pkill -9 mysql

也可以采用下面两种方法 

[root@mysql1 ~]# systemctl stop mysqld
[root@mysql1 ~]# mysqladmin -u root -p shutdown 

  • 观察 MHA 日志,如果自动切换成功,最后会输出 successfully 字样 
[root@mha-manager ~]# tail -f /var/log/masterha/app1/manager.log 
Invalidated master IP address on 192.168.23.202(192.168.23.202:3306)
The latest slave 192.168.23.203(192.168.23.203:3306) has all relay logs for recovery.
Selected 192.168.23.203(192.168.23.203:3306) as a new master.
192.168.23.203(192.168.23.203:3306): OK: Applying all logs succeeded.
192.168.23.203(192.168.23.203:3306): OK: Activated master IP address.
192.168.23.204(192.168.23.204:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
192.168.23.204(192.168.23.204:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.23.203(192.168.23.203:3306)
192.168.23.203(192.168.23.203:3306): Resetting slave info succeeded.
Master failover to 192.168.23.203(192.168.23.203:3306) completed successfully.

如主库修复后,可继续使用如下步骤,使其重新加入群集,并将 Mysql1 作为从库。

  • 启动 mysql1 主库 
[root@mysql1 ~]# systemctl start mysqld
[root@mysql1 ~]# mysql -u root -pCisco@123

mysql> change master to master_host='192.168.23.203',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=1593,master_user='myslave',master_password='Cisco@123';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> 
  • 启动从库同步并设置为只读 
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)
  • 停掉当前主库(Mysql2)的同步进程,不然下次作为从库同步会报错 
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)

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

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

相关文章

基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

web学习笔记(三十三)

目录 1.严格模式 1.1严格模式的概念&#xff1a; 1.2严格模式在语义上更改的地方&#xff1a; 1.3如何开启严格模式 1.4严格模式应用上的变化 2.原型链 1.严格模式 1.1严格模式的概念&#xff1a; 严格模式有点像es5向es6过渡而产生的一种模式&#xff0c;因为es6的语法…

蓝桥杯决赛2023 RE CyberChef2

思路很清晰&#xff0c;爆IV 但是题目出的有点屎&#xff0c;六位字符串&#xff0c;62的6次方&#xff0c;要我爆到猴年马月&#xff1f; 就当练习脚本吧 #Cyber2 wp from Crypto.Cipher import DES, AES from Crypto.Util.Padding import pad, unpad key_des b0a0b0c0…

从零开始利用MATLAB进行FPGA设计(三)将Simulink模型转化为定点数据类型

文章灵感来源于MATLAB官方免费教程&#xff1a;HDL Coder Self-Guided Tutorial 考虑到MATLAB官网的英文看着慢&#xff0c;再加上视频讲解老印浓浓的咖喱味&#xff0c;我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。 往期回顾&am…

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Span)

作为Text组件的子组件&#xff0c;用于显示行内文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件从API Version 10开始支持继承父组件Text的属性&#xff0c;即如果子组件未设置…

linux内存介绍

一、linux内存框图 二、meminfo信息说明 cat /proc/meminfo MemTotal: 2017504 kB //所有可用的内存大小&#xff0c; 物理内存减去预留位和内核使用。系统从加电开始到引导完成&#xff0c;firmware/BIOS要预留一 些内存&#xff0c;内核本身要占用一些内存&#xff0…

微信小程序云开发教程——墨刀原型工具入门(表单组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

16.旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

【PyTorch】基础学习:在终端中打印当前虚拟环境下的Pytorch版本信息

【PyTorch】基础学习&#xff1a;在终端中打印或查看当前虚拟环境下的Pytorch版本信息 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

springboot 动漫周边商城的设计与实现

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

Selenium控制已运行的Edge和Chrome浏览器——在线控制 | 人机交互(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令&#xff08;1&#xff09;Edge&#xff08;2&#xff09;Chrome 2. 执行python代码&#xff08;1&#xff09;先启动浏览器后执行代码&#xff08;2&#xff09;通过代码启动浏览器&#xff08;3&#xff09;Bug问题记录1&#xff…

kubernetes部署集群

kubernetes部署集群 集群部署获取镜像安装docker[集群]阿里仓库下载[集群]集群部署[集群]集群环境配置[集群]关闭系统Swap[集群]安装Kubeadm包[集群]配置启动kubelet[集群]配置master节点[master]配置使用网络插件[master]node加入集群[node]后续检查[master]测试集群 集群部署…

力扣面试150 两数之和 II - 输入有序数组 双指针 HashMap

Problem: 167. 两数之和 II - 输入有序数组 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int[] twoSum(int[] numbers, int target) {int l 0;int r numbers.length-1;while(l < r){if(numbers[l] numbers[…

Javaweb--CSS

一&#xff1a;概述 CSS &#xff08;Cascading Style Sheet&#xff08;层叠样式表&#xff09;&#xff09;是一门语言&#xff0c;用于控制网页表现。 W3C标准规定了网页是由以下组成&#xff1a; 结构&#xff1a;HTML 表现&#xff1a;CSS 行为&#xff1a;JavaScrip…

git pull 报错: 在签出前,请清理存储库工作树

问题&#xff1a; 使用vscode 用git 拉取代码&#xff0c;提示&#xff1a;在签出前&#xff0c;请清理存储库工作树** 原因&#xff1a; git仓库上的代码和本地代码存在冲突了所以会报这个报错。 解决办法&#xff1a; ①git stash 先将本地修改存储起来 ②git pull 拉取远…

mac redis启动,redis哨兵模式,redis集群的相关命令

Homebrew安装的软件会默认在/usr/local/Cellar/路径下 redis的配置文件redis.conf存放在/usr/local/etc路径下 cd /usr/local/Cellar/redis/7.0.10. 存在 cd /usr/local/opt/redis/bin/redis-server. 目录存在 cd /usr/local/etc/redis.conf 存在。配置文件 复制文件 cp …

蓝桥杯单片机快速开发笔记——矩阵键盘

一、原理分析 二、示例框架 定义了四个位控制变量&#xff0c;用于控制键盘扫描时的行列信号。 在Scan_Keys()函数中&#xff0c;首先设置行列信号&#xff0c;将其中一个行信号置为0&#xff0c;另一个行信号置为1&#xff0c;同时将列信号置为1&#xff0c;用于扫描键盘按键…

LabVIEW电液伺服作动器

LabVIEW电液伺服作动器 随着工业自动化技术的快速发展&#xff0c;电液伺服作动器在各类精密控制领域得到了广泛应用。基于CRIO架构&#xff0c;利用LabVIEW软件开发了一套电液伺服作动器测控系统&#xff0c;实现了高精度的位移同步控制与测量&#xff0c;有效提高了系统的控…

【论文阅读】IEEE Access 2019 BadNets:评估深度神经网络的后门攻击

文章目录 一.论文信息二.论文内容1.摘要2.引言3.主要图表4.结论 一.论文信息 论文题目&#xff1a; BadNets: Evaluating Backdooring Attacks on Deep Neural Networks&#xff08;BadNets:评估深度神经网络的后门攻击&#xff09; 论文来源&#xff1a; 2019-IEEE Access …