一、工作原理
MHA工作原理总结为以下几条:
(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);
(2) 识别含有最新更新的 slave ;
(3) 应用差异的中继日志(relay log) 到其他 slave ;
(4) 应用从 master 保存的二进制日志事件(binlog events);
(5) 通过Manager控制器提升一个 slave 为新 master ;
(6) 使用其他的 slave 连接新的 master 进行复制。
二、实现过程
MHA 对 MYSQL 复制环境有特殊要求,例如各节点都要开启二进制日志及中继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等,这里对配置做事先说明。
机器名称 | IP配置 | 服务角色 | 备注 |
Manager | 10.0.0.44 | Manager控制器 | 用于监控管理 |
Master | 10.0.0.41 | 数据库主服务器 | 开启bin-log relay-log 关闭relay_log_purge |
Master | 10.0.0.42 | 数据库从服务器 | 开启bin-log relay-log 关闭relay_log_purge |
Master | 10.0.0.43 | 数据库从服务器 | 开启bin-log relay-log 关闭relay_log_purge |
1.首先配置master
[root@ master ~]# vim /etc/my.cnf
server-id=1 //复制集群中的各节点的id均必须唯一
log-bin=mysql-bin //开启二进制日志
skip-name-resolve //关闭名称解析(非必须)
relay-log=mysql-relay //开启中继日志
[root@ master ~]# systemctl restart mariadb
2.配置从
[root@ slave1 ~]# vim /etc/my.cnf
[mysqld]
server-id = 2 //复制集群中的各节点的id均必须唯一;
relay-log = relay-log //开启中继日志
log-bin =mysql-log //开启二进制日志
read_only = ON //启用只读属性(非必须)
relay_log_purge = 0 //是否自动清空不再需要中继日志(非必须)
skip_name_resolve //关闭名称解析(非必须)
log_slave_updates = 1 //使得更新的数据写进二进制日志中
[root@ slave1 ~]# systemctl restart mariadb
3.配置一主多从架构
master节点:
grant all on *.* to 'zjs'@'%' identified by '123';
flush privileges;
show master status;
两台slave节点:
change master to master_host='10.0.0.41',
-> master_user='zjs',
-> master_password='123',
-> master_log_file='mysql-bin.000004',
-> master_log_pos=451;
start slave;
show slave status \G;
三、安装配置MHA高可用
1.在所有 Mysql 节点授权拥有管理权限的用户可在本地网络中有其他节点上远程访问。 当然, 此时仅需要且只能在 master 节点运行类似如下 SQL 语句即可,为MHA专门创建一个管理用户, 方便以后使用, 三个节点自动同步。
grant all on *.* to 'mha'@'%' identified by '123';
flush privileges;
2.配置ssh互通环境,是四台主机互相都能够免密
3.安装MHA包
manager节点需要多安装一个包
四个节点都需安装:mha4mysql-node-0.56-0.el6.norch.rpm
Manager 节点另需要安装:mha4mysql-manager-0.56-0.el6.noarch.rpm
rpm易出错 可使用yum安装
定义MHA配置文件
manager节点:
mkdir /etc/mha_master
vim /etc/mha_master/mha.cnf
配置文件
[server default] //适用于server1,2,3个server的配置
user=mha //mha管理用户,每台数据库都得有
password=123 //mha管理密码
manager_workdir=/etc/mha_master/app1 //mha_master自己的工作路径
manager_log=/etc/mha_master/manager.log // mha_master自己的日志文件
remote_workdir=/mydata/mha_master/app1 //每个远程主机的工作目录在何处
ssh_user=root // 基于ssh的密钥认证
repl_user=zjs //数据库用户名,做主从的用户
repl_password=123 //数据库密码
ping_interval=1 //ping间隔时长
[server1] //节点1 master
hostname=10.0.0.41 //节点1主机地址
ssh_port=22 //节点1的ssh端口
candidate_master=1 //将来可不可以成为master候选节点/主节点
[server2] //节点2 slave
hostname=10.0.0.42
ssh_port=22
candidate_master=1
[server3] //节点3 slave
hostname=10.0.0.43
ssh_port=22
candidate_master=1
4.对四个节点进行检测
检测各节点ssh通信是否ok
masterha_check_ssh -conf=/etc/mha_master/mha.cnf
5.启动MHA
在manager节点执行:
nohup masterha_manager -conf=/etc/mha_master/app1.cnf &> /etc/mha_master/manager.log &
[1] 17781
6.测试MHA故障转移
关闭master,模拟主节点宕机
systemctl stop mariadb
rm -rf /var/lib/mysql/*
在manager节点,查看状态
masterha_check_status -conf=/etc/mha_master/mha.cnf
mha is stopped(2:NOT_RUNNING).