蓝易云cdn:Docker方式创建MySQL8的MGR集群
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),防止容器重建后数据丢失 💪。