一、环境准备与网络规划
在单机环境下通过Docker模拟3个节点的MySQL Group Replication (MGR) 集群,我们需要准备Docker环境,并规划容器的网络和端口,以避免冲突。
本次实验的网络与端口规划如下:
节点1 (mgr1):容器IP 172.18.0.2,宿主机映射端口 3301,MGR通信端口 33061
节点2 (mgr2):容器IP 172.18.0.3,宿主机映射端口 3302,MGR通信端口 33061
节点3 (mgr3):容器IP 172.18.0.4,宿主机映射端口 3303,MGR通信端口 33061
二、创建Docker自定义网络
为了让三个MySQL容器能够通过固定的主机名相互通信,我们需要创建一个自定义的bridge网络。
docker network create --subnet=172.18.0.0/16 mgr-net
三、准备配置文件与数据目录
在宿主机上为每个节点创建配置文件目录和数据目录。
mkdir -p /data/mgr1/conf /data/mgr1/data mkdir -p /data/mgr2/conf /data/mgr2/data mkdir -p /data/mgr3/conf /data/mgr3/data
接下来为每个节点编写 my.cnf 配置文件。以下是节点1的配置,请将其保存在 /data/mgr1/conf/my.cnf:
[mysqld] server_id=1 log_bin=mysql-bin binlog_format=ROW binlog_checksum=NONE gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE transaction_write_set_extraction=XXHASH64 group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" group_replication_start_on_boot=OFF group_replication_local_address="mgr1:33061" group_replication_group_seeds="mgr1:33061,mgr2:33061,mgr3:33061" group_replication_bootstrap_group=OFF
节点2和节点3的配置与此类似,分别保存在对应的 conf 目录下,只需修改以下两项参数:
节点2:
server_id=2,group_replication_local_address="mgr2:33061"节点3:
server_id=3,group_replication_local_address="mgr3:33061"
四、启动MySQL容器
分别启动三个MySQL容器,将配置文件和数据目录挂载进去,并指定IP、主机名和端口映射。此处使用 MySQL 8.0 镜像。
docker run -d --name mgr1 --net=mgr-net --ip=172.18.0.2 -p 3301:3306 -v /data/mgr1/conf:/etc/mysql/conf.d -v /data/mgr1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:8.0 docker run -d --name mgr2 --net=mgr-net --ip=172.18.0.3 -p 3302:3306 -v /data/mgr2/conf:/etc/mysql/conf.d -v /data/mgr2/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:8.0 docker run -d --name mgr3 --net=mgr-net --ip=172.18.0.4 -p 3303:3306 -v /data/mgr3/conf:/etc/mysql/conf.d -v /data/mgr3/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:8.0
五、初始化MGR集群
首先,我们需要在主节点 (mgr1) 上进行初始化操作。进入mgr1容器的MySQL命令行:
docker exec -it mgr1 mysql -uroot -proot
在mgr1的MySQL命令行中执行以下SQL,创建复制用户并启动MGR引导:
SET SQL_LOG_BIN=0; CREATE USER repl@'%' IDENTIFIED WITH mysql_native_password BY 'repl'; GRANT REPLICATION SLAVE ON *.* TO repl@'%'; FLUSH PRIVILEGES; SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery'; INSTALL PLUGIN group_replication SONAME 'group_replication.so'; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
接着,分别进入从节点 (mgr2 和 mgr3) 容器的MySQL命令行:
docker exec -it mgr2 mysql -uroot -proot
在mgr2和mgr3的MySQL命令行中执行以下SQL,加入集群(注意不要执行引导命令):
SET SQL_LOG_BIN=0; CREATE USER repl@'%' IDENTIFIED WITH mysql_native_password BY 'repl'; GRANT REPLICATION SLAVE ON *.* TO repl@'%'; FLUSH PRIVILEGES; SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery'; INSTALL PLUGIN group_replication SONAME 'group_replication.so'; START GROUP_REPLICATION;
六、验证集群状态与数据同步
在任意节点的MySQL命令行中执行以下SQL,查看集群成员状态:
SELECT * FROM performance_schema.replication_group_members;
如果三个节点的 MEMBER_STATE 都为 ONLINE,则说明集群搭建成功。
我们还可以在主节点创建数据库和表来测试同步。如果你想通过宿主机命令行快速导入SQL文件进行测试,可以使用如下重定向方式(注意小于号需要转义):
docker exec -i mgr1 mysql -uroot -proot < /path/to/your/test.sql
通过上述步骤,你就可以在单台服务器上利用Docker快速搭建一个3节点的MySQL MGR集群,非常适合用于本地开发与架构测试验证。