mysql-高可用架构MHA

[mysql-高可用架构:MHA]

mysql-高可用架构:MHA

1. MHA简介

MHA(Master High Availability)是由日本人yoshinorim开发的一款成熟且开源的MySQL高可用程序,它实现了MySQL主从环境下MASTER宕机后能够自动进行单次故障转移的功能,其本身由perl语言编写,安装方便使用简单。

该软件由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。MHA Manager 可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。MHA Node 运行在每台 MySQL 服务器上,MHA Manager 会定时探测集群中的 master 节点,当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master,然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。

1.1 MHA 工作流程

以下是MHA的工作流程,Manager节点通过masterha_manager脚本启动MHA后会先进行检查工作:

  • Manager节点通过masterha_check_ssh脚本检查各节点的互信配置
  • Manager节点通过masterha_check_repl脚本检查主从之间的复制情况

检查工作均完成且确认无误后,Manager节点会进行监控工作:

  • Manager节点通过masterha_master_monitor对主库不断的进行心跳检测,主库3次无响应后会认为其以宕机

当主库宕机后,会开始故障转移工作,首先会对SLAVE进行选主,有以下3种算法:

  • 读取Manager配置文件,判断是否有强制选主的Slave
  • 自动判断目前已有从库的日志量,将最接近主库日志量的从库选为新的主库
  • 根据配置文件中先后顺序进行选主

当选主完成后,Manager节点会再次通过SSH链接已宕机主库,有以下2种情况发生:

  • 已宕机主库的SSH能够链接,表明MySQL服务是由逻辑因素所导致的宕机,此时Manager会通过save_binary_logs脚本,计算各个从库(包括新主库)与已宕机主库之间binlog差异,将已宕机主库的binlog位置找出来并进行截取、分发到各个从库上进行数据对齐,确保数据一致性
  • 已宕机主库的SSH不能链接,表明MySQL服务是由物理因素所导致的宕机,此时Manager会通过apply_diff_relay_logs脚本,计算各个从库relay-log的差异,将差异较大的从库与新主库进行relay-log对齐,确保数据一致性

当所有库的数据一致性被确保之后,所有从库都将会与新主库建立主从关系,同时旧的已宕机主库信息将会从Manager项目配置文件中移除,至此整个MHA软件服务结束,Manager不会再对Node进行管理,接下来需要管理员手动对已宕机主库进行排查恢复,并且手动搭建旧主库与新主库之间的主从关系然后重新启动整个MHA服务。

MHA高可用架构 - 知乎 (zhihu.com)

2. MHA实操配置

2.1 环境配置

本次所用主机系统版本均为centos7,mysql版本为5.7.37

服务列表 IP地址
mysql主节点(Master) 192.168.80.20
mysql从节点1 192.168.80.25
mysql从节点2 192.168.80.30
MHA Manager 192.168.80.35

2.2 搭建步骤

1.首先关闭所有虚拟机的防火墙与SElinux。

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

2.配置主机名

为方便操作时区分各个主机,分别设置Master,Slaver1,Slaver2节点主机名称为mysql_master,mysql_slaver1,mysql_slaver2.

hostnamectl set-hostname mysql_master
hostnamectl set-hostname mysql_slaver1
hostnamectl set-hostname mysql_slaver2

su

3.修改 Master、Slaver1、Slaver2 节点的 Mysql主配置文件/etc/my.cnf,配置主从同步。

##Master 节点##
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true

systemctl restart mysqld

##Slave1、Slave2 节点##
vim /etc/my.cnf
server-id = 2 / 3						#三台服务器的 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

systemctl restart mysqld

4.在 Master、Slave1、Slave2 节点上都创建两个软链接

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

5.配置 mysql 一主两从

(1)权限配置

mysql -uroot -pabc123
grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '123';		#从数据库同步使用
grant all privileges on *.* to 'mha'@'192.168.80.%' identified by 'manager';		#manager 使用

grant all privileges on *.* to 'mha'@'mysql_master' identified by 'manager';				#防止从库通过主机名连接不上主库
grant all privileges on *.* to 'mha'@'mysql_slaver1' identified by 'manager';
grant all privileges on *.* to 'mha'@'mysql_slaver2' identified by 'manager';
flush privileges;

(2)在 Master 节点查看二进制文件和同步点

##Master 节点##
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1765 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

(3)在 Slave1、Slave2 节点执行同步操作

(3)在 Slave1、Slave2 节点执行同步操作,注意log_pos需要与主的查询一致
change master to master_host='192.168.80.20',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1765;  

start slave;

(4)在 Slave1、Slave2 节点查看数据同步结果

show slave status\G		
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

(5) Slave1、Slave2开启只读模式。

set global read_only=1;

(6)插入数据测试数据库同步

##在 Master 主库插入条数据,测试是否同步##
create database canyun_db;
use canyun_db;
create table test(id int);

你可能感兴趣的:(mysql,架构,数据库)