文档首页> Linux命令> 蓝易云cdn:Docker方式创建MySQL8的MGR集群

蓝易云cdn:Docker方式创建MySQL8的MGR集群

发布时间:2026-03-31 00:33       

Docker 搭建 MySQL 8 MGR 集群实战教程 🐳

MySQL Group Replication(MGR)是 MySQL 官方推出的高可用方案,支持多节点同步复制和自动故障转移。借助 Docker 可以快速拉起一套三节点 MGR 集群,非常适合开发测试和架构验证。下面以单主模式(Single-Primary)为例,逐步完成搭建。

一、环境准备 📋

本教程基于 MySQL 8.0.35 镜像,搭建三个节点。先创建专用的 Docker 网络,确保容器之间能通过固定 IP 通信:

docker network create --subnet=172.20.0.0/24 mgr-network
​

三个节点的规划如下:

节点 容器名 IP 端口映射 server-id
主节点 mgr-node1 172.20.0.11 3311:3306 1
从节点 mgr-node2 172.20.0.12 3312:3306 2
从节点 mgr-node3 172.20.0.13 3313:3306 3

二、编写 MySQL 配置文件 ⚙️

MGR 对配置有特定要求,三个节点的配置文件结构相同,仅 server_id、loose-group_replication_local_address 和 report_host 需要按节点修改。以 node1 为例,创建配置文件 node1.cnf:

[mysqld]
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_replica_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
plugin_load_add='group_replication.so'
report_host=172.20.0.11

# MGR 核心配置
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="172.20.0.11:33061"
loose-group_replication_group_seeds="172.20.0.11:33061,172.20.0.12:33061,172.20.0.13:33061"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_single_primary_mode=ON

# 性能相关
transaction_write_set_extraction=XXHASH64
​

将上述内容复制两份,分别命名为 node2.cnf 和 node3.cnf,修改对应的 server_id、report_host 和 local_address 即可。

⚠️ group_replication_group_name 是集群的唯一标识UUID,三个节点必须保持完全一致。可以用 uuidgen 命令生成一个。

三、启动三个容器 🚀

依次启动三个 MySQL 容器:

# 节点1
docker run -d --name mgr-node1 \
  --net mgr-network --ip 172.20.0.11 \
  -p 3311:3306 \
  -v $(pwd)/node1.cnf:/etc/mysql/conf.d/mgr.cnf \
  -e MYSQL_ROOT_PASSWORD=Root@2024 \
  mysql:8.0.35

# 节点2
docker run -d --name mgr-node2 \
  --net mgr-network --ip 172.20.0.12 \
  -p 3312:3306 \
  -v $(pwd)/node2.cnf:/etc/mysql/conf.d/mgr.cnf \
  -e MYSQL_ROOT_PASSWORD=Root@2024 \
  mysql:8.0.35

# 节点3
docker run -d --name mgr-node3 \
  --net mgr-network --ip 172.20.0.13 \
  -p 3313:3306 \
  -v $(pwd)/node3.cnf:/etc/mysql/conf.d/mgr.cnf \
  -e MYSQL_ROOT_PASSWORD=Root@2024 \
  mysql:8.0.35
​

等待约30秒让 MySQL 完成初始化,用 docker logs mgr-node1 确认看到 ready for connections 再继续下一步 ✅。

四、配置复制账户并启动 MGR 🔧

在每个节点上都要执行以下 SQL(三个节点都要做):

docker exec -it mgr-node1 mysql -uroot -p'Root@2024'
​
-- 创建复制专用账户
SET SQL_LOG_BIN=0;
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@2024';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
GRANT CONNECTION_ADMIN ON *.* TO 'repl'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

-- 配置复制通道
CHANGE REPLICATION SOURCE TO SOURCE_USER='repl',
  SOURCE_PASSWORD='Repl@2024'
  FOR CHANNEL 'group_replication_recovery';
​

SET SQL_LOG_BIN=0 的作用是临时关闭 binlog 记录,避免创建用户的语句在各节点之间重复执行产生冲突 💡。

五、引导启动集群 ⚡

仅在 node1 上执行引导操作(只有第一个节点需要 bootstrap):

-- 在 node1 上执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
​

引导完成后,在 node2 和 node3 上分别执行加入集群的命令:

-- 在 node2、node3 上分别执行
START GROUP_REPLICATION;
​

六、验证集群状态 📊

在任意节点上执行以下查询,确认三个成员全部在线:

SELECT 
  MEMBER_ID,
  MEMBER_HOST,
  MEMBER_PORT,
  MEMBER_STATE,
  MEMBER_ROLE 
FROM performance_schema.replication_group_members;
​

正常情况下应看到三行记录,MEMBER_STATE 全部为 ONLINE,其中一个节点的 MEMBER_ROLE 为 PRIMARY,其余两个为 SECONDARY 🎉。

如果某个节点显示 RECOVERING 状态,耐心等待几秒即可。如果长时间停留在该状态,检查复制账户是否在该节点上正确创建、网络是否互通。

可以进一步验证数据同步能力——在 PRIMARY 节点建库建表写数据,然后到 SECONDARY 节点查询,数据应实时同步过来。

七、注意事项 🛡️

MGR 要求所有表必须使用 InnoDB 引擎并且拥有主键,没有主键的表会导致事务在组内无法正常同步。建库建表时务必养成加主键的习惯。

binlog_checksum 在 MySQL 8.0 的 MGR 中必须设置为 NONE,否则组复制插件启动时会报错。

生产环境部署时,三个节点应分布在不同的物理机或可用区上,单机跑三个 Docker 容器仅适用于测试验证。同时建议为数据目录挂载持久化卷(-v),防止容器重建后数据丢失 💪。