MySQL MHA 安装配置与验证

[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/

你可能感兴趣的:(MySQL MHA 安装配置与验证)