当前位置: 首页 > news >正文

MySQL-HMA 高可用故障切换

本章内容:

  • 了解MySQL MHA
  • 搭建MySQL MHA
  • MySQL MHA故障切换

1.案例分析

1.1.1案例概述

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

1.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.1.3 案例环境

1.本案例环境

        上图中 MHA 可以同时监控并管理多个 MySQL 复制组,本案例只实验其中的一个复制 组

2.案例需求

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

3.案例实现思路
  • 安装MySQL数据库
  • 配置MySQL一主两从
  • 安装MHA 软件
  • 配置SSH无密码登录
  • 配置MySQL MHA高可用
  • 模拟master 故障切换

1.2案例实施

1.2.1 安装MySQL数据库

        在三台 mysql 节点上分别安装数据库,MySQL 版本使用 5.7.26, 二进制安装。下面只在 master 上面做演示,其他机器步骤相同,安装过程如下:

1.基础环境准备
安装使用前需要安装一些基础软件包
[root@master ~]# yum -y install gcc vim wget net-tools lrzsz libaio
拉取MySQL软件包
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
创建运行MySQL程序的用户
[root@master ~]# useradd -M -s /sbin/nologin mysql
关闭Selinux 和防火墙
[root@master ~]# setenforce 0
setenforce: SELinux is disabled
[root@master ~]# systemctl stop firewalld
2.二进制安装
        二进制安装的版本采用跟上面编译安装的版本一样 MySQL 5.7.26。首先需要下载该软 件包或者提前上传,然后再解压进行配置。
[root@master ~]# tar zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
[root@master ~]# mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql
[root@master ~]# mkdir /usr/local/mysql/data
[root@master ~]# chown -R mysql:mysql /usr/local/mysql/data/
[root@master ~]# cd /usr/local/mysql/bin/
[root@master bin]# ./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize2024-03-15T02:47:24.625118Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2024-03-15T02:47:24.851610Z 0 [Warning] InnoDB: New log files created, LSN=45790
2024-03-15T02:47:24.888575Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2024-03-15T02:47:24.950326Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 5a9fc7dd-e276-11ee-b06c-000c2910f2b6.
2024-03-15T02:47:24.957182Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2024-03-15T02:47:24.958231Z 1 [Note] A temporary password is generated for root@localhost: kAaWdpuIL4&C  //密码字段需要保存

此字段是MySQL数据库中管理员密码需要保存后续需要修改密码

2024-03-15T02:47:24.958231Z 1 [Note] A temporary password is generated for root@localhost: kAaWdpuIL4&C  //密码字段需要保存
 
3. 设置配置文件
MySQL 的配置文件跟上面编译安装的配置文件类似
[root@master bin]# vim /etc/my.cnf
[mysqld]
[client]
socket=/usr/local/mysql/data/mysql.sock[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0
port = 3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
将MySQL的可执行文件写入环境变量中
[root@master bin]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@master bin]# . /etc/profile

4.配置systemctl 方式启动

        将 MySQL 添 加 成 为 系 统 服 务 , 通 过 使 用 systemctl 来 管 理 。 在/usr/local/mysql/support-files 目 录 下 找 到 mysql.server 文 件 , 将 其 复 制 到 /etc/rc.d/init.d目录下,改名为 mysqld 并赋予可执行权限。        
[root@master bin]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@master bin]# chmod +x /etc/rc.d/init.d/mysqld
编辑生成mysql.service服务,通过systemctl 方式来管理
[root@master bin]# vim /lib/systemd/system/mysqld.service[Unit]
Description=mysqld
After=network.target[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc.d/init.d/mysqld reload
ExecStop=/etc/rc.d/init.d/mysqld stop[Install]
WantedBy=multi-user.target[root@master bin]# systemctl daemon-reload 
[root@master bin]# systemctl enable mysqld.service 
[root@master bin]# systemctl start mysqld.service 
[root@master bin]# netstat -anpt | grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      11941/mysqld        
[root@master bin]# 
访问数据库修改密码
[root@master bin]# mysql -u root -p    //登录数据库
Enter password:         //输入之前字段中的默认密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> set password = password('pwd123');    //修改密码为pwd123
Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> 

5.配置主服务器
[root@master ~]# vim /etc/my.cnfserver-id = 11
log_bin = master-bin
log-slave-updates = true[root@master ~]# systemctl restart mysqld.service  //重启服务
6.配置从服务器
[root@slave02 ~]# vim /etc/my.cnf
[root@slave02 ~]# cat /etc/my.cnf
[mysqld]
[client]
socket=/usr/local/mysql/data/mysql.sock[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0
port = 3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODBserver-id=33
relay-log = relay-log-bin
relay-log-index = slave-relay-bin-index
log-bin = mysql-bin
relay_log_purge = 0[root@slave01 ~]# systemctl restart mysqld.service  //重启服务

注意:server-d 不能相同,两台slave 服务器的id分别为 22 和 33 其他相同

1.3 配置MySQL一主两从

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

1)MySQL授权

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

mysql> grant replication slave on *.* to 'myslave'@'192.168.182.%' identified by 'pwd123';
Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> grant all privileges on *.* to 'mha'@'192.168.182.%' identified by 'pwd123';
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> 

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

mysql> grant all privileges on *.* to 'mha'@'master' identified by 'pwd123'; 
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> grant all privileges on *.* to 'mha'@'slave01' identified by 'pwd123'
;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> grant all privileges on *.* to 'mha'@'slave02' identified by 'pwd123';
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> 
2)查看二进制文件和同步点

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

3)在slave01 和 slave02分别执行同步
mysql> change master to master_host='192.168.182.101',master_user='myslave',master_password='pwd123',master_log_file='master-bin.000001',master_log_pos=
154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
4)查看数据同步结果

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

注意:必须设置两个数据为只读模式,在两个从库分别执行

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

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

        在master 主库创建数据库,测试是否同步

mysql> create database test_db;

        两个库分别查询,显示出主库创建的库说明主从同步正常

1.4 安装MHA软件

1)所有服务器上都安装MHA 依赖环境,首先安装 epel源
[root@manager ~]# yum -y install epel-release[root@manager ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExUtils-CBuilder perl-ExUtils-MakeMaker perl-CPAN
2)在所有服务器上必须安装 node 组件,最后在MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。下面实在manager 上操作演示安装node组件

拉取软件包

[root@manager ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz

编译安装

[root@manager ~]# tar zxvf mha4mysql-node-0.58.tar.gz
[root@manager ~]# cd  mha4mysql-node-0.58/
[root@manager mha4mysql-node-0.58]# perl Makefile.PL
[root@manager mha4mysql-node-0.58]# make && make install
3)在manager 上安装 manager组件

拉取软件包

[root@manager ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz

编译安装

[root@manager ~]# tar zxvf mha4mysql-manager-0.58.tar.gz 
[root@manager ~]# cd mha4mysql-manager-0.58/
[root@manager mha4mysql-manager-0.58]# perl Makefile.PL
[root@manager mha4mysql-manager-0.58]# 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 信息。

4)node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由manager 的)

脚本触发,无需认为操作)

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

1.4 配置SSH无密码登录

1)在manager 上配置所有节点ssh无密码认证
[root@manager ~]# ssh-keygen -t rsa    //一只按回车键最后会出现一串密钥
[root@manager ~]# ssh 192.168.182.104
[root@manager ~]# ssh 192.168.182.103
[root@manager ~]# ssh 192.168.182.101
2)在master上配置到数据库所有节点的无密码认证
[root@master ~]# ssh-keygen -t rsa
[root@master ~]# ssh-copy-id 192.168.182.103
[root@master ~]# ssh-copy-id 192.168.182.104
3)在slave01上配置到所有数据库的无密码认证
[root@slave01 ~]# ssh-keygen -t rsa
[root@slave01 ~]# ssh-copy-id 192.168.182.101
[root@slave01 ~]# ssh-copy-id 192.168.182.104
4)在slave02从数据库配置到所有数据库节点的无密码认证
[root@slave02 ~]# ssh-keygen -t rsa
[root@slave02 ~]# ssh-copy-id 192.168.182.101
[root@slave02 ~]# ssh-copy-id 192.168.182.104

1.5配置 MHA

1)在manager 节点上复制相关脚本到 /usr/local/bin 目录
[root@manager ~]# ll mha4mysql-manager-0.58/samples/scripts/
总用量 32
-rwxr-xr-x 1 luo luo  3648 3月  23 2018 master_ip_failover
-rwxr-xr-x 1 luo luo  9870 3月  23 2018 master_ip_online_change
-rwxr-xr-x 1 luo luo 11867 3月  23 2018 power_manager
-rwxr-xr-x 1 luo luo  1360 3月  23 2018 send_report
[root@manager ~]# 

具体脚本作用如下:

  • master_ip_failover:自动切换时 VIP 管理的脚本
  • master_ip_online_change:在线切换时 vip 的管理
  • power_manager:故障发生后关闭主机的脚本
  • send_report:因故障切换后发送报警的脚本
[root@manager ~]# cp /root/mha4mysql-manager-0.58/samples/scripts/* /usr/local/bin/

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

2)使用下面内容完整替换 master_ip_failover 文件的内容,IP 部分更换为自己的IP 配置文件插入以下内容
[root@manager ~]# vim /usr/local/bin/master_ip_failover 
my $vip = '192.168.182.200/24';    //配置VIP地址
my $key = '1';
my $ssh_start_vip = "/usr/sbin/ifconfig ens33:$key $vip up";
my $ssh_stop_vip = "/usr/sbin/ifconfig ens33:$key down";
3)创建 MHA 软件目录并拷贝配置文件
[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_onilover_change
user=mha
password=pwd123
ping_interval=1
remote_workdir=/tmp
repl_user=myslave
repl_password=pwd123
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.182.103 -s 192.168.182.104
shutdown_script=""
ssh_user=root[server1]
hostname=192.168.182.101
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.182.103
port=3306[server3]
hostname=192.168.182.104
port=3306
 

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@manager ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
Fri Mar 15 15:28:54 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Mar 15 15:28:54 2024 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Fri Mar 15 15:28:54 2024 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Fri Mar 15 15:28:54 2024 - [info] Starting SSH connection tests..
Fri Mar 15 15:28:56 2024 - [debug] 
Fri Mar 15 15:28:54 2024 - [debug]  Connecting via SSH from root@192.168.182.101(192.168.182.101:22) to root@192.168.182.103(192.168.182.103:22)..
Fri Mar 15 15:28:55 2024 - [debug]   ok.
Fri Mar 15 15:28:55 2024 - [debug]  Connecting via SSH from root@192.168.182.101(192.168.182.101:22) to root@192.168.182.104(192.168.182.104:22)..
Fri Mar 15 15:28:55 2024 - [debug]   ok.
Fri Mar 15 15:28:57 2024 - [debug] 
Fri Mar 15 15:28:55 2024 - [debug]  Connecting via SSH from root@192.168.182.103(192.168.182.103:22) to root@192.168.182.101(192.168.182.101:22)..
Fri Mar 15 15:28:55 2024 - [debug]   ok.
Fri Mar 15 15:28:55 2024 - [debug]  Connecting via SSH from root@192.168.182.103(192.168.182.103:22) to root@192.168.182.104(192.168.182.104:22)..
Fri Mar 15 15:28:56 2024 - [debug]   ok.
Fri Mar 15 15:28:57 2024 - [debug] 
Fri Mar 15 15:28:55 2024 - [debug]  Connecting via SSH from root@192.168.182.104(192.168.182.104:22) to root@192.168.182.101(192.168.182.101:22)..
Fri Mar 15 15:28:56 2024 - [debug]   ok.
Fri Mar 15 15:28:56 2024 - [debug]  Connecting via SSH from root@192.168.182.104(192.168.182.104:22) to root@192.168.182.103(192.168.182.103:22)..
Fri Mar 15 15:28:56 2024 - [debug]   ok.
Fri Mar 15 15:28:57 2024 - [info] All SSH connection tests passed successfully.
[root@manager ~]# 
5)测试 MySQL 主从连接情况,最后出现MySQL Replication Heaith is OK 字样说明正常 如下
[root@manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf
Fri Mar 15 15:33:48 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Mar 15 15:33:48 2024 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Fri Mar 15 15:33:48 2024 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Fri Mar 15 15:33:48 2024 - [info] MHA::MasterMonitor version 0.58.
Fri Mar 15 15:33:49 2024 - [info] GTID failover mode = 0
Fri Mar 15 15:33:49 2024 - [info] Dead Servers:
Fri Mar 15 15:33:49 2024 - [info] Alive Servers:
Fri Mar 15 15:33:49 2024 - [info]   192.168.182.101(192.168.182.101:3306)
Fri Mar 15 15:33:49 2024 - [info]   192.168.182.103(192.168.182.103:3306)
Fri Mar 15 15:33:49 2024 - [info]   192.168.182.104(192.168.182.104:3306)
Fri Mar 15 15:33:49 2024 - [info] Alive Slaves:
Fri Mar 15 15:33:49 2024 - [info]   192.168.182.103(192.168.182.103:3306)  Version=5.7.26-log (oldest major version between slaves) log-bin:enabled
Fri Mar 15 15:33:49 2024 - [info]     Replicating from 192.168.182.101(192.168.182.101:3306)
Fri Mar 15 15:33:49 2024 - [info]     Primary candidate for the new Master (candidate_master is set)
Fri Mar 15 15:33:49 2024 - [info]   192.168.182.104(192.168.182.104:3306)  Version=5.7.26-log (oldest major version between slaves) log-bin:enabled
Fri Mar 15 15:33:49 2024 - [info]     Replicating from 192.168.182.101(192.168.182.101:3306)
Fri Mar 15 15:33:49 2024 - [info] Current Alive Master: 192.168.182.101(192.168.182.101:3306)
Fri Mar 15 15:33:49 2024 - [info] Checking slave configurations..
Fri Mar 15 15:33:49 2024 - [info] Checking replication filtering settings..
Fri Mar 15 15:33:49 2024 - [info]  binlog_do_db= , binlog_ignore_db= 
Fri Mar 15 15:33:49 2024 - [info]  Replication filtering check ok.
Fri Mar 15 15:33:49 2024 - [info] GTID (with auto-pos) is not supported
Fri Mar 15 15:33:49 2024 - [info] Starting SSH connection tests..
Fri Mar 15 15:33:52 2024 - [info] All SSH connection tests passed successfully.
Fri Mar 15 15:33:52 2024 - [info] Checking MHA Node version..
Fri Mar 15 15:33:52 2024 - [info]  Version check ok.
Fri Mar 15 15:33:52 2024 - [info] Checking SSH publickey authentication settings on the current master..
Fri Mar 15 15:33:53 2024 - [info] HealthCheck: SSH to 192.168.182.101 is reachable.
Fri Mar 15 15:33:53 2024 - [info] Master MHA Node version is 0.58.
Fri Mar 15 15:33:53 2024 - [info] Checking recovery script configurations on 192.168.182.101(192.168.182.101:3306)..
Fri Mar 15 15:33:53 2024 - [info]   Executing command: save_binary_logs --command=test --start_pos=4 --binlog_dir=/usr/local/mysql/data --output_file=/tmp/save_binary_logs_test --manager_version=0.58 --start_file=master-bin.000001 
Fri Mar 15 15:33:53 2024 - [info]   Connecting to root@192.168.182.101(192.168.182.101:22).. Creating /tmp if not exists..    ok.Checking output directory is accessible or not..ok.Binlog found at /usr/local/mysql/data, up to master-bin.000001
Fri Mar 15 15:33:53 2024 - [info] Binlog setting check done.
Fri Mar 15 15:33:53 2024 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers..
Fri Mar 15 15:33:53 2024 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='mha' --slave_host=192.168.182.103 --slave_ip=192.168.182.103 --slave_port=3306 --workdir=/tmp --target_version=5.7.26-log --manager_version=0.58 --relay_log_info=/usr/local/mysql/data/relay-log.info  --relay_dir=/usr/local/mysql/data/  --slave_pass=xxx
Fri Mar 15 15:33:53 2024 - [info]   Connecting to root@192.168.182.103(192.168.182.103: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.000002Temporary relay log file is /usr/local/mysql/data/relay-log-bin.000002Checking if super_read_only is defined and turned on.. not present or turned off, ignoring.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.
Fri Mar 15 15:33:53 2024 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='mha' --slave_host=192.168.182.104 --slave_ip=192.168.182.104 --slave_port=3306 --workdir=/tmp --target_version=5.7.26-log --manager_version=0.58 --relay_log_info=/usr/local/mysql/data/relay-log.info  --relay_dir=/usr/local/mysql/data/  --slave_pass=xxx
Fri Mar 15 15:33:53 2024 - [info]   Connecting to root@192.168.182.104(192.168.182.104: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.000002Temporary relay log file is /usr/local/mysql/data/relay-log-bin.000002Checking if super_read_only is defined and turned on.. not present or turned off, ignoring.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.
Fri Mar 15 15:34:04 2024 - [info] Slaves settings check done.
Fri Mar 15 15:34:04 2024 - [info] 
192.168.182.101(192.168.182.101:3306) (current master)+--192.168.182.103(192.168.182.103:3306)+--192.168.182.104(192.168.182.104:3306)Fri Mar 15 15:34:04 2024 - [info] Checking replication health on 192.168.182.103..
Fri Mar 15 15:34:04 2024 - [info]  ok.
Fri Mar 15 15:34:04 2024 - [info] Checking replication health on 192.168.182.104..
Fri Mar 15 15:34:04 2024 - [info]  ok.
Fri Mar 15 15:34:04 2024 - [info] Checking master_ip_failover_script status:
Fri Mar 15 15:34:04 2024 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.182.101 --orig_master_ip=192.168.182.101 --orig_master_port=3306 
Fri Mar 15 15:34:04 2024 - [info]  OK.
Fri Mar 15 15:34:04 2024 - [warning] shutdown_script is not defined.
Fri Mar 15 15:34:04 2024 - [info] Got exit code 0 (Not master dead).MySQL Replication Health is OK.
[root@manager ~]# 

如果在执行过程中,由如下保存信息:

Can't exec "mysqlbinlog": No such file or directory at
/usr/lib64/perl5/vendor_perl/MHA/BinlogManager.pm line 99

采用设置软连接的方式解决,三台MySQL上都需要执行

[root@master ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlo
[root@master ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysqlbinlog 

如果出现如下报错信息

Bareword "FIXME_xxx" not allowed while "strict subs" in use at /usr/local/bin/master_ip_failover line
100
在manager 机器上面使用如下解决方法
[root@manager ~]# vim /usr/local/bin/master_ip_failover ## Update master ip on the catalog database, etc#  FIXME_xxx;    //97行注释

6)首次配置 MHA 的 VIP 地址需要手动进行配置,在 master 上执行如下命令
[root@master ~]# ifconfig ens33:1 192.168.182.200
[root@master ~]# ifconfig ens33:1
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.182.200  netmask 255.255.255.0  broadcast 192.168.182.255ether 00:0c:29:10:f2:b6  txqueuelen 1000  (Ethernet)[root@master ~]#

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

7)启动 MHA
[root@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 &

配置参数具体作用如下:

  • --remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的 IP 地址将会 从配置文件中移除。
  • --ignore_last_failover 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间 隔不足 8 小时的话,则不会进行 Failover,之所以这样限制是为了避免 ping-pong 效应。 该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在 日志中记录,下次再切换的时候如果发现该目录下存在该文件将不允许触发切换,除非 在第一次切换后收到删除该文件。为了方便,这里设置为–ignore_last_failover。
若要关闭manager 服务,可以使用如下命令,或使用kill 进程ID方式关闭
[root@manager ~]# masterha_stop --conf=/etc/manager/app1.cnf
8)查看 MHA日志,也可以看到当前的master 是 192.168.182.101 如下
[root@manager ~]# cat /var/log/masterha/app1/manager.log 

1.6 模拟master故障

1.自动切换

manager动态查看日志
[root@manager ~]# tailf /var/log/masterha/app1/manager.log +--192.168.182.104(192.168.182.104:3306)Fri Mar 15 15:43:56 2024 - [info] Checking master_ip_failover_script status:
Fri Mar 15 15:43:56 2024 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.182.101 --orig_master_ip=192.168.182.101 --orig_master_port=3306 
Fri Mar 15 15:43:56 2024 - [info]  OK.
Fri Mar 15 15:43:56 2024 - [warning] shutdown_script is not defined.
Fri Mar 15 15:43:56 2024 - [info] Set master ping interval 1 seconds.
Fri Mar 15 15:43:56 2024 - [info] Set secondary check script: /usr/local/bin/masterha_secondary_check -s 192.168.182.103 -s 192.168.182.104
Fri Mar 15 15:43:56 2024 - [info] Starting ping health check on 192.168.182.101(192.168.182.101:3306)..
Fri Mar 15 15:43:56 2024 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
1)直接关机master主库(可以直接关闭MySQL服务)
[root@master ~]# poweroff
2)观察 MHA 日志,如果自动切换成功,最后会输出 souccessfuily字样
[root@manager ~]# tailf /var/log/masterha/app1/manager.log #######忽略大部分日志Started automated(non-interactive) failover.
Invalidated master IP address on 192.168.182.101(192.168.182.101:3306)
The latest slave 192.168.182.103(192.168.182.103:3306) has all relay logs for recovery.
Selected 192.168.182.103(192.168.182.103:3306) as a new master.
192.168.182.103(192.168.182.103:3306): OK: Applying all logs succeeded.
Failed to activate master IP address for 192.168.182.103(192.168.182.103:3306) with return code 10:0
192.168.182.104(192.168.182.104:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
192.168.182.104(192.168.182.104:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.182.103(192.168.182.103:3306)
192.168.182.103(192.168.182.103:3306): Resetting slave info succeeded.
Master failover to 192.168.182.103(192.168.182.103:3306) completed successfully.
3)正常自动切换一次后,MHA 进程会退出。MHA 会自动修改 app1.cnf文件内容,将宕机的 Mysql节点删除,查看 slave01是否接管VIP地址
[root@slave01 ~]# ifconfig
也可以进入slave02从库查看是否切换
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.182.103

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

1)查看slave01
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      868 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)mysql> 
启动master数据库 
[root@master ~]# systemctl start mysqld
[root@master ~]# mysql -u root -p
Enter password:mysql> change master to master_host='192.168.182.103',master_user='myslave',master_password='pwd123',master_log_file='mysql-bin.000001',master_log_pos=868;
Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> 

3)master启动从库同步并设置为只读
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)mysql> 
4)停掉当前主库(slave01)的同步进程,不然下次作为从库同步会报错
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)mysql> 

相关文章:

MySQL-HMA 高可用故障切换

本章内容&#xff1a; 了解MySQL MHA搭建MySQL MHAMySQL MHA故障切换 1.案例分析 1.1.1案例概述 目前 MySQL 已经成为市场上主流数据库之一&#xff0c;考虑到业务的重要性&#xff0c;MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展&#xff0c;MHA…...

深度学习 精选笔记(11)深度学习计算相关:GPU、参数、读写、块

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…...

深度学习 Day27——J7对于ResNeXt-50算法的思考

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 文章目录 前言问题分析 前言 关键问题&#xff1a;ResNeXt-50中conv_shortcutFalse时…...

华为配置敏捷分布式SFN漫游实验

配置敏捷分布式SFN漫游示例 组网图形 图1 配置敏捷分布式SFN漫游示例组网图 组网需求数据规划配置思路配置注意事项操作步骤配置文件 组网需求 某医院通过部署敏捷分布式网络给医护人员提供WLAN接入服务&#xff0c;以满足医护人员办公的最基本需求。管理员希望终端在覆盖区域内…...

续上篇 qiankun 微前端配置

上篇文章地址&#xff1a;微前端框架 qiankun 配置使用【基于 vue/react脚手架创建项目 】-CSDN博客 主应用&#xff1a; src/main.js 配置&#xff1a; import Vue from vue import App from ./App.vue import router from ./router import { registerMicroApps, start } …...

AI日报:欧盟人工智能法案通过后行业面临合规障碍

文章目录 人工智能新规对web爬网的影响对英国的影响。 人工智能新规 立法者已经通过了欧盟人工智能法案。企业现在必须确保其人工智能应用程序符合规则。 全面的新规定对可能影响公民权利的人工智能系统实施制裁&#xff0c;并有可能彻底禁止某些系统。 违反规定的公司可能面…...

音视频如何快速转二维码?在线生成音视频活码的教程

音频文件的二维码制作步骤是什么样的呢&#xff1f;扫描二维码来展现内容是很流行的一种方式&#xff0c;基本上日常生活中经常会用的图片、音频、视频等都可以使用生成二维码的方式。现在很多的幼儿园或者学校会录制孩子的音频或者视频内容用来展示&#xff0c;那么二维码制作…...

开源堡垒机Jumpserver安装教程

前言:堡垒机的应用场景 公司内有若干台服务器,既有windows的也有linux的, 提供有ERP,OA,Web,报表等等各种服务,往往需要远程登录到服务器上去做运维,但如果给root或者administrator权限,很容易出现不知道谁操作了的问题.如果不同人设置不同账号,又账号过多,权限不足等等其他问题…...

CentOS 7 socat命令端口转发 —— 筑梦之路

命令简介 socat是一个功能强大的命令行工具&#xff0c;也可以看作是netcat的加强版&#xff0c;它可以在两个端口之间建立虚拟通道&#xff0c;实现数据的传输。适用于网络调试、端口转发、安全测试等多种场景&#xff0c;是一个适合网络管理员和开发者的工具 yum在线安装 yu…...

SeaTunnel 2.3.4 Cluster in K8S

参考&#xff1a;seatunnel k8s运行zeta引擎&#xff08;cluster-mode模式&#xff09;_apache seatunnel zeta 启动-CSDN博客 以上参考使用的是2.3.3版本 下载2.3.4版本, 上dlcdn.apache.org下载 &#xff0c;官网下载有问题 wget https://dlcdn.apache.org/seatunnel/2.3.4/…...

多模态学习 - 视觉语言预训练综述-2023-下游任务、数据集、基础知识、预训练任务、模型

参考&#xff1a; https://zhuanlan.zhihu.com/p/628840228 https://zhuanlan.zhihu.com/p/628994098 https://zhuanlan.zhihu.com/p/629996372 https://zhuanlan.zhihu.com/p/582424974 多模态学习 - 视觉语言预训练综述-2023-下游任务、数据集、基础知识、模型 1. 多模态介绍…...

Vite为什么比Webpack快

一、引言 主流的前端构建工具包括以下几种&#xff1a; Webpack&#xff1a;当下最热门的前端资源模块化管理和打包工具。它能够将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。同时&#xff0c;Webpack还支持代码分割&#xff0c;可以按需加载模块&#…...

因聚而生 数智有为丨软通动力携子公司鸿湖万联亮相华为中国合作伙伴大会2024

3月14日&#xff0c;以“因聚而生 数智有为”为主题的“华为中国合作伙伴大会2024”在深圳隆重开幕。作为华为的重要合作伙伴和本次大会钻石级&#xff08;最高级&#xff09;合作伙伴&#xff0c;软通动力深度参与本次盛会&#xff0c;携前沿数智化技术成果和与华为的联合解决…...

724.寻找数组的中心下标

题目&#xff1a;给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不…...

Selenium 是什么?简单了解Selenium

Selenium Selenium 是什么 Selenium 是一款 Web UI 测试工具&#xff0c;是一款 自动化测试 工具&#xff0c;使用 Selenium 测试工具进行的测试通常被称为 Selenium Testing&#xff0c;各种支持如下列表&#xff1a; UI 元素的支持与管理&#xff1a;自写代码实现浏览器支…...

钡铼技术有限公司R40路由器工业4G让养殖环境监控更高效

钡铼技术有限公司的R40路由器是一款专为养殖环境监控而设计的工业级4G路由器。该路由器的出现极大地提高了养殖行业的监控效率&#xff0c;为养殖场主和管理者提供了更可靠、高效的解决方案。本文将从功能特点、优势以及应用案例等方面介绍钡铼技术有限公司的R40路由器在养殖环…...

vue2 / vue3 路由(返回跳转)时判断 + 取消跳转

vue3 options api&#xff1a; <template><button click$router.back()>返回</button><input type"text" v-model"formData.v1"><textarea name"" id"" v-model"formData.v2" cols"30&quo…...

【设计模式】Java 设计模式之代理模式(Proxy Pattern)

代理模式深入分析 一、概述 代理模式是一种为其他对象提供一种代理以控制对这个对象的访问的设计模式。在某些情况下&#xff0c;一个对象不适合或者不能直接访问另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式的主要目的是&#xf…...

逻辑数据平台的 NoETL 之道(内含QA)

作者简介&#xff1a; 余俊&#xff0c;Aloudata 合伙人 & 技术副总裁。拥有 18 年互联网技术和大数据平台相关架构经验。作为主架构师及核心研发主导并完成了 Alibaba B2B 首个海量分布式 KV 存储系统&#xff0c;作为网站架构师负责 Aliexpress 全球买全球卖交易系统的第…...

低代码与数智制造:引领软件开发的革新之旅

在当今快速发展的数字化时代&#xff0c;软件开发已经渗透到各行各业&#xff0c;成为推动社会进步的重要力量。随着技术的不断进步&#xff0c;低代码开发与数智制造正逐渐崭露头角&#xff0c;成为引领软件开发领域革新的两大关键要素。本文将深入探讨低代码与数智制造的内涵…...

安装 AWS Load Balancer Controller 附加组件

1 创建一个 IAM policy #curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json#aws iam create-policy \--policy-name AWSLoadBalancerControllerIAMPolicy \--policy-document file://iam_policy.…...

性能测试什么时候开始?性能测试流程介绍

性能测试什么时候开始? 一般在系统功能稳定没有大的缺陷之后开始执行。但前期准备工作可以从系统需求分析时就开始&#xff1a;性能目标制定、场景获取、环境申请等。 一、制定性能测试目标 在特定的并发用户数下测试特定场景的响应时间 在一定的响应时间的要求下来测试特…...

爬虫逆向实战(36)-某建设监管平台(RSA,魔改)

一、数据接口分析 主页地址&#xff1a;某建设监管平台 1、抓包 通过抓包可以发现网站首先是请求了一个/prod-api/mohurd-pub/vcode/genVcode的接口&#xff0c;用于获取滑块验证码的图片 滑块验证之后&#xff0c;请求了/prod-api/mohurd-pub/dataServ/findBaseEntDpPage这…...

DeepLearning in Pytorch|共享单车预测NN详解(思路+代码剖析)

目录 概要 一、代码概览 二、详解 基本逻辑 1.数据准备 2.设计神经网络 初版 改进版 测试 总结 概要 原文链接&#xff1a;DeepLearning in Pytorch|我的第一个NN-共享单车预测 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用…...

如何配置Apache的反向代理

目录 前言 一、反向代理的工作原理 二、Apache反向代理的配置 1. 安装Apache和相关模块 2. 配置反向代理规则 3. 重启Apache服务器 三、常见的使用案例 1. 负载均衡 2. 缓存 3. SSL加密 总结 前言 随着Web应用程序的不断发展和扩展&#xff0c;需要处理大量的请求和…...

Vue.js 应用实现监控可观测性最佳实践

前言 Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 TinyPro 是一套使用 Vue …...

Rust 语言中符号 :: 的使用场景

在 Rust 语言中&#xff0c;:: 符号主要用于以下几个场合&#xff1a; 指定关联函数或关联类型&#xff1a; 关联函数&#xff08;也称为静态方法&#xff09;是与类型关联而非实例关联的函数。它们使用 :: 符号来调用。例如&#xff1a; let value String::from("Hello,…...

Java 获取笔记本WiFi网络基站信息的方法

在Android开发中&#xff0c;获取基站信息&#xff08;如基站ID、运营商信息、信号强度等&#xff09;通常涉及使用TelephonyManager类。请注意&#xff0c;由于隐私和安全的考虑&#xff0c;从Android 10&#xff08;API级别29&#xff09;开始&#xff0c;对访问此类信息的权…...

Python如何处理拥塞控制

拥塞控制是计算机网络中用于防止网络拥塞&#xff08;即过多的数据导致网络性能下降&#xff09;的一系列技术和算法。在Python中&#xff0c;处理拥塞控制通常不直接涉及到代码层面的实现&#xff0c;因为拥塞控制主要是在网络协议栈&#xff08;如TCP/IP&#xff09;和操作系…...

【ArcGIS】栅格数据进行标准化(归一化)处理

栅格数据进行标准化&#xff08;归一化&#xff09;处理 方法1&#xff1a;栅格计算器方法2&#xff1a;模糊分析参考 栅格数据进行标准化(归一化)处理 方法1&#xff1a;栅格计算器 栅格计算器&#xff08;Raster Calculator&#xff09; 计算完毕后&#xff0c;得到归一化…...