前面介绍了MHA的概念,下面要介绍的MHA的搭建及故障切换的具体操作。
系统:centos7.6
数据库:5.5.60-MariaDB
MHA软件版本:mha4mysql-manager-0.56 mha4mysql-node-0.56
master 192.168.92.139
slave1 192.168.92.140
slave2 192.168.92.144
manager 192.168.92.144
需要所有节点安装
<1>安装epel源
yum -y install epel-release
<2>安装依赖包
yum -y install prel perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-IO-Socket-SSL
既可yum安装也可编译安装,并且还可安装mariadb。要根据需求选择。
本文为了方便,直接使用yum安装mariadb。
需要在master及slave节点安装相同版本的数据库。
<1>mariadb安装
yum -y install mariadb*
<1>下载安装包
下载后,将安装包上传到相应服务器
下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
<2>安装node
每台被监控的节点都需安装
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
<2>安装manager
可单独部署在一台独立机器上,也可以部署在一台slave节点上。可用于管理多个master/slave集群, 每个master/slave集群称作一个application
在manager节点上要先安装mha4mysql-node再安装manager,可避免依赖mha4mysql-node导致的问题
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
为了方便操作,便于观察,可以更改主机名和添加解析(可跳过)
vim /etc/hostname 改主机名,每台皆如此
vim /etc/hosts 添加解析
scp /etc/hosts IP:/etc/hosts 将解析推送到其他所有服务器
<1>在每台执行,实现时间同步
yum -y install ntp
ntpdate cn.pool.ntp.org
每台服务器间都要进行密钥的创建及公钥的推送
<1>创建密钥
ssh-keygen
<2>将本机的公钥复制到远程机器的authorized_keys文件中
ssh-copy-id 192.168.92.139
ssh-copy-id 192.168.92.140
ssh-copy-id 192.168.92.144
各节点都要开启二进制日志及中继日志, 各从节点必须显示启用其read-only属性
<1>master节点配置文件
[mysqld]
server-id = 1 #复制集群中的各节点的id均必须唯一
log-bin = master-log
relay-log = relay-log
skip_name_resolve = ON #禁止mysql域名解析
<2>slave节点配置文件
vim /etc/my.cnf
[mysqld]
server-id = 2 #各节点的id均必须唯一
relay-log = relay-log
log-bin = master-log
read_only = 1 #只读模式
relay_log_purge = 0 #自动清空不再需要的中继日志
skip_name_resolve = ON #禁止mysql域名解析
<3>启动mariadb
systemctl start mariadb
mysql权限设置,可参考下列链接:
https://blog.csdn.net/GX_1_11_real/article/details/81200566
<1>master节点授权
在每个节点上执行。因为MHA可以切换主从,代表着每个从库都有切换为主库的可能,所以下面的授权,要在每个节点上执行。
格式:grant replication slave on *.* to ‘slave’@‘从库的IP’ identified by ‘密码’;
grant replication slave,replication client on *.* to 'slave'@'192.168.92.%' identified by 'centos';
#创建用于同步的用户并授权
flush privileges; #刷新权限;
show master status; #查看master现在的状态,显示的file名字及position位置编号;
<2>所有从库指向主库
在每个从库上执行
格式:change master to master_host = ‘主库的IP’, master_user = ‘设置主从时设定的主库的用户’, master_port=主库的端口, master_password=’主库设定的密码’, master_log_file = ‘主库状态的File’, master_log_pos=主库状态的Position;
change master to master_host='192.168.92.139',master_user='slave',master_password='centos',master_log_file='master-log.000007',master_log_pos=245;
#连接指定的主库
start slave; #开启从库
show slave status \G; #查看从库状态
注意:如下即为成功,如其中任意一个不为Yes即为失败。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在每个节点上执行,允许所有其他节点可远程访问
grant all on *.* to 'MHA'@'192.168.%' identified by 'mhatest';
要在mysql的主节点上配置,并创建相应目录及文件
可为每个application,创建相应配置文件,用于管理多个集群
<1>仅在manager节点上创建目录
作为工作目录,存放配置文件及日志
mkdir /etc/mha_master
<2>在所有node节点上创建目录
用于存放日志及二进制文件
mkdir /mydata/mha_master/mha01
<3>编写MHA配置文件
在下方会利用到前几步的授权信息及创建的目录
vim /etc/mha_master/mha01.cnf
[server default]
user=MHA #MHA管理用户
password=mhatest #MHA管理密码
manager_workdir=/etc/mha_master/mha01 #mha_master的工作目录
manager_log=/etc/mha_master/manager.log #mha_master的日志文件
remote_workdir=/mydata/mha_master/mha01 #每个远程主机的工作目录
ssh_user=root #基于ssh秘钥认证的用户
repl_user=slave #数据库用户名
repl_password=centos #数据库密码
ping_interval=1 #ping间隔时长,s为单位
[server1] #节点1
hostname=192.168.92.139 #节点1的主机ip,通常为主库IP
ssh_port=22 #节点1 的ssh端口
candidate_master=1 #将来可作为master候选主节点
[server2] #节点2
hostname=192.168.92.140 #节点2的主机ip,通常为备用主库IP
ssh_port=22 #节点2的ssh端口
candidate_master=1 #将来可作为master候选主节点
[server3] #节点3
hostname=192.168.92.144 #节点3的主机ip,通常为从库IP
ssh_port=22 #节点3的ssh端口
candidate_master=1 #将来可作为master候选主节点
<1>检测各节点ssh互相是否成功
masterha_check_ssh -conf=/etc/mha_master/mha01.cnf
如不成功,请再次进行互信操作
<2>检查数据库是否可成功的连接
masterha_check_repl -conf=/etc/mha_master/mha01.cnf
如不成功,请将MHA授权及master节点授权操作在每个数据库中执行,并检测MHA配置文件中的数据库连接的用户名及密码
仅在manager节点上执行
<1>后台启动MHA
nohup masterha_manager -conf=/etc/mha_master/mha01.cnf &> /etc/mha_master/manager.log &
<2>查看master的状态
masterha_check_status -conf=/etc/mha_master/mha01.cnf
<3>停止MHA操作
如需要停止MHA,可使用如下命令或kill后台进程
masterha_stop -conf=/etc/mha_master/mha01.cnf
启动MHA后,模拟主库故障,进行转移
<1>主库故障
进入master节点执行
pkill -9 mysql
<2>查看MHA状态
masterha_check_status -conf=/etc/mha_master/mha01.cnf
<3>查看MHA配置文件中的节点2的数据库
<4>查看MHA配置文件中的节点3的数据库
<5>查看MHA的manager节点的日志
结论:节点3的数据库的主库自动切换为了节点2的数据库
在这里实际上有两个方法:
恢复原主库后将其变为新主库的从库
或恢复原主库后,利用MHA将主库手动切换回原主库
<1>使用原主库的数据库备份对原主库进行恢复
例如:
mysql -uroot -p‘…’ database -f < /tmp/mysql.bask.sql
也可参考下列链接:
https://blog.csdn.net/GX_1_11_real/article/details/82427205
<2>修改原主库的配置文件
按照slave节点配置文件操作修改
vim /etc/my.cnf
[mysqld]
server-id = 4 #保证各节点的id均必须唯一
relay-log = relay-log
log-bin = master-log
read_only = 1 #只读模式
relay_log_purge = 0 #自动清空不再需要的中继日志
skip_name_resolve = ON #禁止mysql域名解析
<3>将原主库切为新主库的从库
(1)查看新主库
show master status;
(2)进入原主库再次授权
(此操作是为了避免MHA测试时,不成功)
grant replication slave,replication client on *.* to 'slave'@'192.168.92.%' identified by 'centos';
grant all on *.* to 'MHA'@'192.168.%' identified by 'mhatest';
(3)进入原主库中指向新主库
change master to master_host='192.168.92.140',master_user='slave',master_password='centos',master_log_file='master-log.000009',master_log_pos=517;
start slave;
show slave status\G;
<4>MHA配置文件调整
<5>启动MHA并检测状态
启动MHA前,应先进行检测,并将mha_master的工作目录中文件删除,否则当新主库故障时,MHA无法再次进行切换。
(1)将mha_master的工作目录中文件删除
cd /etc/mha_master/mha01/
rm -rf *
(2)启动MHA
nohup masterha_manager -conf=/etc/mha_master/mha01.cnf &> /etc/mha_master/manager.log &
masterha_check_status -conf=/etc/mha_master/mha01.cnf
现在已经将原主库切为了新主库的从库,并启动MHA了。
如无需将主库切为原主库,可跳过
注意:
手动在线切换,切换时需要将运行的MHA停掉后才能切换
切换的时间长短是由recover时的relay日志的大小决定的
命令参数:
--conf 使用的配置文件
--new_master_host 切换后的ip
--new_master_port 切换后的端口
--orig_master_is_new_slave 将原master变为slave节点
--running_updates_limit=10000 延迟在此时间范围内都可切换(单位为s)
<1>在线切换
下列命令在manager节点执行,遇到询问直接输入yes
masterha_stop -conf=/etc/mha_master/mha01.cnf
masterha_master_switch --conf=/etc/mha_master/mha01.cnf --master_state=alive --new_master_host=192.168.92.139 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
(2)查看其他节点的主从状态