环境信息

节点 主机名 IP OS
n1 n1 192.168.209.19 Rockylinux 9.6
n2 n2 192.168.209.20 Rockylinux 9.6
n3 n3 192.168.209.21 Rockylinux 9.6

MySQL 版本:8.0.43
端口:3306
Group Communication 端口:33061

1. 安装 MySQL

执行 MySQL 安装脚本。

2. 配置 MySQL 配置文件 /etc/my.cnf

在每台节点添加 MGR 配置(唯一的 server_id,其他参数相同):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
每个节点唯一ID,n1=19, n2=20, n3=21

server_id=19

# 开启二进制日志,MGR必须开启

log_bin=binlog

# 行级复制,保证数据一致性,MGR推荐

binlog_format=ROW

# 开启 GTID,全局事务唯一标识

gtid_mode=ON

# 强制事务符合 GTID 复制要求,MGR必须开启

enforce_gtid_consistency=ON

# 复制元数据存储在表中,而非文件

master_info_repository=TABLE
relay_log_info_repository=TABLE

# MGR 提取事务变更集合的方法,官方推荐 XXHASH64

transaction_write_set_extraction=XXHASH64

# Group Replication 集群唯一标识

loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"

# MySQL 启动时不自动加入组,需要手动 START GROUP_REPLICATION

loose-group_replication_start_on_boot=OFF

# 本节点GCS通信地址(必须是本机可访问IP+端口)

loose-group_replication_local_address="192.168.209.19:33061"

# 集群种子节点(所有节点IP:端口),用于发现集群成员

loose-group_replication_group_seeds="192.168.209.19:33061,192.168.209.20:33061,192.168.209.21:33061"

# 引导PRIMARY节点专用变量,配置文件中不必开启

loose-group_replication_bootstrap_group=OFF

# 单主模式,集群只有一个PRIMARY

loose-group_replication_single_primary_mode=ON

# 多主模式冲突检查,单主模式下关闭即可

loose-group_replication_enforce_update_everywhere_checks=OFF

# 加载Group Replication插件

plugin_load_add='group_replication.so'

注意:

  • 每台节点 server_id 唯一

  • group_replication_local_address 必须是本机 IP

  • group_replication_group_seeds 所有节点都一致

3. 创建 MGR 复制账号(在 PRIMARY 节点 n1 执行)

为了避免 empty username 和 caching_sha2_password 问题,使用 mysql_native_password

1
2
3
create user if not exists 'repl'@'%' identified with mysql_native_password by 'Aa123qwe';
grant replication slave, replication client on *.* to 'repl'@'%';
flush privileges;

4. 启动组复制

4.1 PRIMARY 节点(n1)首次启动

1
2
3
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;

4.2 SECONDARY 节点(n2、n3)

  • 清理旧残留状态(如果之前尝试过加入)
1
2
stop group_replication;
reset slave all for channel 'group_replication_recovery';
  • 配置恢复通道账号
1
2
3
4
change replication source to
source_user='repl',
source_password='Aa123qwe'
for channel 'group_replication_recovery';

注: 必须与 PRIMARY 上创建的账号一致

  • 启动组复制
1
start group_replication;
  • 验证集群状态
1
2
select member_host, member_state, member_role
from performance_schema.replication_group_members;
  • 预期输出
1
2
3
4
5
6
7
+--------------+--------------+-------------+
| member_host | member_state | member_role |
+--------------+--------------+-------------+
| n1 | ONLINE | PRIMARY |
| n2 | ONLINE | SECONDARY |
| n3 | ONLINE | SECONDARY |
+--------------+--------------+-------------+

5. MGR 单主模式

5.1 简介

  • loose-group_replication_single_primary_mode=ON

    说明集群 最多只有一个 PRIMARY,其他节点都是 SECONDARY。

  • PRIMARY 节点负责写操作,SECONDARY 只能读(默认 super_read_only=ON)。

  • 当 PRIMARY 出现故障或下线,MGR 会自动选择新的 PRIMARY。

5.2 新主选举触发条件

PRIMARY 节点下线或故障,包括:

  • MySQL 进程 crash 或关闭。

  • 节点网络隔离(无法与多数节点通信)。

  • 手动停止 PRIMARY 的 START/STOP GROUP_REPLICATION

  • PRIMARY 超时没心跳,认为死亡。

5.3 选主流程总结

假设 n1 是 PRIMARY,下线后:

  • n2、n3 发现 n1 超过超时时间未响应。

  • 两个节点开始投票:

    • 检查 GTID,选择已执行事务最多的节点。

    • 如果 GTID 相同,server_id 小的胜出。

  • 选举结果生成,新的 PRIMARY 节点切换完成。

  • 新 PRIMARY 开始允许写操作,SECONDARY 继续只读。

错误记录

  1. 主机名配置错误:完全按教程做,没发现教程的错误有 2 个 n2

  2. SELinux 未关闭:需要关闭 SELinux 或配置相应策略

  3. 旧主恢复问题:模拟主从选取时,旧主没有配置恢复通道账号

1
2
3
4
5
-- 在重新加入集群前需要配置恢复通道
change replication source to
source_user='repl',
source_password='Aa123qwe'
for channel 'group_replication_recovery';