[TOC]
本配置是基于 4台虚拟机(1主2从 1MHA manager)实现的,关于mysql的主从半同步配置,请移步上一篇文章。
虚机作用
角色 | IP | 主机名 | server_id | 作用 |
---|---|---|---|---|
MHA manager | 172.16.14.204 | myql-mha | -- | 监控复制组 |
Master | 172.16.14.201 | myql-master | 1 | 主库-写请求 |
Slave1 | 172.16.14.202 | myql-slave1 | 2 | 从库-读请求 |
Slave2 | 172.16.14.203 | myql-slave2 | 3 | 从库-读请求 |
在 master 准备授权账号
在所有DB上面授权MHA管理账号
mysql> grant all on *.* to 'mhaadmin'@'%' identified by 'mhaadmin';
准备 ssh 互通环境
MHA集群中的各节点彼此之间均需要基于ssh互信通信,以实现远程控制及数据管理功能。简单起见,可在Manager节点生成密钥对儿,并设置其可远程连接本地主机后, 将私钥文件及authorized_keys文件复制给余下的所有节点即可。
下面操作在所有节点上操作:
[root@myql-mha ~]# ssh-keygen -t rsa
[root@myql-mha ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
当四台机器都进行了上述操作以后,我们可以在 manager 机器上看到如下文件:
[root@myql-mha ~]# cd .ssh/
[root@myql-mha .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
[root@myql-mha .ssh]# cat authorized_keys
四台机器的公钥都已经在authorized_keys
这个文件中了,接着,我们只需要把这个文件发送至另外三台机器,这四台机器就可以实现 ssh 无密码互通了:
[root@myql-mha .ssh]# scp authorized_keys root@node2:~/.ssh/
[root@myql-mha .ssh]# scp authorized_keys root@node3:~/.ssh/
[root@myql-mha .ssh]# scp authorized_keys root@node4:~/.ssh/
当然,我们也可以在机器上实验一下,看看 ssh 是否还需要输入密码。
1. 安装 MHA 包
在本步骤中, Manager节点需要另外多安装一个包。具体需要安装的内容如下:
四个节点都需安装:
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
Manager 节点另需要安装:mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
安装包下载地址:https://huodd.lanzous.com/b01hk2aef ,大家需要的自行下载使用~
我们使用FinalShell 工具 分别上传,然后使用yum
安装即可。
安装命令
# 4台主机节点安装
[root@myql-mha ~]# yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm
# 1台Manager节点安装
[root@myql-mha ~]# yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
manager 节点安装错误处理
# 安装错误日志
错误:软件包:mha4mysql-manager-0.58-0.el7.centos.noarch (/mha4mysql-manager-0.58-0.el7.centos.noarch)
需要:perl(Log::Dispatch::File)
错误:软件包:mha4mysql-manager-0.58-0.el7.centos.noarch (/mha4mysql-manager-0.58-0.el7.centos.noarch)
需要:perl(Parallel::ForkManager)
错误:软件包:mha4mysql-manager-0.58-0.el7.centos.noarch (/mha4mysql-manager-0.58-0.el7.centos.noarch)
需要:perl(Log::Dispatch)
错误:软件包:mha4mysql-manager-0.58-0.el7.centos.noarch (/mha4mysql-manager-0.58-0.el7.centos.noarch)
需要:perl(Log::Dispatch::Screen)
您可以尝试添加 --skip-broken 选项来解决该问题
您可以尝试执行:rpm -Va --nofiles --nodigest
解决方案
登录网址 http://rpm.pbone.net/
搜索
perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm
perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm
yum install rpm安装之后mha manage安装成功
# 也可以在上面的安装包下载地址进行下载。。。。
2 初始化 MHA ,进行配置
Manager 节点需要为每个监控的 master/slave 集群提供一个专用的配置文件,而所有的 master/slave 集群也可共享全局配置。
全局配置文件默认为/etc/masterha_default.cnf
,其为可选配置。如果仅监控一组 master/slave 集群,也可直接通过 application 的配置来提供各服务器的默认配置信息。而每个 application 的配置文件路径为自定义。具体操作见下一步骤。
3 定义 MHA 管理配置文件
下面配置,均在manager机器上操作
# 创建MHA配置文件目录
mkdir /etc/mha_master
# 创建MHA脚本目录
mkdir /etc/mha_master/scripts
# 创建MHA日志目录
mkdir /var/log/mha_master/
# 创建日志目录
mkdir /var/log/mha_master/app1 -p
# 创建日志文件
touch /var/log/mha_master/app1/manager.log
[root@localhost ~]# vim /etc/mha_master/mha.cnf
MHA 配置文件
[root@manager mha]# cat /etc/mha_master/mha.cnf
[server default]
# MHA管理账号
user=mhaadmin
password=mhaadmin
# mysql 的复制账号,用来在主从机器之间同步二进制日志,这里我用的slave
repl_user=slave
repl_password=slave
# 免密登录的账户
ssh_user=root
ping_interval=1
master_binlog_dir=/opt/mysql_data
manager_workdir=/var/log/mha_master/app1.log
manager_log=/var/log/mha_master/manager.log
master_ip_failover_script="/etc/mha_master/scripts/master_ip_failover"
master_ip_online_change_script="/etc/mha_master/scripts/master_ip_online_change"
report_script="/etc/mha_master/scripts/send_report"
remote_workdir=/tmp
secondary_check_script= /usr/local/bin/masterha_secondary_check -s 10.0.20.201 -s 10.0.20.202 -s 10.0.20.203 -s 10.0.20.204
shutdown_script=""
[server1]
hostname=172.16.14.201
port=3306
[server2]
hostname=172.16.14.202
port=3306
candidate_master=1
check_repl_delay=0
# master候选人,master挂掉后,这个节点成为master
# condidate_master=1
[server3]
hostname=172.16.14.203
port=3306
# 不能成为master
# no_master=1
3.1 配置文件说明
MHA主要配置文件说明
- manager_workdir=/var/log/masterha/app1.log:设置manager的工作目录
- manager_log=/var/log/masterha/app1/manager.log:设置manager的日志文件
- master_binlog_dir=/data/mysql:设置master 保存binlog的位置,以便MHA可以找到master的日志
- master_ip_failover_script= /usr/local/bin/master_ip_failover:设置自动failover时候的切换脚本
- master_ip_online_change_script= /usr/local/bin/master_ip_online_change:设置手动切换时候的切换脚本
- user=root:设置监控mysql的用户
- password=dayi123:设置监控mysql的用户,需要授权能够在manager节点远程登录
- ping_interval=1:设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
- remote_workdir=/tmp:设置远端mysql在发生切换时binlog的保存位置
- repl_user=repl :设置mysql中用于复制的用户密码
- repl_password=replication:设置mysql中用于复制的用户
- report_script=/usr/local/send_report:设置发生切换后发送的报警的脚本
- shutdown_script="":设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
- ssh_user=root //设置ssh的登录用户名
- candidate_master=1:在节点下设置,设置当前节点为候选的master
- slave check_repl_delay=0 :在节点配置下设置,默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master;这个选项对于对于设置了candidate_master=1的主机非常有用
4 对四个节点进行检测
1)检测各节点间 ssh 互信通信配置是否 ok
我们在 Manager 机器上输入下述命令来检测:
[root@myql-mha ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf
如果最后一行显示为[info]All SSH connection tests passed successfully.
则表示成功。
[root@myql-mha ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf
Wed Jul 29 09:51:01 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Jul 29 09:51:01 2020 - [info] Reading application default configuration from /etc/mha_master/mha.cnf..
Wed Jul 29 09:51:01 2020 - [info] Reading server configuration from /etc/mha_master/mha.cnf..
Wed Jul 29 09:51:01 2020 - [info] Starting SSH connection tests..
Wed Jul 29 09:51:32 2020 - [debug]
Wed Jul 29 09:51:02 2020 - [debug] Connecting via SSH from [email protected](172.16.14.202:22) to [email protected](172.16.14.201:22)..
Wed Jul 29 09:51:12 2020 - [debug] ok.
Wed Jul 29 09:51:12 2020 - [debug] Connecting via SSH from [email protected](172.16.14.202:22) to [email protected](172.16.14.203:22)..
Wed Jul 29 09:51:32 2020 - [debug] ok.
Wed Jul 29 09:51:33 2020 - [debug]
Wed Jul 29 09:51:02 2020 - [debug] Connecting via SSH from [email protected](172.16.14.203:22) to [email protected](172.16.14.201:22)..
Wed Jul 29 09:51:22 2020 - [debug] ok.
Wed Jul 29 09:51:22 2020 - [debug] Connecting via SSH from [email protected](172.16.14.203:22) to [email protected](172.16.14.202:22)..
Wed Jul 29 09:51:33 2020 - [debug] ok.
Wed Jul 29 09:51:42 2020 - [debug]
Wed Jul 29 09:51:01 2020 - [debug] Connecting via SSH from [email protected](172.16.14.201:22) to [email protected](172.16.14.202:22)..
Wed Jul 29 09:51:21 2020 - [debug] ok.
Wed Jul 29 09:51:21 2020 - [debug] Connecting via SSH from [email protected](172.16.14.201:22) to [email protected](172.16.14.203:22)..
Wed Jul 29 09:51:42 2020 - [debug] ok.
Wed Jul 29 09:51:42 2020 - [info] All SSH connection tests passed successfully.
2)检查管理的MySQL主从复制集群的连接配置参数是否OK
[root@myql-mha ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
[root@myql-mha ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
Wed Jul 29 09:52:59 2020 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln188] There is no alive server. We can't do failover
Wed Jul 29 09:52:59 2020 - [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.
Wed Jul 29 09:52:59 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Jul 29 09:52:59 2020 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
以上关键错误信息“There is no alive server. We can't do failover”,没有活动服务器,解决方案:
我们发现检测失败,这可能是因为从节点上没有账号,因为这个架构,任何一个从节点, 将有可能成为主节点, 所以也需要创建账号。
因此,我们需要在master节点上再次执行以下操作:
mysql> grant replication slave,replication client on *.* to 'slave'@'%' identified by 'slave';
mysql> flush privileges;
然后修改配置文件:
repl_user=slave
repl_password=slave
再次检查
[root@myql-mha ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
Wed Jul 29 11:29:36 2020 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln193] There is no alive slave. We can't do failover
Wed Jul 29 11:29:36 2020 - [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.
Wed Jul 29 11:29:36 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Jul 29 11:29:36 2020 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
以上关键错误信息“There is no alive slave. We can't do failover”,没有活动从库,解决方案:
这个错误其实是主从配置问题,自行检查下主从配置是否正常。
再次检查
[root@myql-mha ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
Wed Jul 29 12:23:16 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Jul 29 12:23:16 2020 - [info] Reading application default configuration from /etc/mha_master/mha.cnf..
Wed Jul 29 12:23:16 2020 - [info] Reading server configuration from /etc/mha_master/mha.cnf..
Wed Jul 29 12:23:16 2020 - [info] MHA::MasterMonitor version 0.58.
Wed Jul 29 12:23:24 2020 - [info] GTID failover mode = 0
Wed Jul 29 12:23:24 2020 - [info] Dead Servers:
Wed Jul 29 12:23:24 2020 - [info] 172.16.14.203(172.16.14.203:3306)
Wed Jul 29 12:23:24 2020 - [info] Alive Servers:
Wed Jul 29 12:23:24 2020 - [info] 172.16.14.201(172.16.14.201:3306)
Wed Jul 29 12:23:24 2020 - [info] 172.16.14.202(172.16.14.202:3306)
Wed Jul 29 12:23:24 2020 - [info] Alive Slaves:
Wed Jul 29 12:23:24 2020 - [info] 172.16.14.202(172.16.14.202:3306) Version=5.7.31 (oldest major version between slaves) log-bin:disabled
Wed Jul 29 12:23:24 2020 - [info] Replicating from 172.16.14.201(172.16.14.201:3306)
Wed Jul 29 12:23:24 2020 - [info] Primary candidate for the new Master (candidate_master is set)
Wed Jul 29 12:23:24 2020 - [info] Current Alive Master: 172.16.14.201(172.16.14.201:3306)
Wed Jul 29 12:23:24 2020 - [info] Checking slave configurations..
Wed Jul 29 12:23:24 2020 - [warning] relay_log_purge=0 is not set on slave 172.16.14.202(172.16.14.202:3306).
Wed Jul 29 12:23:24 2020 - [warning] log-bin is not set on slave 172.16.14.202(172.16.14.202:3306). This host cannot be a master.
Wed Jul 29 12:23:24 2020 - [info] Checking replication filtering settings..
Wed Jul 29 12:23:24 2020 - [info] binlog_do_db= , binlog_ignore_db= information_schema,performance_schema,sys
Wed Jul 29 12:23:24 2020 - [info] Replication filtering check ok.
Wed Jul 29 12:23:24 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln364] None of slaves can be master. Check failover configuration file or log-bin settings in my.cnf
Wed Jul 29 12:23:24 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. at /usr/bin/masterha_check_repl line 48.
Wed Jul 29 12:23:24 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Jul 29 12:23:24 2020 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
关键提示:
[warning] log-bin is not set on slave 172.16.14.202(172.16.14.202:3306). This host cannot be a master
说明这个从库中未开启log-bin,在主库宕机时不能成为主库;开启配置即可;
[mysqld]
# 开启binlog
log_bin=mysql-bin
# 关闭只读
read_only=0
# 禁止 SQL 线程在执行完一个 relay log 后自动将其删除
relay_log_purge=0
还有中错误可能性,那就是网络延时,造成主库或从库链接不上,可以通过如下命令先链接一次;然后就会发现提示了其他错误或者验证成功。
mysql -h172.16.14.201 -uslave -pslave -P3306;
再次检查
Wed Jul 29 13:37:09 2020 - [info] Checking replication health on 172.16.14.202..
Wed Jul 29 13:37:09 2020 - [info] ok.
Wed Jul 29 13:37:09 2020 - [info] Checking replication health on 172.16.14.203..
Wed Jul 29 13:37:09 2020 - [info] ok.
Wed Jul 29 13:37:09 2020 - [warning] master_ip_failover_script is not defined.
Wed Jul 29 13:37:09 2020 - [warning] shutdown_script is not defined.
Wed Jul 29 13:37:09 2020 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
终于校验通过了,满满的都是泪啊。。。。
扩展阅读
REPLICATION CLIENT REPLICATION SLAVE
复制相关。一般复制账号需要这两个权限。
授予复制账号REPLICATION CLIENT权限,复制用户可以使用 SHOW MASTER STATUS, SHOW SLAVE STATUS和 SHOW BINARY LOGS来确定复制状态。
授予复制账号REPLICATION SLAVE权限,复制才能真正地工作。
5 启动 MHA
我们在 manager 节点上执行以下命令来启动 MHA:
[root@myql-mha ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
启动成功以后,我们来查看一下 master 节点的状态:
[root@myql-mha ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:58523) is running(0:PING_OK), master:172.16.14.201
如果,我们想要停止 MHA ,则需要使用 stop 命令:
[root@myql-mha ~]# masterha_stop -conf=/etc/mha_master/mha.cnf
6 测试 MHA 故障转移
6.1 在 master 节点关闭 mysql 服务,模拟主节点数据崩溃
[root@myql-mha ~]# systemctl stop mysqld;
稍等片刻,可以看到剩下的从库中有一台已经变成了主库。
注意,故障转移完成后, manager将会自动停止, 此时使用 masterha_check_status 命令检测将会遇到错误提示, 如下所示:
[root@myql-mha ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha is stopped(2:NOT_RUNNING).
6.2 启动原来的主库
[root@myql-mha ~]# systemctl restart mysqld;
7 提供新的从节点以修复复制集群
原有 master 节点故障后,需要重新准备好一个新的 MySQL 节点。基于来自于master 节点的备份恢复数据后,将其配置为新的 master 的从节点即可。注意,新加入的节点如果为新增节点,其 IP 地址要配置为原来 master 节点的 IP,否则,还需要修改 mha.cnf 中相应的 ip 地址。随后再次启动 manager ,并再次检测其状态。
我们就以刚刚关闭的那台主作为新添加的机器,来进行数据库的恢复:
原本的 slave1 已经成为了新的主机器,所以,我们对其进行完全备份,而后把备份的数据发送到我们新添加的机器上:
[root@mysql-slave1 ~]# mkdir /backup
[root@mysql-slave1 ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql
[root@mysql-slave1 ~]# scp /backup/mysql-backup-2017-11-23-09\:57\:09-all.sql root@node2:~
然后在 node2 节点上进行数据恢复:
[root@mysql-master ~]# mysql < mysql-backup-2017-11-23-09\:57\:09-all.sql
接下来就是配置主从。照例查看一下现在的主的二进制日志和位置,然后就进行如下设置:
mysql> change master to master_host='172.16.14.202',master_port=3306,
-> master_user='slave',master_password='slave',
-> master_log_file='mysql-bin.000005',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.14.202
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 358
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 524
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
可以看出,我们的主从已经配置好了。
8 新节点提供后再次执行检查操作
我们来再次检测状态:
[root@mysql-mha ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
如果报错,则再次授权。若没有问题,则启动 manager,注意,这次启动要记录日志:
[root@mysql-mha ~]# masterha_manager -conf=/etc/mha_master/mha.cnf > /etc/mha_master/manager.log 2>&1 &
[1] 10012
启动成功以后,我们来查看一下 master 节点的状态:
[root@mysql-mha ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:9561) is running(0:PING_OK), master:192.168.37.133
我们的服务已经成功继续了。
10 新节点上线, 故障转换恢复注意事项
1)在生产环境中, 当你的主节点挂了后, 一定要在从节点上做一个备份, 拿着备份文件把主节点手动提升为从节点, 并指明从哪一个日志文件的位置开始复制
2)每一次自动完成转换后, 每一次的(replication health )检测不ok始终都是启动不了必须手动修复主节点, 除非你改配置文件
3)手动修复主节点提升为从节点后, 再次运行检测命令
[root@mysql-mha ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:9561) is running(0:PING_OK), master:192.168.37.133
4)再次运行起来就恢复成功了
[root@mysql-mha ~]# masterha_manager --conf=/etc/mha_master/mha.cnf
学习参考:
https://www.cnblogs.com/keerya/p/7883766.html#_label1_0
https://www.cnblogs.com/winstom/p/11022014.html
http://www.ttlsa.com/mysql/step-one-by-one-deploy-mysql-mha-cluster/