暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL MHA高可用环境搭建

IT那活儿 2023-03-06
333

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!




MHA概述



1. MHA工作过程

MHA(MasterHigh Availability)是MySQL高可用环境下故障自动切换的解决方案,MySQL故障切换过程中,MHA能够在0-30秒内自动完成故障切换操作,且在故障切换的过程中最大程度的保证数据的一致性,以达到真正意义上的高可用。
本文重点介绍MySQL一主两从架构下的MHA高可用环境部署过程。

2. MySQL MHA工具包简介

MySQL MHA由MySQL Manager(管理节点)和MySQL Node(数据节点)组成,数据节点部署在每一台MySQL数据库上,管理节点部署在一台独立的机器上,也可以部署在与MySQL同一台主机上,当发现数据节点宕机时,管理节点会立即控制数据节点进行故障切换相关工作。

MySQL MHA主要涉及如下工具包:

1)masterha_check_ssh
负责检查MHA的SSH配置链接情况。
2)masterha_check_repl
检查MySQL主从同步的复制情况。
3)masterha_manager
启动MySQL MHA。
4)masterha_check_status
检测当前MHA的状态。
5)masterha_master_switch
自动或者手动控制MHA故障转移。
6)masterha_conf_host

添加或者删除配置的server信息。




数据库安装



本次安装采用4节点环境,各节点功能如下:

主机
IP地址
MySQL数据库角色
MHA角色
snc-product-db-mysql01
172.16.100.101
master
node
snc-product-db-mysql02
172.16.100.102
slave
node
snc-product-db-mysql03
172.16.100.103
salve
node
snc-product-db-mysql04
172.16.100.104
N/A
manager
(IP:172.16.100.105作为对外提供访问数据库的VIP地址)

1. 软件准备

从社区下载mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar到snc-product-db-mysql01、snc-product-db-mysql02和snc-product-db-mysql013三个节点的/software目录下,并解压:
[root@snc-product-db-mysql01 software]# tar -xvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar
mysql-community-libs-5.7.25-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.25-1.el7.x86_64.rpm
mysql-community-embedded-5.7.25-1.el7.x86_64.rpm
mysql-community-client-5.7.25-1.el7.x86_64.rpm
mysql-community-server-5.7.25-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.25-1.el7.x86_64.rpm
mysql-community-test-5.7.25-1.el7.x86_64.rpm
mysql-community-devel-5.7.25-1.el7.x86_64.rpm
mysql-community-common-5.7.25-1.el7.x86_64.rpm

复制

2. 数据库安装

在snc-product-db-mysql01、snc-product-db-mysql02和snc-product-db-mysql013三个节点上分别执行yum localinstall  mysql*  命令,安装数据库。
[root@snc-product-db-mysql01 software]# yum localinstall  mysql-*
已加载插件:fastestmirror
Skipping: mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar, filename does not end in .rpm.
正在检查 mysql-community-client-5.7.25-1.el7.x86_64.rpm: mysql-community-client-5.7.25-1.el7.x86_64
mysql-community-client-5.7.25-1.el7.x86_64.rpm 将被安装
正在检查 mysql-community-common-5.7.25-1.el7.x86_64.rpm: mysql-community-common-5.7.25-1.el7.x86_64
mysql-community-common-5.7.25-1.el7.x86_64.rpm 将被安装
......
(略)
......
已安装:
mysql-community-client.x86_64 0:5.7.25-1.el7 
mysql-community-common.x86_64 0:5.7.25-1.el7    
mysql-community-devel.x86_64 0:5.7.25-1.el7
mysql-community-embedded.x86_64 0:5.7.25-1.el7    
mysql-community-embedded-compat.x86_64 0:5.7.25-1.el7
mysql-community-embedded-devel.x86_64 0:5.7.25-1.el7
mysql-community-libs.x86_64 0:5.7.25-1.el7   
mysql-community-libs-compat.x86_64 0:5.7.25-1.el7
mysql-community-server.x86_64 0:5.7.25-1.el7
mysql-community-test.x86_64 0:5.7.25-1.el7

复制
作为依赖被安装:
net-tools.x86_64 0:2.0-0.25.20131004git.el7
perl.x86_64 4:5.16.3-299.el7_9
perl-Carp.noarch 0:1.26-244.el7
perl-Data-Dumper.x86_64 0:2.145-3.el7
perl-Encode.x86_64 0:2.51-7.el7
perl-Exporter.noarch 0:5.68-3.el7
perl-File-Path.noarch 0:2.09-2.el7
perl-File-Temp.noarch 0:0.23.01-3.el7
perl-Filter.x86_64 0:1.49-3.el7
perl-Getopt-Long.noarch 0:2.40-3.el7
perl-HTTP-Tiny.noarch 0:0.033-3.el7
perl-JSON.noarch 0:2.59-2.el7
perl-PathTools.x86_64 0:3.40-5.el7
perl-Pod-Escapes.noarch 1:1.04-299.el7_9
perl-Pod-Perldoc.noarch 0:3.20-4.el7
perl-Pod-Simple.noarch 1:3.28-4.el7
perl-Pod-Usage.noarch 0:1.63-3.el7
perl-Scalar-List-Utils.x86_64 0:1.27-248.el7
perl-Socket.x86_64 0:2.010-5.el7
perl-Storable.x86_64 0:2.45-3.el7
perl-Text-ParseWords.noarch 0:3.29-4.el7
perl-Time-HiRes.x86_64 4:1.9725-3.el7
perl-Time-Local.noarch 0:1.2300-2.el7
perl-constant.noarch 0:1.27-2.el7
perl-libs.x86_64 4:5.16.3-299.el7_9
perl-macros.x86_64 4:5.16.3-299.el7_9
perl-parent.noarch 1:0.225-244.el7
perl-podlators.noarch 0:2.5.1-3.el7
perl-threads.x86_64 0:1.87-4.el7
perl-threads-shared.x86_64 0:1.43-6.el7

替代:
mariadb-libs.x86_64 1:5.5.68-1.el7

完毕!
[root@snc-product-db-mysql01 software]#
mysql-community-server-5.7.25-1.el7.x86_64.rpm

复制

3. 数据库配置文件修改

主节点(snc-product-db-mysql01)的my.cnf文件按如下内容配置:
[mysqld]
basedir=/var/lib/mysql
datadir=/var/lib/mysql/data
port=3306
server-id=1
read_only=off
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/lib/mysql/mysql.sock
log-error=/var/lib/mysql/mha-server.err
innodb_buffer_pool_size=1073741824
log_bin=mha-server
binlog_format=row
innodb_doublewrite=on
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
innodb_read_io_threads=6
innodb_write_io_threads=6
innodb_purge_threads=6
slow_query_log=ON
slow_query_log_file=chen.slow
long_query_time=2
log_queries_not_using_indexes=1
log_throttle_queries_not_using_indexes=10
innodb_data_file_path = ibdata1:100M:autoextend
show_compatibility_56=on
skip_name_resolve=on
expire_logs_days = 5
binlog_rows_query_log_events=on
relay_log_purge = 0
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
symbolic-links=0

复制

两个从节点snc-product-db-mysql02和snc-product-db-mysql03的my.cnf文件参照上述内容设置,但需要注意以下几个参数

  • log-bin = mha-server ##要求所有可能成为主库的节点开启二进制日志;
  • relay_log_purge = 0 ##要求所有可能成为主库的节点配置 relay_log_purge = 0;
  • read_only = 1   ##MHA 要求所有 slave 节点配置为 read_only = 1;
  • server-id = 2   ##注意主从节点的 server-id 不同。

4. 初始化数据库

在snc-product-db-mysql01、snc-product-db-mysql02和snc-product-db-mysql013三个节点创建数据目录。
mkdir -p /var/lib/mysql/data
复制
执行如下命令初始化数据库:
/usr/bin/mysql_install_db --defaults-file=/etc/my.cnf --datadir=/var/lib/mysql/data/ --basedir=/var/lib/mysql/
复制
[root@snc-product-db-mysql01 data]# usr/bin/mysql_install_db --defaults-file=/etc/my.cnf --datadir=/var/lib/mysql/data/ --basedir=/var/lib/mysql/
2022-11-12 13:33:36 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
[root@snc-product-db-mysql01 data]# ls
auto.cnf    ca.pem client-cert.pem ib_buffer_pool ib_logfile0 mha-server.000001  mysql private_key.pem server-cert.pem sys
ca-key.pem chen.slow client-key.pem ibdata1 ib_logfile1 mha-server.index   performance_schema public_key.pem server-key.pem

复制

5. 修改root密码

在snc-product-db-mysql01、snc-product-db-mysql02和snc-product-db-mysql013三个节点的/etc/my.cnf文件末尾新增如下一行内容:
skip-grant-tables
复制
重启mysqld服务:
service mysqld stop && service mysqld start
复制
此时可以以空密码登录至mysql数据库,执行如下命令,修改root密码:
set password for root@localhost=password('shsnc!@#');
update user set host='%' where user='root';
set password for root@'%'=password('shsnc!@#');
flush privileges;

复制

修改完成后,删除/etc/mysql.cnf配置文件中的 skip-grant-tables 内容,并重启数据库服务,即可通过修改后的root口令登录数据库。




主从环境搭建



1. 创建复制用户

在snc-product-db-mysql01、snc-product-db-mysql02和snc-product-db-mysql013三个节点执行如下命令,创建复制用户repl:
grant replication slave,replication client on *.* to 'repl'@'172.16.%.%' identified by 'repl';
复制

2. 确认主库偏移量

在snc-product-db-mysql01节点,登录至mysql,执行如下命令查看偏移量:
show master status;
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mha-server.000004 |      466 | |                  | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

复制

3. 从库设置与开启

在两个从节点,执行如下命令开启主从复制:
CHANGE MASTER TO MASTER_HOST='172.16.100.101',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_PORT=3306,MASTER_LOG_FILE='mha-server.000004',MASTER_LOG_POS=466,MASTER_CONNECT_RETRY=10;
start slave;

复制
从1:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.100.101
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mha-server.000004
Read_Master_Log_Pos: 1122
Relay_Log_File: snc-product-db-mysql02-relay-bin.000002
Relay_Log_Pos: 977
Relay_Master_Log_File: mha-server.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
.....
(略)
.....
Master_TLS_Version:
1 row in set (0.00 sec)

复制
从2:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.100.101
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mha-server.000004
Read_Master_Log_Pos: 1122
Relay_Log_File: snc-product-db-mysql03-relay-bin.000002
Relay_Log_Pos: 977
Relay_Master_Log_File: mha-server.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
........
(略)
........
Master_TLS_Version:
1 row in set (0.00 sec)

复制

至此,一个简单的一主两从的复制环境搭建完成




MHA环境搭建



1. 互信认证配置

分别在4个节点上执行如下命令,完成四台主机相互免密钥登录配置。
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.100.101
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.100.102
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.100.103
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.100.104

复制
注意:4台主机均要执行上述命令。

2. Perl软件包安装

注意
1)每台主机都需要安装perl环境包和MHAmha4mysql-node,MHA管理机需要安装mha4mysql-manager
2)需要安装的perl包如下
perl-Class-Load-0.20-3.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-MailTools-2.12-2.el7.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
perl-Params-Validate-1.08-4.el7.x86_64.rpm
perl-Sys-Syslog-0.33-3.el7.x86_64.rpm
执行如下命令安装perl包:
yum install perl-*.rpm

复制

3. mha4mysql-node软件安装

在4个节点分别执行如下命令,完成mha4mysql-node软件的安装:
yum install mha4mysql-node-0.56-0.el6.noarch.rpm
复制
[root@snc-product-db-mysql04 software]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm
已加载插件:fastestmirror
正在检查 mha4mysql-node-0.56-0.el6.noarch.rpm: mha4mysql-node-0.56-0.el6.noarch
mha4mysql-node-0.56-0.el6.noarch.rpm 将被安装
正在解决依赖关系
--> 正在检查事务
---> 软件包 mha4mysql-node.noarch.0.0.56-0.el6 将被 安装
--> 正在处理依赖关系 perl(DBD::mysql),它被软件包 mha4mysql-node-0.56-0.el6.noarch 需要
Loading mirror speeds from cached hostfile
--> 正在处理依赖关系 perl(DBI),它被软件包 mha4mysql-node-0.56-0.el6.noarch 需要
--> 正在处理依赖关系 perl(DBI),它被软件包 mha4mysql-node-0.56-0.el6.noarch 需要
--> 正在检查事务
---> 软件包 perl-DBD-MySQL.x86_64.0.4.023-6.el7 将被 安装
---> 软件包 perl-DBI.x86_64.0.1.627-4.el7 将被 安装
--> 正在处理依赖关系 perl(RPC::PlServer) >= 0.2001,它被软件包 perl-DBI-1.627-4.el7.x86_64 需要
--> 正在处理依赖关系 perl(RPC::PlClient) >= 0.2000,它被软件包 perl-DBI-1.627-4.el7.x86_64 需要
--> 正在检查事务
---> 软件包 perl-PlRPC.noarch.0.0.2020-14.el7 将被 安装
--> 正在处理依赖关系 perl(Net::Daemon) >= 0.13,它被软件包 perl-PlRPC-0.2020-14.el7.noarch 需要
--> 正在处理依赖关系 perl(Net::Daemon::Test),它被软件包 perl-PlRPC-0.2020-14.el7.noarch 需要
--> 正在处理依赖关系 perl(Net::Daemon::Log),它被软件包 perl-PlRPC-0.2020-14.el7.noarch 需要
--> 正在处理依赖关系 perl(Compress::Zlib),它被软件包 perl-PlRPC-0.2020-14.el7.noarch 需要
--> 正在检查事务
---> 软件包 perl-IO-Compress.noarch.0.2.061-2.el7 将被 安装
--> 正在处理依赖关系 perl(Compress::Raw::Zlib) >= 2.061,它被软件包 perl-IO-Compress-2.061-2.el7.noarch 需要
--> 正在处理依赖关系 perl(Compress::Raw::Bzip2) >= 2.061,它被软件包 perl-IO-Compress-2.061-2.el7.noarch 需要
---> 软件包 perl-Net-Daemon.noarch.0.0.48-5.el7 将被 安装
--> 正在检查事务
---> 软件包 perl-Compress-Raw-Bzip2.x86_64.0.2.061-3.el7 将被 安装
---> 软件包 perl-Compress-Raw-Zlib.x86_64.1.2.061-4.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

=============================================================================================================================================================================================
Package 架构 版本 源 大小
=============================================================================================================================================================================================
正在安装:
mha4mysql-node noarch 0.56-0.el6 mha4mysql-node-0.56-0.el6.noarch 102 k
为依赖而安装:
perl-Compress-Raw-Bzip2 x86_64 2.061-3.el7 base 32 k
perl-Compress-Raw-Zlib x86_64 1:2.061-4.el7 base 57 k
perl-DBD-MySQL x86_64 4.023-6.el7 base 140 k
perl-DBI x86_64 1.627-4.el7 base 802 k
perl-IO-Compress noarch 2.061-2.el7 base 260 k
perl-Net-Daemon noarch 0.48-5.el7 base 51 k
perl-PlRPC noarch 0.2020-14.el7 base 36 k

事务概要
=============================================================================================================================================================================================
安装 1 软件包 (+7 依赖软件包)

总计:1.4 M
总下载量:1.3 M
安装大小:3.5 M
Is this ok [y/d/N]: y
Downloading packages:
(1/7): perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm | 32 kB 00:00:00
(2/7): perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm | 57 kB 00:00:00
(3/7): perl-DBD-MySQL-4.023-6.el7.x86_64.rpm | 140 kB 00:00:00
(4/7): perl-IO-Compress-2.061-2.el7.noarch.rpm | 260 kB 00:00:00
(5/7): perl-Net-Daemon-0.48-5.el7.noarch.rpm | 51 kB 00:00:00
(6/7): perl-DBI-1.627-4.el7.x86_64.rpm | 802 kB 00:00:00
(7/7): perl-PlRPC-0.2020-14.el7.noarch.rpm | 36 kB 00:00:00
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总计 2.8 MB/s | 1.3 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64 1/8
正在安装 : 1:perl-Compress-Raw-Zlib-2.061-4.el7.x86_64 2/8
正在安装 : perl-IO-Compress-2.061-2.el7.noarch 3/8
正在安装 : perl-Net-Daemon-0.48-5.el7.noarch 4/8
正在安装 : perl-PlRPC-0.2020-14.el7.noarch 5/8
正在安装 : perl-DBI-1.627-4.el7.x86_64 6/8
正在安装 : perl-DBD-MySQL-4.023-6.el7.x86_64 7/8
正在安装 : mha4mysql-node-0.56-0.el6.noarch 8/8
验证中 : perl-Net-Daemon-0.48-5.el7.noarch 1/8
验证中 : mha4mysql-node-0.56-0.el6.noarch 2/8
验证中 : perl-DBD-MySQL-4.023-6.el7.x86_64 3/8
验证中 : perl-IO-Compress-2.061-2.el7.noarch 4/8
验证中 : 1:perl-Compress-Raw-Zlib-2.061-4.el7.x86_64 5/8
验证中 : perl-DBI-1.627-4.el7.x86_64 6/8
验证中 : perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64 7/8
验证中 : perl-PlRPC-0.2020-14.el7.noarch 8/8

已安装:
mha4mysql-node.noarch 0:0.56-0.el6

作为依赖被安装:
perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7 perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7 perl-DBD-MySQL.x86_64 0:4.023-6.el7 perl-DBI.x86_64 0:1.627-4.el7
perl-IO-Compress.noarch 0:2.061-2.el7 perl-Net-Daemon.noarch 0:0.48-5.el7 perl-PlRPC.noarch 0:0.2020-14.el7

完毕!

复制

4. mha4mysql-manager软件安装

在管理机manager(第4个节点),执行如下命令,完成mha4mysql-manager软件的安装:
yum install mha4mysql-manager-0.56-0.el6.noarch.rpm
复制
[root@snc-product-db-mysql04 software]# yum install mha4mysql-manager-0.56-0.el6.noarch.rpm
已加载插件:fastestmirror
正在检查 mha4mysql-manager-0.56-0.el6.noarch.rpm: mha4mysql-manager-0.56-0.el6.noarch
mha4mysql-manager-0.56-0.el6.noarch.rpm 将被安装
正在解决依赖关系
--> 正在检查事务
---> 软件包 mha4mysql-manager.noarch.0.0.56-0.el6 将被 安装
--> 解决依赖关系完成

依赖关系解决

=============================================================================================================================================================================================
Package 架构 版本 源 大小
=============================================================================================================================================================================================
正在安装:
mha4mysql-manager noarch 0.56-0.el6 mha4mysql-manager-0.56-0.el6.noarch 325 k

事务概要
=============================================================================================================================================================================================
安装 1 软件包

总计:325 k
安装大小:325 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : mha4mysql-manager-0.56-0.el6.noarch 1/1
验证中 : mha4mysql-manager-0.56-0.el6.noarch 1/1

已安装:
mha4mysql-manager.noarch 0:0.56-0.el6

完毕!
[root@snc-product-db-mysql04 software]#

复制

5. 配置MHA主文件

在管理机manager上配置MHA主文件,新增如下文件及内容:
/etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1 ##工作目录 目录需要自己创建
manager_log=/var/log/masterha/app1/manager.log ##日志文件 目录需要自己创建
master_ip_failover_script=/etc/masterha/master_ip_failover ##vip切换脚本
user=mha_monitor ##操作mysql的账户 三台主机都必须一样
password=mha_monitor ##操作mysql的密码 三台主机都必须一样
ssh_user=root ##ssh面密登录账户
repl_user=repl ##mysql的复制账户
repl_password=repl ##mysql的复制密码
ping_interval=1   ##每隔ping_interval秒检测主库心跳,最多四次机会,如果都没有心跳,主库宕机

复制

[server1]

  • hostname=172.16.100.101   ##mysql master主机ip;
  • port=3306    ##端口;
  • master_binlog_dir=/var/lib/mysql/data/mha-server     ##二进制日志目录;
  • candidate_master=1    #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave。
[server2]
  • hostname=172.16.100.102    ##从机ip;
  • port=3306   ##从机端口;
  • master_binlog_dir=/var/lib/mysql/data/mha-server    ##二进制日志目录;
  • candidate_master=1  ##是否候选备用master主机;
  • 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.88.131     ##从机ip;
  • port=3306;
  • master_binlog_dir=/var/lib/mysql/data/mha-server;
  • no_master=1    ##不适合做主库的从机。

6. 配置网络故障切换文件

在管理机manager上通过如下命令对master主库新增VIP:
ifconfig ens192:1 172.16.100.105/24
复制
并在管理机manager上配置master_ip_failover 和 master_ip_online_change 文件内容。
文件master_ip_failover内容如下:
注意:红色字体需根据不同环境做相应修改。
#!/usr/bin/env perl
use strict;
use warnings FATAL =>'all';
use Getopt::Long;
my (
$command, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '172.16.100.105/24'; # Virtual IP
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig ens192:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens192:$key down";
my $ssh_user="root";
my $exit_code = 0;
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" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed.
# If you manage master ip address at global catalog database,
# invalidate orig_master_ip here.
my $exit_code = 1;
eval {
print
"\n\n\n***************************************************************\n";
print "Disabling the VIP - $vip on old master:
$orig_master_host\n"
;
print
"***************************************************************\n\n\n\n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
# all arguments are passed.
# If you manage master ip address at global catalog database,
# activate new_master_ip here.
# You can also grant write access (create user, set read_only=0, etc)
#here.
my $exit_code = 10;
eval {
print
"\n\n\n***************************************************************\n";
print "Enabling the VIP - $vip on new master: $new_master_host \n";
print
"***************************************************************\n\n\n\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";
`ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
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";
}

复制
文件 master_ip_online_change 内容如下:
#/bin/bash
source /root/.bash_profile
vip=`echo '172.16.100.105/24'` # Virtual IP
key=`echo '1'`
command=`echo "$1" | awk -F = '{print $2}'`
orig_master_host=`echo "$2" | awk -F = '{print $2}'`
new_master_host=`echo "$7" | awk -F = '{print $2}'`
orig_master_ssh_user=`echo "${12}" | awk -F = '{print $2}'`
new_master_ssh_user=`echo "${13}" | awk -F = '{print $2}'`
stop_vip=`echo "ssh root@$orig_master_host /sbin/ifconfig ens192:$key down"`
start_vip=`echo "ssh root@$new_master_host /sbin/ifconfig ens192:$key $vip"`
if [ $command = 'stop' ]
then
echo -e "\n\n\n***************************************************************\n"
echo -e "Disabling the VIP - $vip on old master: $orig_master_host\n"
$stop_vip
if [ $? -eq 0 ]
then
echo "Disabled the VIP successfully"
else
echo "Disabled the VIP failed"
fi
echo -e "***************************************************************\n\n\n\n"
fi
if [ $command = 'start' -o $command = 'status' ]
then
echo -e "\n\n\n***************************************************************\n"
echo -e "Enabling the VIP - $vip on new master: $new_master_host \n"
$start_vip
if [ $? -eq 0 ]
then
echo "Enabled the VIP successfully"
else
echo "Enabled the VIP failed"
fi
echo -e "***************************************************************\n\n\n\n"
fi

复制

7. 验证mysql复制是否成功

通过MHA自带工具masterha_check_repl验证mysql复制是否成功:
masterha_check_repl --conf=/etc/masterha/app1.cnf
复制
[root@snc-product-db-mysql04 bin]# masterha_check_repl --conf=/etc/masterha/app1.cnf
Wed Dec 21 12:00:06 2022 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
..................
(略)
..................
Testing mysqlbinlog output.. done.
Cleaning up test file(s).. done.
Wed Dec 21 12:03:17 2022 - [info] Slaves settings check done.
Wed Dec 21 12:03:17 2022 - [info]
172.16.100.101(172.16.100.101:3306) (current master)
+--172.16.100.102(172.16.100.102:3306)
+--172.16.100.103(172.16.100.103:3306)

Wed Dec 21 12:03:17 2022 - [info] Checking replication health on 172.16.100.102..
Wed Dec 21 12:03:17 2022 - [info] ok.
Wed Dec 21 12:03:17 2022 - [info] Checking replication health on 172.16.100.103..
Wed Dec 21 12:03:17 2022 - [info] ok.
Wed Dec 21 12:03:17 2022 - [warning] master_ip_failover_script is not defined.
Wed Dec 21 12:03:17 2022 - [warning] shutdown_script is not defined.
Wed Dec 21 12:03:17 2022 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.
[root@snc-product-db-mysql04 bin]#

复制

8. MHA manager的启停维护

后台运行manager:
nohup masterha_manager --conf=/etc/masterha/app1.cnf &
复制
查看mha的运行状态:
masterha_check_status --conf=/etc/masterha/app1.cnf
复制
查看日志:
cat /var/log/masterha/app1/manager.log
复制
关闭 MHA manager 监控:
masterha_stop --conf=/etc/masterha/app1.cnf
复制
注意
通过nohup将masterha_manager放到后台执行,会出现监控进程异常退出的情况,这里我们可以将开启监控的命令保存到一个文件中(如:start_monitor.sh ),然后运行这个文件即可。
#!/bin/bash
#file_name:start_monitor.sh
/usr/bin/nohup /usr/bin/masterha_manager --conf=/etc/masterha/app1.cnf --ignore_last_failover > /var/log/masterha/app1/manager.log 2>&1 &

复制

或者也可以参照官方资料,使用daemon的方式运行。




高可用测试



1. 主库宕机测试

以MHA manager 作为client连接MySQL数据库
可以看到,这里连接的是master节点。
这里,我们重启master主机(172.16.100.101),可以看到VIP(172.16.100.105)漂移至节点2上。
连接上新主库(节点2),可以看到,此时节点2已经切换为主库角色。
在原第二备库(节点3)执行“show slave status”,可以看到已经指向新主库(节点2)。
如下修复将原master节点(节点1)修复为新主库(节点2)的备库。
分析MHA日志,可以看到:
cat /var/log/masterha/app1/manager.log |grep -i "All other slaves should start"

[root@snc-product-db-mysql04 masterha]# cat /var/log/masterha/app1/manager.log |grep -i "All other slaves should start"
Wed Dec 21 13:36:39 2022 - [info] All other slaves should start replication from here. Statement should be: CHANGE
MASTER TO MASTER_HOST='172.16.100.102', MASTER_PORT=3306,
MASTER_LOG_FILE='mha-server.000004', MASTER_LOG_POS=471,
MASTER_USER='repl', MASTER_PASSWORD='xxx';

复制
根据提示,在原master节点上,执行:
CHANGE MASTER TO MASTER_HOST='172.16.100.102', 
MASTER_PORT=3306, MASTER_LOG_FILE='mha-server.000004',
MASTER_LOG_POS=471, MASTER_USER='repl',

复制
MASTER_PASSWORD='repl'; 命令,并启动slave进程。
可以看到,原master已经成为节点2(新主库)的slave角色。

2. 角色还原

下面将新备库(原master节点)还原为主库,新主库(节点2)还原为备库
在MHA manager节点执行如下命令,停止MHA监控:
masterha_stop --conf=/etc/masterha/app1.cnf
复制
然后执行如下命令,进行角色还原:
masterha_master_switch --conf=/etc/masterha/app1.cnf --
master_state=alive --new_master_host=172.16.100.101 --
new_master_port=3306 --orig_master_is_new_slave --
running_updates_limit=10000

复制
执行完成后,可以看到恢复到初始的1个master(节点1)和两个slave(节点2和节点3)状态。
[root@snc-product-db-mysql04 masterha]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.16.100.101 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
Wed Dec 21 15:52:48 2022 - [info] MHA::MasterRotate version 0.56.
Wed Dec 21 15:52:48 2022 - [info] Starting online master switch..
Wed Dec 21 15:52:48 2022 - [info]
.............
(略)
.............
Wed Dec 21 15:52:58 2022 - [info] Waiting to execute all relay logs on 172.16.100.103(172.16.100.103:3306)..
Wed Dec 21 15:52:58 2022 - [info] master_pos_wait(mha-server.000006:154) completed on 172.16.100.103(172.16.100.103:3306). Executed 0 events.
Wed Dec 21 15:52:58 2022 - [info] done.
Wed Dec 21 15:52:58 2022 - [info] Resetting slave 172.16.100.103(172.16.100.103:3306) and starting replication from the new master 172.16.100.101(172.16.100.101:3306)..
Wed Dec 21 15:52:58 2022 - [info] Executed CHANGE MASTER.
Wed Dec 21 15:52:58 2022 - [info] Slave started.
Wed Dec 21 15:52:59 2022 - [info] End of log messages from 172.16.100.103 ...
Wed Dec 21 15:52:59 2022 - [info]
Wed Dec 21 15:52:59 2022 - [info] -- Slave switch on host 172.16.100.103(172.16.100.103:3306) succeeded.
Wed Dec 21 15:52:59 2022 - [info] Unlocking all tables on the orig master:
Wed Dec 21 15:52:59 2022 - [info] Executing UNLOCK TABLES..
Wed Dec 21 15:52:59 2022 - [info] ok.
Wed Dec 21 15:52:59 2022 - [info] Starting orig master as a new slave..
Wed Dec 21 15:52:59 2022 - [info] Resetting slave 172.16.100.102(172.16.100.102:3306) and starting replication from the new master 172.16.100.101(172.16.100.101:3306)..
Wed Dec 21 15:52:59 2022 - [info] Executed CHANGE MASTER.
Wed Dec 21 15:52:59 2022 - [info] Slave started.
Wed Dec 21 15:52:59 2022 - [info] All new slave servers switched successfully.
Wed Dec 21 15:52:59 2022 - [info]
Wed Dec 21 15:52:59 2022 - [info] * Phase 5: New master cleanup phase..
Wed Dec 21 15:52:59 2022 - [info]
Wed Dec 21 15:52:59 2022 - [info] 172.16.100.101: Resetting slave info succeeded.
Wed Dec 21 15:52:59 2022 - [info] Switching master to 172.16.100.101(172.16.100.101:3306) completed successfully.
[root@snc-product-db-mysql04 masterha]#

复制


END


本文作者:张 红(上海新炬中北团队)

本文来源:“IT那活儿”公众号


文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论