MySQL MHA 高可用集群搭建

MySQL MHA 高可用集群搭建

架构概述与环境准备

架构核心目标

MHA(Master High Availability)是 MySQL 高可用解决方案,通过监控主库状态、自动 / 手动故障切换,实现主库故障时快速切换到候选主库,保障业务连续性。本方案中 Master 节点同时承担 MHA Manager 角色,减少服务器资源占用,架构包含 3 台物理机 + 1 个虚拟 IP(VIP)

服务器角色与软件基础

  • 源码编译好的mysql8.0.40
    https://blog.csdn.***/racwwt/article/details/151259281
服务器角色 主机名 IP 地址 核心作用
MySQL 主库 + MHA Manager(管理节点) master 192.168.2.102 负责写操作,同步 binlog 到从库,监控主库、执行故障转移
MySQL 从库 1(候选主库) node1 192.168.2.104 读操作,主库故障后升新主库
MySQL 从库 2 node2 192.168.2.105 读操作,仅作为备用从库
虚拟 IP(VIP) - 192.168.2.100 应用连接 MySQL 的统一入口

环境前提

  1. 操作系统与软件版本:CentOS 7.x + MySQL 8.0.40
  2. 关闭防火墙与 SE Linux
# 关闭防火墙(永久)
systemctl stop firewalld && systemctl disable firewalld
# 关闭 SE Linux(永久,需重启生效,临时关闭用 setenforce 0)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  1. 配置主机名与 hosts 解析
# 各节点设置主机名(分别执行)
hostnamectl set-hostname master  # master 节点
hostnamectl set-hostname node1   # node1 节点
hostnamectl set-hostname node2   # node2 节点
# 所有节点添加 hosts 解析(/etc/hosts)
cat /etc/hosts 
192.168.2.102 master
192.168.2.104 node1
192.168.2.105 node2
  1. 确保 MySQL 服务正常:所有节点已安装 MySQL,且能通过 /etc/init.d/mysqld start 启动

配置任务总览

  1. 搭建正常的 MySQL 一主多从复制(GTID 模式)
  2. 配置所有服务器间的 SSH 免密通信
  3. 验证主从复制与免密通信后,安装并启动 MHA
  4. 测试 MHA 手动与自动故障切换功能
  5. 配置 VIP 漂移,保障应用访问透明化

一、搭建 MySQL 主从复制(GTID 模式)

MHA 依赖 MySQL 主从复制实现数据同步,推荐使用 GTID 模式(无需手动指定 binlog 文件名和位置,故障切换更高效),步骤如下:

1 主库(master:192.168.2.102)配置

编辑 MySQL 配置文件 /etc/my.***f,启用 GTID、binlog 等核心参数

[root@master ~]# vim /etc/my.***f
[mysqld]
datadir=/data/mysql          # 数据存储目录(需提前创建:mkdir -p /data/mysql)
socket=/data/mysql/mysql.sock # Socket 文件路径
server_id=102                # 唯一标识(建议与 IP 最后一段一致,避免冲突)
gtid-mode=on                 # 开启 GTID 复制模式
enforce-gtid-consistency=true # 强制 GTID 事务一致性
log-bin=binlog               # 启用二进制日志(主从复制核心)
relay-log=relay-log          # 启用中继日志(主库降级为从库时需用)
relay_log_purge=0            # 禁止自动删除中继日志(故障时补全数据)
log-slave-updates=true       # 从库同步的事务记录到 binlog(支持级联复制)
[root@master ~]# /etc/init.d/mysqld start
Starting MySQL. SU***ESS! 

2 从库(node1、node2)配置

从节点需启用只读模式(read_only=1),避免直接写操作,配置与主节点类似但需修改 server_id。

[root@node1 ~]# vim /etc/my.***f
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=104
gtid-mode=on
enforce-gtid-consistency=true
log-bin=binlog
relay-log=relay-log
relay_log_purge=0
read_only=1				#从库设为只读(避免误写,升主后会自动取消)
log-slave-updates=true
[root@node1 ~]# /etc/init.d/mysqld start
Starting MySQL. SU***ESS! 

[root@node2 ~]# vim /etc/my.***f
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=105
gtid-mode=on
enforce-gtid-consistency=true
log-bin=binlog
relay-log=relay-log
relay_log_purge=0
read_only=1
log-slave-updates=true
[root@node2 ~]# /etc/init.d/mysqld start
Starting MySQL. SU***ESS! 

3 配置一主多从复制架构:

MHA 仅支持 mysql_native_password 认证插件,需明确指定:

3.1 主库(master)创建账号(复制账号 + MHA 管理账号)

# 1. 创建主从复制账号 rep(所有从库用该账号同步数据)
mysql> create user 'rep'@'%' identified WITH mysql_native_password  by '123';
mysql> grant  replication slave on *.* to 'rep'@'%';	# 仅复制权限
#2. 创建 MHA 管理账号 mhaadm(高权限,用于 MHA 操作集群)
mysql> create user 'mhaadm'@'%' identified WITH mysql_native_password  by '123';
mysql> grant  all on *.* to 'rep'@'%';
# 刷新权限
mysql> FLUSH PRIVILEGES;

3.2 从库(node1、node2)配置同步主库

MySQL 8.0 用 CHANGE REPLICATION SOURCE(5.7 用 CHANGE MASTER TO),步骤如下

# 配置同步源为 master(192.168.2.102)
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.2.102',		# 主库 IP
SOURCE_USER='rep',					# 复制账号
SOURCE_PASSWORD='123',				# 复制密码
master_auto_position=1,				# 启用 GTID 自动定位(无需指定 binlog 位置)
SOURCE_SSL=1; 						# 启用 SSL
mysql> start replica;
# 验证复制状态(核心:IO 和 SQL 线程均为 Yes)
mysql> show replica status \G
# 关键输出:
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
# 查看从库列表(主库执行可看到所有从库)
mysql> show replicas;
+-----------+------+------+-----------+--------------------------------------+
| Server_Id | Host | Port | Source_Id | Replica_UUID                         |
+-----------+------+------+-----------+--------------------------------------+
|       105 |      | 3306 |       102 | 85aa2339-87e8-11f0-b63e-000c29d446f1 |
|       104 |      | 3306 |       102 | 85aa2339-87e8-11f0-b63e-000c29d446f2 |
+-----------+------+------+-----------+--------------------------------------+
2 rows in set (0.00 sec)

二、配置服务器间免密 SSH 通信

MHA 依赖 SSH 免密登录实现跨节点操作(如复制 binlog、执行切换命令),需确保 所有节点(master、node1、node2)间 root 用户免密互通。

1. 所有节点生成 SSH 密钥对

在 master、node1、node2 分别执行以下命令(无需输入密码,直接回车)

ssh-keygen -f /root/.ssh/id_rsa -P '' -q

2. 汇总公钥到 master(MHA Manager 节点)

将所有节点的公钥复制到 master 的 authorized_keys 文件,实现公钥统一:

#汇总公
转载请说明出处内容投诉
CSS教程网 » MySQL MHA 高可用集群搭建

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买