1. MHA
MHA数据高可用集群,是一套优秀的作为MySQL高可用性环境下故障切换主从的软件,在故障切换过程中,MHA 能够做到 在 30s自动完成数据的高可用的故障切换,并在切换的过程中最大程度的保证数据的一致性,以达到真正意义上的高可用。
2. MHA 特点
1) 实现MySQL故障转移
2)保证数据的一致性
3. MHA 的工作流程
1)把宕机的master二进制日志保存下来。
2)找到binlog位置点最新的slave。
3)在binlog位置点最新的slave上用relay log(差异日志)修复其它slave。
4)将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上。
5)将含有最新位置点binlog所在的slave提升为master。
6)将其它slave重新指向新提升的master,并开启主从复制。
- 当监控的集群中的主MySQL宕机后,会尝试获取主库中的二进制文件,获取到之后,找到已经同步最新数据的从库,将把该从库的中继日志同步给其他的从库,来同步数据,保证从库之间的一致性,之后再从库中找到一台,作为新的主库,同步获取到的二进制文件,其余的从库从这个新的主库中同步数据,保证主从服务的群集正常的工作
4. MHA 组成
- 该软件由两部分组成:
- MHA Manager (管理节点):
- 管理节点可以单独部署在一台独立的机器上,管理多个 master-slave 集群,也可以部署在一台 slave 节点上
- MHA Node (数据节点):
- MHA Node 运行在每台MySQL服务器上 ,管理节点,会定时探测集群中master 接地那,当master出现故障时,他可以自动将最新数据的slave 提升为新的 master, 然后将所有其他的slave 重新指向 master
- MHA Manager (管理节点):
1) Manager 工具包
工具 | 作用 |
---|---|
masterha_check_ssh | 检查MHA的SSH配置状况 |
masterha_check_repl | 检查MySQL复制状况 |
masterha_manger | 启动MHA |
masterha_check_status | 检测当前MHA 运行状态 |
masterha_master_monitor | 检测master是否宕机 |
masterha_master_switch | 监控故障转移(自动或者手动) |
masterha_conf_host | 添加或是删除配置的 server信息 |
2) Node 工具包
工具 | 作用 |
---|---|
save_binary_logs | 保存和复制master的二进制日志 |
apply_diff_relay_logs | 识别差异的中继日志事件并将其差异的事件应用于其他的slave |
filter_mysqlbinlog | 去除不必要的 ROLLBACK 事件(MHA已不再使用) |
purge_relay_logs | 清除中继日志(不会阻塞SQL线程) |
5. MHA 工作原理
1) 从宕机崩溃的 master 保存二进制日志时间(binlog events)
2) 识别含有最新数据的slave;
3) 应用差异的中继日志(relay log) 到其他的slave
4) 提升一个 slave 为新的master;
4) 应用从 master 保存的二进制,移交给 最新的slave
6) 使其他的slave 连接新的master 进行复制
6. 部署一主两从MySQL
6.1 Master 配置
- Master 创建授权用户
mysql> GRANT ALL ON *.* TO 'slave'@'%' IDENTIFIED BY '123.cim';
Query OK, 0 rows affected (0.00 sec)
- Master 开启二进制日志文件
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id = 1
log-bin=master-bin
log-slave-updates=true
- 重启服务
systemctl restart mysqld
6.2 Slave-1 配置
- 开启中继日志与 二进制日志 Slave-1
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=2
log-bin=master-bin
log-slave-updates=true
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
read_only=1
relay-log-purge=0
- 重启服务
systemctl restart mysqld
6.3 Slave-2 配置
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=3
log-bin=master-bin
log-slave-updates=true
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
read_only=1
relay-log-purge=0
- 重启服务
systemctl restart mysqld