MySQL高可用集群-MHA-

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


MySQL高可用集群

环境架构:

|主机名称| IP | 角色 | 权限|
|Mysql00| 192.168.118.70 |Master | 读写 |
| Mysql01 | 192.168.118.71 |Slave1 |只读 |
|Mysql02 | 192.168.118.72| Slave2 | 只读 |
|Mysql_MHA | 192.168.118.73 | MHA Manager | 只读 |

关闭防火墙和SELINUX

systemctl stop firewalld
systemctl disable firewalld
sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
setenforce 0

在Mysql00的/etc/hosts中添加主机名

cat > /etc/hostname << EOF
Mysql_MHA
EOF

cat >> /etc/hosts << EOF
192.168.118.70 Mysql00
192.168.118.71 Mysql01
192.168.118.72 Mysql02
192.168.118.73 Mysql_MHA
EOF

ssh免秘钥登录

[root@hadoop00 ~]## ssh-keygen -t rsa

//复制到其他节点
# for i in { 01 02 _MHA }; do ssh-copy-id root@Mysql$i;done 

Mysql主从搭建

安装MySQL5.7采用linux源包

下载安装源包

# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

在这里插入图片描述

# yum install -y mysql57-community-release-el7-10.noarch.rpm

# rpm -qa | grep mysql
mysql57-community-release-el7-10.noarch
zabbix-web-mysql-scl-5.0.23-1.el7.noarch
zabbix-server-mysql-5.0.23-1.el7.x86_64
rh-php72-php-mysqlnd-7.2.24-1.el7.x86_64

//接下来安装mysql-server
# yum install -y mysql-server

依赖关系解决

==========================================================================================================================================================
 Package                                         架构                       版本                              源                                     大小
==========================================================================================================================================================
正在安装:
 mysql-community-libs                            x86_64                     5.7.38-1.el7                      mysql57-community                     2.6 M
      替换  mariadb-libs.x86_64 1:5.5.68-1.el7
 mysql-community-libs-compat                     x86_64                     5.7.38-1.el7                      mysql57-community                     1.2 M
      替换  mariadb-libs.x86_64 1:5.5.68-1.el7
 mysql-community-server                          x86_64                     5.7.38-1.el7                      mysql57-community                     178 M
为依赖而安装:
 mysql-community-client                          x86_64                     5.7.38-1.el7                      mysql57-community                      28 M
 mysql-community-common                          x86_64                     5.7.38-1.el7                      mysql57-community                     311 k

事务概要
==========================================================================================================================================================
安装  3 软件包 (+2 依赖软件包)

总计:209 M
Downloading packages:
警告:/var/cache/yum/x86_64/7/mysql57-community/packages/mysql-community-libs-compat-5.7.38-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
从 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 检索密钥"MySQL 5.7 Community Server" 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。


 失败的软件包是:mysql-community-libs-compat-5.7.38-1.el7.x86_64
 GPG  密钥配置为:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
到官网搜索GPG

查到密钥相关信息
https://dev.mysql.com/doc/refman/5.7/en/checking-gpg-signature.html
复制创建密钥文件,再导入个人公共 GPG 密钥环

# vim mysql_pubkey.asc
# gpg --import mysql_pubkey.asc
gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 3A79BD29:公钥“MySQL Release Engineering <mysql-build@oss.oracle.com>”已导入
gpg: 合计被处理的数量:1
gpg:           已导入:1  (RSA: 1)


要将密钥导入 RPM 配置以验证 RPM 安装包,您应该能够直接导入密钥:
#rpm --import mysql_pubkey.asc

将密钥文件复制到 01 02 。其他相同
# for i in { 01 02 }; do scp mysql_pubkey.asc root@Mysql$i:/root/ ;done 

又过期20230627

警告:/var/cache/yum/x86_64/7/mysql57-community/packages/mysql-community-common-5.7.42-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
从 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 检索密钥"MySQL 5.7 Community Server" 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

 失败的软件包是:mysql-community-common-5.7.42-1.el7.x86_64
 GPG  密钥配置为:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

直接导入网站上的
#rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
再次安装
# yum install -y mysql-server
已安装:
  mysql-community-libs.x86_64 0:5.7.38-1.el7      mysql-community-libs-compat.x86_64 0:5.7.38-1.el7      mysql-community-server.x86_64 0:5.7.38-1.el7     

作为依赖被安装:
  mysql-community-client.x86_64 0:5.7.38-1.el7                                mysql-community-common.x86_64 0:5.7.38-1.el7                               

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

完毕!

顺利完成

启动服务
# systemctl start mysqld.service 
# systemctl enable mysqld.service 
# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2022-05-29 13:43:02 CST; 11s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 14526 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 14471 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 14529 (mysqld)
    Tasks: 27
   Memory: 318.5M
   CGroup: /system.slice/mysqld.service
           └─14529 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

查看默认密码并修改:
[root@Mysql00 ~]# grep "password" /var/log/mysqld.log
2022-06-24T09:52:34.620054Z 1 [Note] A temporary password is generated for root@localhost: WJ+yVida/6am
[root@Mysql00 ~]# mysql -uroot -p
Enter password:          //输入默认密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38
.....
//设置新密码
mysql> set password = Password('Admin@123');      
Query OK, 0 rows affected, 1 warning (0.03 sec)

允许远程登录quit
mysql> grant all privileges on *.* to 'root'@'%' identified by 'Admin@123' with grant option;
mysql> flush privileges;


# netstat -tlnp | grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      1830/mysqld   
修改默认语言

在这里插入图片描述
先退出,然后去修改 /etc/my.cnf ,在centos中所有的配置文件几乎都在 etc 目录下
在这里插入图片描述

# vim /etc/my.cnf
---增加以下行
[client]
default-character-set=utf8
----
[mysql]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
----下面新增
character-set-server=utf8
collation-server=utf8_unicode_ci

保存退出,再重启服务
service mysqld restart
再进去时就可以看看状态了

在这里插入图片描述

Mysql主从配置

Master节点

修改master节点的配置文件

# vim /etc/my.cnf
//在[mysqld]  下新增中如下信息
[mysqld]
# 指定server id
server-id=1

# innodb_buffer_pool_size = 128M

# 开启binlog功能,并指定日志文件名称
log_bin=mysql-bin
# 每次执行写入性操作就与磁盘同步
sync-binlog=1
# 指定哪些库排除掉不进行同步
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
# 日志中记录每一行数据被修改的情况
binlog-format=ROW
relay_log_purge=0
# 指定中继日志
relay_log=mysql-relay-bin

重启服务

systemctl restart mysqld

主库给从库授权

# mysql -uroot -p
mysql> grant replication slave on *.* to root@'%' identified by 'Admin@123';
mysql> grant all privileges on *.* to root@'%' identified by 'Admin@123';
mysql> flush privileges;
Slave1节点

修改Slave1节点配置文件

# vim /etc/my.cnf
//在[mysqld]  下新增中如下信息
[mysqld]
# 指定server id
server-id=2
read_only=1
# 后面要用 master_auto_position=1需要开启
gtid_mode=on
enforce_gtid_consistency=on

# innodb_buffer_pool_size = 128M

# 开启binlog功能,并指定日志文件名称
log_bin=mysql-bin
# 每次执行写入性操作就与磁盘同步
sync-binlog=1
# 指定哪些库排除掉不进行同步
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
# 日志中记录每一行数据被修改的情况
binlog-format=ROW
relay_log_purge=0
# 指定中继日志
relay_log=mysql-relay-bin

重启服务

systemctl restart mysqld

从库开启同步

//第二次补充时查询,主节点先查下
mysql> show master status;
+------------------+----------+--------------+-------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                          | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------+-------------------+
| mysql-bin.000001 |      869 |              | performance_schema,information_schema,sys |                   |
+------------------+----------+--------------+-------------------------------------------+-------------------+
1 row in set (0.01 sec)

----
# mysql -uroot -p
Enter password: 

mysql> change master to
master_host='192.168.118.70',master_port=3306,master_user='root',master_password
='Admin@123',master_log_file='mysql-bin.000002',master_log_pos=154;

//或者使用 
mysql> change master to
master_host='192.168.118.70',master_port=3306,master_user='root',master_password
='Admin@123',master_auto_position=1;
//其中,master_auto_position=1就表示这个主备关系使用的是GTID协议。可以看到,前面让我们头疼不已的MASTER_LOG_FILE和MASTER_LOG_POS参数,已经不需要指定了。

mysql> start slave; // 开启同步

注意: 如果主从复制帐号不想用root,需要主从配置之前就设置账号,先分别建好管理 账号和主从复制账号

#创建主从复制帐号
create user 'gtid'@'192.168.118.%' identified by 'Gtid@123';
grant replication slave on *.* to 'gtid'@'192.168.118.%';
flush privileges;
#创建管理帐号
create user 'manage'@'192.168.118.%' identified by 'Admin@123';
grant all privileges on *.* to 'manage'@'192.168.118.%';
flush privileges;

//主从如已开始,从就不需要另外建用户了
show grants for 'manage'@'192.168.118.%';    

Slave2节点

修改Slave2节点配置文件

# vim /etc/my.cnf
//在[mysqld]  下新增中如下信息
[mysqld]
# 指定server id
server-id=3
read_only=1
# 后面要用 master_auto_position=1需要开启
gtid_mode=on
enforce_gtid_consistency=on
# innodb_buffer_pool_size = 128M

# 开启binlog功能,并指定日志文件名称
log_bin=mysql-bin
# 每次执行写入性操作就与磁盘同步
sync-binlog=1
# 指定哪些库排除掉不进行同步
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
# 日志中记录每一行数据被修改的情况
binlog-format=ROW
relay_log_purge=0
# 指定中继日志
relay_log=mysql-relay-bin

其他同Slave1

配置半同步复制

Master节点

安装插件

install plugin rpl_semi_sync_master soname 'semisync_master.so';
show variables like '%semi%';
//修改半同步配置
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_master_timeout=1000;
flush privileges;

重启服务

systemctl restart mysqld
Slave节点

两台Slave节点都执行以下步骤。

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

//修改半同步配置
set global rpl_semi_sync_slave_enabled=1;
stop slave;
start slave;

重启服务

systemctl restart mysqld
测试半同步状态

首先通过MySQL命令行检查参数的方式,查看半同步是否开启。
Master节点

mysql> show variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.04 sec)

Slave节点

mysql> show variables like '%semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.04 sec)

然后通过MySQL日志再次确认。

cat /var/log/mysqld.log

可以看到日志中已经启动半同步

....Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000002, 154)

....Start semi-sync binlog_dump to slave (server_id: 3), pos(mysql-bin.000002, 154)


-----采用Git后显示不一样,如下:
2022-10-23T10:21:23.637721Z 3 [Note] Start binlog_dump to master_thread_id(3) slave_server(2), pos(, 4)
2022-10-23T10:21:23.637749Z 3 [Note] Start asynchronous binlog_dump to slave (server_id: 2), pos(, 4)
2022-10-23T10:21:27.205692Z 4 [Note] Start binlog_dump to master_thread_id(4) slave_server(3), pos(, 4)
2022-10-23T10:21:27.205732Z 4 [Note] Start asynchronous binlog_dump to slave (server_id: 3), pos(, 4)

查看状态

mysql> show slave status\G

在这里插入图片描述
报错:
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
因三台主机用master安装好mysql后,再克隆出来的,所以UUID是一样的

mysql> show variables like '%server_uuid%';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 479c649b-f501-11ec-8ca1-5254002b8ecb |
+---------------+--------------------------------------+
1 row in set (0.01 sec)

修改UUID

[root@Mysql01 ~]# vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=479c649b-f501-11ec-8ca1-5254002b8ecc

[root@Mysql02 ~]# vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=479c649b-f501-11ec-8ca1-5254002b8ecd

之后重启
# systemctl restart mysqld

MHA高可用搭建

MHA介绍

MHA使用perl语言编写的一个脚本管理管理工具,用于维持master主库的高可用性。
MHA包含两个部分:MHA Manager(管理节点)和MHA Node(数据节点)
在这里插入图片描述

MHA原理:

MHA用于维持 MySQL Replication 中 master 库的高可用性,最大的特点是可以修复多个slave上的差异日志,最终使所有slave保持数据一致,然后从中选取一个充当新的 master,并让其他 slave 指向它。

当master出现故障时,通过对比 slave 之间的 I/O thread 读取主库的 binlog 的 position 号,选取最接近的slave作为备胎(被选主库),其它从库通过与备胎对比,生成差异的中继日志,在备胎上运用从原来的 master 保存的 binlig,同时将备胎提升为master。最后在其他 slave 上运用相应的差异中继日志,并从新的 master 开始复制。

优点:
故障切换时,自动判断哪个从库与主库离的最近,并切换到上面
支持binlog server,提高 binlog 的传送效率
结合半同步功能,确保故障切换时数据不丢失

四台机器ssh互通

在四台服务器上分别执行下面命令,生成公钥和私钥,换行回车采用默认值

ssh-keygen -t rsa

在三台MySQL服务器分别执行下面命令,将公钥拷到MHA Manager服务器上

ssh-copy-id 192.168.118.73

之后可以在MHA Manager服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥

[root@Mysql_MHA ~]# cat /root/.ssh/authorized_keys

从MHA Manager服务器执行命令,向其他三台机器分发公钥。

# for i in { 00 01 02 }; do ssh-copy-id root@Mysql$i;done 
for i in { 00 01 02 }; do ssh-copy-id root@Mysql$i;done 


注意:4台都要对加外三台互相,不然后面要报错@_@

MHA下载安装

三台MySQL服务器需要安装node
MHA Manager服务器需要安装manager和node

MHA node安装

#node安装包
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
#安装依赖
yum install perl-DBD-MySQL -y

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

MHA manager安装

在MHA Manager服务器安装mha4mysql-node和mha4mysql-manager。
MHA的manager又依赖了perl-Config-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager,也分别进行安装。

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

rpm -ivh epel-release-latest-7.noarch.rpm

yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y

#node安装包
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

#manager安装包
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
//本次没碰到
提示:由于perl-Log-Dispatch和perl-Parallel-ForkManager这两个被依赖包在yum仓库找不到,
因此安装epel-release-latest-7.noarch.rpm。在使用时,可能会出现下面异常:Cannot
retrieve metalink for repository: epel/x86_64。可以尝试使
用/etc/yum.repos.d/epel.repo,然后注释掉mirrorlist,取消注释baseurl。

注意:如果出现如上错误,修改完配置后执行如下命令
yum clean all 
yum makecache 
yum update 
yum install -y lsof
MHA配置文件

MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的Master/Slave 集群也可共享全局配置。

初始化配置目录

mkdir -p /var/log/mha/app1
touch /var/log/mha/app1/manager.log
#目录说明
#/var/log (CentOS目录)
# /mha (MHA监控根目录)
# /app1 (MHA监控实例根目录)
# /manager.log (MHA监控实例日志文件)

配置监控全局配置文件

vim /etc/masterha_default.cnf

[server default]
#管理用户名
user=root   
#管理密码
password=Admin@123
#ssh登录账号
ssh_user=root
#主从复制账号
repl_user=root
#主从复制密码
repl_password=Admin@123
#设置监控主库,发送ping包的时间间隔
ping_interval=1
#设置发生切换之后发送的报警脚本
#report_script=/usr/local/send_report
#二次检查的主机,实现多路监测master的可用性
secondary_check_script=masterha_secondary_check -s 192.168.118.70 -s 192.168.118.71 -s 192.168.118.72

注意:如果不想用root,可以在前面mysql配置时先分别建好管理 账号和主从复制账号

#创建主从复制帐号
create user 'gtid'@'192.168.118.%' identified by 'gtid@123';
grant replication slave on *.* to 'gtid'@'192.168.118.%';
flush privileges;
#创建管理帐号
create user 'manage'@'192.168.118.%' identified by 'Admin@123';
grant all privileges on *.* to 'manage'@'192.168.118.%';
flush privileges;

//主从如已开始,从就不需要另外建用户了
show grants for 'manage'@'192.168.118.%';    

配置监控实例配置文件

mkdir -p /etc/mha
vim /etc/mha/app1.cnf 
---
[server default]
#MHA监控实例根目录
manager_workdir=/var/log/mha/app1
#MHA监控实例日志文件
manager_log=/var/log/mha/app1/manager.log

#[serverx]         服务器编号
#hostname          主机名
#candidate_master  可以做主库
#master_binlog_dir binlog日志文件目录

[server1]
hostname=192.168.118.70
candidate_master=1
master_binlog_dir="/var/lib/mysql"

[server2]
hostname=192.168.118.71
candidate_master=1
master_binlog_dir="/var/lib/mysql"

[server3]
hostname=192.168.118.72
candidate_master=1
master_binlog_dir="/var/lib/mysql"

MHA 配置检测
执行ssh通信检测

在MHA Manager服务器上执行:

[root@Mysql_MHA ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
...
[info] All SSH connection tests passed successfully.

如有报错

Sat Jun 25 16:03:43 2022 - [debug]  Connecting via SSH from root@192.168.118.70(192.168.118.70:22) to root@192.168.118.72(192.168.118.72:22)..
Sat Jun 25 16:03:43 2022 - [debug]   ok.
Sat Jun 25 16:03:44 2022 - [error][/usr/share/perl5/vendor_perl/MHA/SSHCheck.pm, ln63] 
Sat Jun 25 16:03:43 2022 - [debug]  Connecting via SSH from root@192.168.118.72(192.168.118.72:22) to root@192.168.118.70(192.168.118.70:22)..
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

先检查互信,4台主机都要完全互信
前面只 mysql0~2对MHA互想,MHA也对 mysql0-2互相,就会这样报错

检测MySQL主从复制

在MHA Manager服务器上执行:

[root@Mysql_MHA ~]# masterha_check_repl --conf=/etc/mha/app1.cnf

如: 出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。

报错:
1、

Sun Jun 26 15:49:12 2022 - [error][/usr/share/perl5/vendor_perl/MHA/Server.pm, ln180] Got MySQL error when connecting 192.168.118.72(192.168.118.72:3306) :1130:Host 'Mysql_MHA' is not allowed to connect to this MySQL server, but this is not a MySQL crash. Check MySQL server settings.
Sun Jun 26 15:49:12 2022 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln301]  at /usr/share/perl5/vendor_perl/MHA/ServerManager.pm line 297.
Sun Jun 26 15:49:12 2022 - [error][/usr/share/perl5/vendor_perl/MHA/Server.pm, ln180] Got MySQL error when connecting 192.168.118.71(192.168.118.71:3306) :1130:Host 'Mysql_MHA' is not allowed to connect to this MySQL server, but this is not a MySQL crash. Check MySQL server settings.
Sun Jun 26 15:49:12 2022 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln301]  at /usr/share/perl5/vendor_perl/MHA/ServerManager.pm line 297.
Sun Jun 26 15:49:13 2022 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln309] Got fatal error, stopping operations
Sun Jun 26 15:49:13 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm line 329.
Sun Jun 26 15:49:13 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Sun Jun 26 15:49:13 2022 - [info] Got exit code 1 (Not master dead).

-----
解决方式:
修改 /etc/masterha_default.cnf文件的管理用户名,不要用root,改成manage,需要在master上新建

2、

mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8'
mysqlbinlog version command failed with rc 7:0, please verify PATH, LD_LIBRARY_PATH, and client options
 at /usr/bin/apply_diff_relay_logs line 532.
Sat Jun 25 16:25:12 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln208] Slaves settings check failed!
Sat Jun 25 16:25:12 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln416] Slave configuration failed.
Sat Jun 25 16:25:12 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/bin/masterha_check_repl line 48.
Sat Jun 25 16:25:12 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Sat Jun 25 16:25:12 2022 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!
# vim /etc/my.cnf
[client]
default-character-set=utf8     注释掉#,再检查后面就好了,但是可以不重启,这样既不会对线上业务有影响,也可以避免复制状态检测报错。
MHA Manager启动

在MHA Manager服务器上执行:

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover /var/log/mha/app1/manager.log 2>&1 &

查看监控状态命令如下:

# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:2557) is running(0:PING_OK), master:192.168.118.70

查看监控日志命令如下:

tail -f /var/log/mha/app1/manager.log
测试MHA故障转移

模拟主节点崩溃

在MHA Manager服务器执行打开日志命令:

tail -200f /var/log/mha/app1/manager.log

关闭Master MySQL服务器服务,模拟主节点崩溃

systemctl stop mysqld

查看MHA日志,可以看到哪台slave切换成了master

Started automated(non-interactive) failover.
The latest slave 192.168.118.71(192.168.118.71:3306) has all relay logs for recovery.
Selected 192.168.118.71(192.168.118.71:3306) as a new master.
192.168.118.71(192.168.118.71:3306): OK: Applying all logs succeeded.
192.168.118.72(192.168.118.72:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
192.168.118.72(192.168.118.72:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.118.71(192.168.118.71:3306)
192.168.118.71(192.168.118.71:3306): Resetting slave info succeeded.
Master failover to 192.168.118.71(192.168.118.71:3306) completed successfully.

mysql> show master status;
+------------------+----------+--------------+-------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                          | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------+-------------------+
| mysql-bin.000004 |      963 |              | performance_schema,information_schema,sys |                   |
+------------------+----------+--------------+-------------------------------------------+-------------------+
1 row in set (0.00 sec)
//这个命令没怎么标出哪台为master,感觉没啥用

//在Mysql02上看
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.118.71
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 963
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

切换 master 后,MHA进程会自动关闭 ,并生成文件 mha.failover.complete

[root@Mysql_MHA ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING).

mha.failover.complete 文件:该文件生成后,将不在允许主库故障后自动切换

将原主启动切换回主

启动Mysql00的 MySQL服务

systemctl start mysqld

另外,要先在原主库上定义成从库slave,从新的主库同步后,才可以再次转换成主库,不然原主库查看主从状态会是空的。

mysql> show slave status\G
Empty set (0.01 sec)

-----
mysql> change master to
master_host='192.168.118.71',master_port=3306,master_user='root',master_password
='Admin@123',master_auto_position=1;

-----

mysql> start slave; // 开启同步
-----
mysql> stop slave;  //----第二次处理时没有关,没这提示了;要切换回来需要关闭从属,不然会提示 ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.

1)使用MHA在线切换命令将原主切换回来
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=192.168.118.70 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

无法切换回来,报错

Sat Jun 25 17:25:30 2022 - [info] Starting online master switch..
Sat Jun 25 17:25:30 2022 - [info] 
Sat Jun 25 17:25:30 2022 - [info] * Phase 1: Configuration Check Phase..
Sat Jun 25 17:25:30 2022 - [info] 
Sat Jun 25 17:25:30 2022 - [info] Reading default configuration from /etc/masterha_default.cnf..
Sat Jun 25 17:25:30 2022 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Sat Jun 25 17:25:30 2022 - [info] Reading server configuration from /etc/mha/app1.cnf..
Sat Jun 25 17:25:31 2022 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln671] Master 192.168.118.70:3306 from which slave 192.168.118.71(192.168.118.71:3306) replicates is not defined in the configuration file!
Sat Jun 25 17:25:31 2022 - [error][/usr/share/perl5/vendor_perl/MHA/ManagerUtil.pm, ln177] Got ERROR:  at /usr/share/perl5/vendor_perl/MHA/MasterRotate.pm line 86.

大概是说 Master 192.168.118.70没在配置文件中定义
检查 /etc/mha/app1.cnf,会发现少了server1

[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1

[server2]
candidate_master=1
hostname=192.168.118.71
master_binlog_dir="/var/lib/mysql"

[server3]
candidate_master=1
hostname=192.168.118.72
master_binlog_dir="/var/lib/mysql"

再添加上

[server1]
hostname=192.168.118.70
candidate_master=1
master_binlog_dir="/var/lib/mysql"

再次执行

masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=192.168.118.70 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

出现 提示很多:

Mon Oct 24 16:56:31 2022 - [info] MHA::MasterRotate version 0.58.
Mon Oct 24 16:56:31 2022 - [info] Starting online master switch..
Mon Oct 24 16:56:31 2022 - [info] 
Mon Oct 24 16:56:31 2022 - [info] * Phase 1: Configuration Check Phase..
Mon Oct 24 16:56:31 2022 - [info] 
Mon Oct 24 16:56:31 2022 - [info] Reading default configuration from /etc/masterha_default.cnf..
Mon Oct 24 16:56:31 2022 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Mon Oct 24 16:56:31 2022 - [info] Reading server configuration from /etc/mha/app1.cnf..
Mon Oct 24 16:56:32 2022 - [info] GTID failover mode = 1
Mon Oct 24 16:56:32 2022 - [info] Current Alive Master: 192.168.118.71(192.168.118.71:3306)
Mon Oct 24 16:56:32 2022 - [info] Alive Slaves:
Mon Oct 24 16:56:32 2022 - [info]   192.168.118.70(192.168.118.70:3306)  Version=5.7.38-log (oldest major version between slaves) log-bin:enabled
Mon Oct 24 16:56:32 2022 - [info]     GTID ON
Mon Oct 24 16:56:32 2022 - [info]     Replicating from 192.168.118.71(192.168.118.71:3306)
Mon Oct 24 16:56:32 2022 - [info]     Primary candidate for the new Master (candidate_master is set)
Mon Oct 24 16:56:32 2022 - [info]   192.168.118.72(192.168.118.72:3306)  Version=5.7.38-log (oldest major version between slaves) log-bin:enabled
Mon Oct 24 16:56:32 2022 - [info]     GTID ON
Mon Oct 24 16:56:32 2022 - [info]     Replicating from 192.168.118.71(192.168.118.71:3306)
Mon Oct 24 16:56:32 2022 - [info]     Primary candidate for the new Master (candidate_master is set)

It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on 192.168.118.71(192.168.118.71:3306)? (YES/no):  yes   《------输入,这里指是否要刷新binlog表,保存记录用,slave机是只读,其实可以不管的
。。。。。。
Starting master switch from 192.168.118.71(192.168.118.71:3306) to 192.168.118.70(192.168.118.70:3306)? (yes/NO): yes   《------输入
。。。。。。
master_ip_online_change_script is not defined. If you do not disable writes on the current master manually, applications keep writing on the current master. Is it ok to proceed? (yes/NO):yes   《------输入
。。。。。。
Mon Oct 24 16:59:12 2022 - [info]  192.168.118.70: Resetting slave info succeeded.
Mon Oct 24 16:59:12 2022 - [info] Switching master to 192.168.118.70(192.168.118.70:3306) completed successfully.

再查下mysql01和02机子上的状态,可以看到顺利完成切换了。

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.118.70
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.118.70
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

记得要恢复启动MHA Manager
在MHA Manager服务器上执行:

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover /var/log/mha/app1/manager.log 2>&1 &
方式2-)手动切换,挂到新主,做从库

注意:有时 为了确保不会自动切换,先停掉 MHA 管理进程:

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

先切换mysql01

mysql> change master to
master_host='192.168.118.70',master_port=3306,master_user='root',master_password
='Admin@123',master_auto_position=1;

start slave; // 开启同步

mysql>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 192.168.118.70

注意这里mysql01切换后,如果master主机没有stop slave; 则本机还会显示master是mysql01主机,mysql01已经指向mysql00了
注意:手动切换需要对mysql02节点也要切换下,不然还是主118.71的
mysql02切换报错:

mysql> change master to
master_host='192.168.118.70',master_port=3306,master_user='root',master_password
='Admin@123',master_auto_position=1;
报错
ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' first

mysql> stop slave;
Query OK, 0 rows affected (0.12 sec)

mysql> change master to
master_host='192.168.118.70',master_port=3306,master_user='root',master_password
='Admin@123',master_auto_position=1;
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)

这样也顺利完成切换了

测试SQL脚本—直接 测试

使用 MySQL Quer Browser-导入.sql表格
在master上依次导入 执行这两个练习脚 本;
create.sql
populate.sql

之用查看slave节点
在这里插入图片描述
顺利完成主从备份


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ives

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值