一、引言
在企业级应用中,MySQL 数据库的高可用是保障业务稳定运行的核心需求。MySQL Group Replication(简称 MGR)作为官方推荐的高可用解决方案,支持多主模式和单主模式,能实现数据实时同步与故障自动切换。本文将详细介绍如何基于 3 台服务器搭建 MGR 集群,结合 MySQL Shell 快速部署集群,并通过 MySQL Router 实现集群访问入口的统一管理,全程附带实操命令与配置说明,适用于运维人员和数据库工程师参考。
二、部署架构介绍
本次 MGR 集群部署采用 3 台物理机(或虚拟机),整体架构如下:
- 核心组件:3 台服务器(IP 分别为 192.168.184.151、184.152、184.153)各部署 1 个 MySQL 实例,组成 InnoDB Cluster 集群;
- 部署工具:通过 MySQL Shell 实现集群的创建、节点管理与状态监控;
- 访问入口:在 192.168.184.151 上部署 MySQL Router,作为集群的'中间件',提供读写分离端口(6446)和只读端口(6447),屏蔽后端节点细节;
- 生产环境建议:
- 每台 MySQL 服务器均部署 MySQL Shell,便于节点故障时的本地运维;
- MySQL Router 需单独搭建高可用环境(如双机热备),避免成为单点故障;
- 不同 MGR 集群可通过不同端口区分,或直接部署在应用服务器本地。
三、准备阶段:环境初始化与 MySQL 配置
3.1 修改 Hosts 文件(三台机器均执行)
为实现服务器间通过主机名通信,需在每台机器的 /etc/hosts 中添加 IP 与主机名的映射:
vim /etc/hosts
192.168.184.151 maria-01
192.168.184.152 maria-02
192.168.184.153 maria-03
3.2 安装 MySQL 并修改核心配置
若服务器已存在旧版 MySQL,需先清理环境,再重新部署;若为新环境,可直接执行安装步骤。
3.2.1 清理旧 MySQL 环境(三台机器均执行)
/etc/init.d/mysql.server stop
rm /data/mysql -rf
rm /usr/local/mysql/ -rf
3.2.2 执行 MySQL 安装脚本
cd /data/script/install_mysql8
sh install_mysql.sh

3.2.3 验证 MySQL 安装
安装完成后,通过 root 用户登录测试:
mysql -uroot -p
3.2.4 修改 MySQL 配置文件(my.cnf)
进入配置文件目录,调整参数以满足 MGR 集群需求(每台机器需修改 server-id,与 IP 后两位对应):
cd /data/mysql/conf/
vim my.cnf
配置文件核心内容如下(注意标注'需修改'的部分):
server-id = 184151
gtid_mode=on
enforce_gtid_consistency=on
log-bin = /data/mysql/binlog/mysql-bin
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
slave_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=WRITESET
slave_preserve_commit_order=1
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
super-read-only=OFF
group_replication_start_on_boot=off
group_replication_local_address= "maria-01:33061"
group_replication_group_seeds= "maria-01:33061,maria-02:33061,maria-03:33061"
group_replication_bootstrap_group=off
=
=FORCE_PLUS_PERMANENT
3.2.5 重启 MySQL 服务
配置修改后,重启服务使参数生效:
/etc/init.d/mysql.server restart
3.2.6 安装 MySQL Shell(仅 184.151 机器,生产环境建议每台部署)
MySQL Shell 是管理 MGR 集群的核心工具,通过官方源安装:
cd /usr/src
wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.25-1.el7.x86_64.rpm
yum install mysql-shell-8.0.25-1.el7.x86_64.rpm -y
mysqlsh --version

四、安装阶段:创建 MGR 集群与添加节点
4.1 创建集群专用用户(三台机器均执行)
为 MGR 集群创建专用用户 mgr_user,并授予所需权限(避免使用 root 用户直接管理集群):
mysql -uroot -p
CREATE USER 'mgr_user'@'%' IDENTIFIED BY 'BgIka^123';
GRANT CLONE_ADMIN, CONNECTION_ADMIN, CREATE USER, EXECUTE, FILE, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SELECT, SHUTDOWN, SYSTEM_VARIABLES_ADMIN,CREATE,DROP,INSERT,UPDATE,DELETE,ALTER,INDEX,REFERENCES ON *.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, , INDEX, , LOCK TABLES, , , , mysql_innodb_cluster_metadata. @ OPTION;
, ROUTINE, , ROUTINE, TEMPORARY TABLES, , , , EVENT, , INDEX, , LOCK TABLES, , , , mysql_innodb_cluster_metadata_bkp. @ OPTION;
, ROUTINE, , ROUTINE, TEMPORARY TABLES, , , , EVENT, , INDEX, , LOCK TABLES, , , , mysql_innodb_cluster_metadata_previous. @ OPTION;
4.2 用 MySQL Shell 创建 MGR 集群(仅 184.151 机器执行)
4.2.1 连接 MySQL 实例
mysqlsh -umgr_user -p'BgIka^123' -h192.168.184.151
4.2.2 创建集群
进入 MySQL Shell 交互模式后,执行以下命令创建名为 Cluster01 的 MGR 集群:
var cluster = dba.createCluster('Cluster01');
var cluster = dba.getCluster('Cluster01');
4.3 向集群添加节点(184.152 与 184.153)
在 MySQL Shell 中,依次将 184.152 和 184.153 的 MySQL 实例加入集群:
4.3.1 添加 184.152 节点
cluster.addInstance('[email protected]:3306');
cluster.rescan();
4.3.2 查看集群状态
添加节点后,验证集群状态(确保节点均为 ONLINE):
cluster.status();

4.3.3 添加 184.153 节点
cluster.addInstance('[email protected]:3306');
cluster.status();

五、测试阶段:部署 MySQL Router 并验证集群可用性
5.1 安装 MySQL Router(仅 184.151 机器,生产环境需高可用部署)
MySQL Router 用于将客户端请求路由到 MGR 集群节点,实现读写分离与故障自动切换:
wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-community-8.0.25-1.el7.x86_64.rpm
yum install mysql-router-community-8.0.25-1.el7.x86_64.rpm -y
5.2 生成 Router 配置文件
mkdir /data/mysqlroute
mysqlrouter -B [email protected]:3306 --directory=/data/mysqlroute -u root --force
cd /data/mysqlroute
vim mysqlrouter.conf

5.3 启动 MySQL Router 并测试
5.3.1 启动 Router
/data/mysqlroute/start.sh
5.3.2 测试读写端口(6446)
通过 Router 的读写端口连接集群,创建测试数据库,验证写操作路由:
mysql -umgr_user -p'BgIka^123' -P6446 -h192.168.184.151 -e "select @@hostname; create database maria_mgr_test;"

5.3.3 测试只读端口(6447)
通过只读端口连接,验证数据库是否同步(能看到 maria_mgr_test):
mysql -umgr_user -p'BgIka^123' -P6447 -h192.168.184.151 -e "show databases;"

5.3.4 直接验证集群节点同步
登录 184.152 或 184.153 的 MySQL 实例,确认测试数据库已同步:
mysql -uroot -p
show databases;

六、总结与注意事项
- 核心要点:本次部署通过 MySQL Shell 简化了 MGR 集群创建流程,MySQL Router 实现了请求统一入口,3 台节点组成的集群可满足中小规模业务的高可用需求;
- 生产环境优化:
- 每台服务器均部署 MySQL Shell,便于节点故障时的本地运维;
- MySQL Router 需通过 Keepalived 或容器化实现高可用,避免单点故障;
- 定期备份 MySQL 数据,建议结合 binlog 实现时间点恢复;
- 常见问题排查:
- 节点加入失败:检查
my.cnf 配置(尤其是 server-id 和 MGR 参数)、防火墙端口(3306、33061)是否开放;
- Router 路由失败:确认集群状态正常(
cluster.status())、Router 配置文件中的集群地址正确;
- 数据同步延迟:可调整
slave_parallel_workers 参数增加并行复制线程数。