引言
在企业级应用中,MySQL 数据库的高可用是保障业务稳定运行的核心需求。MySQL Group Replication(简称 MGR)作为官方推荐的高可用解决方案,支持多主模式和单主模式,能实现数据实时同步与故障自动切换。
MySQL Group Replication (MGR) 集群部署指南,涵盖环境初始化、MySQL 配置、InnoDB Cluster 创建及 MySQL Router 接入。通过三节点架构实现高可用,利用 MySQL Shell 管理集群状态,Router 提供读写分离入口。重点包括 hosts 配置、my.cnf 参数调整、专用用户权限授予、节点加入流程及连通性验证,适用于运维人员搭建生产级数据库高可用方案。

在企业级应用中,MySQL 数据库的高可用是保障业务稳定运行的核心需求。MySQL Group Replication(简称 MGR)作为官方推荐的高可用解决方案,支持多主模式和单主模式,能实现数据实时同步与故障自动切换。
本文将详细介绍如何基于 3 台服务器搭建 MGR 集群,结合 MySQL Shell 快速部署集群,并通过 MySQL Router 实现集群访问入口的统一管理,全程附带实操命令与配置说明,适用于运维人员和数据库工程师参考。
本次 MGR 集群部署采用 3 台物理机(或虚拟机),整体架构如下:
为实现服务器间通过主机名通信,需在每台机器的 /etc/hosts 中添加 IP 与主机名的映射:
# 编辑 hosts 文件
vim /etc/hosts
# 添加以下内容(IP 与主机名对应)
192.168.184.151 maria-01
192.168.184.152 maria-02
192.168.184.153 maria-03
若服务器已存在旧版 MySQL,需先清理环境,再重新部署;若为新环境,可直接执行安装步骤。
# 停止 MySQL 服务
/etc/init.d/mysql.server stop
# 删除 MySQL 数据文件与安装目录(谨慎操作,确保数据已备份)
rm /data/mysql -rf
rm /usr/local/mysql/ -rf
# 进入安装脚本目录(需提前准备好 install_mysql.sh 脚本)
cd /data/script/install_mysql8
# 执行安装脚本
sh install_mysql.sh
安装完成后,通过 root 用户登录测试:
# 登录 MySQL
mysql -uroot -p
# 输入密码:maria(脚本预设密码,实际环境需修改为强密码)
进入配置文件目录,调整参数以满足 MGR 集群需求(每台机器需修改 server-id,与 IP 后两位对应):
# 进入配置文件目录
cd /data/mysql/conf/
# 编辑 my.cnf
vim my.cnf
配置文件核心内容如下(注意标注'需修改'的部分):
# 基础配置:每台机器 server-id 不同(184151/184152/184153)
server-id = 184151
# 184.151 机器配置,152/153 机器对应修改
# GTID 配置(MGR 依赖 GTID 实现数据一致性)
gtid_mode=on
enforce_gtid_consistency=on
# Binlog 配置(开启二进制日志,用于数据同步)
log-bin = /data/mysql/binlog/mysql-bin
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
# MGR 核心参数
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
# 插件配置(加载克隆插件与组复制插件)
plugin-load-add="mysql_clone.so;group_replication.so"
clone=FORCE_PLUS_PERMANENT
配置修改后,重启服务使参数生效:
# 正确重启命令
/etc/init.d/mysql.server restart
MySQL Shell 是管理 MGR 集群的核心工具,通过官方源安装:
# 进入脚本目录
cd /usr/src
# 下载 MySQL Shell RPM 包(8.0.25 版本,可根据需求替换)
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 集群创建专用用户 mgr_user,并授予所需权限(避免使用 root 用户直接管理集群):
-- 登录 MySQL
mysql -uroot -p
-- 创建用户(密码:BgIka^123,实际环境需修改为强密码)
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, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'mgr_user'@'%' WITH GRANT OPTION;
# 通过 mgr_user 连接 184.151 的 MySQL 实例
mysqlsh -umgr_user -p'BgIka^123' -h192.168.184.151
进入 MySQL Shell 交互模式后,执行以下命令创建名为 Cluster01 的 MGR 集群:
// 创建集群
var cluster = dba.createCluster('Cluster01');
// 若后续退出 Shell,重新连接后需执行此命令加载集群(无需重复创建)
var cluster = dba.getCluster('Cluster01');
在 MySQL Shell 中,依次将 184.152 和 184.153 的 MySQL 实例加入集群:
// 添加 184.152 节点(端口默认 3306)
cluster.addInstance('[email protected]:3306');
// 若提示'重启超时',执行此命令更新集群状态后重试
cluster.rescan();
添加节点后,验证集群状态(确保节点均为 ONLINE):
cluster.status();
// 添加 184.153 节点
cluster.addInstance('[email protected]:3306');
// 再次查看状态,确认 3 个节点均在线
cluster.status();
MySQL Router 用于将客户端请求路由到 MGR 集群节点,实现读写分离与故障自动切换:
# 下载 MySQL Router RPM 包(8.0.25 版本,与 Shell 版本一致)
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
# 创建 Router 工作目录
mkdir /data/mysqlroute
# 生成配置文件(关联 MGR 集群,--force 覆盖已有文件)
mysqlrouter -B [email protected]:3306 --directory=/data/mysqlroute -u root --force
# 查看配置文件(可根据需求调整端口,默认读写 6446、只读 6447)
cd /data/mysqlroute
vim mysqlrouter.conf
# 执行启动脚本
/data/mysqlroute/start.sh
通过 Router 的读写端口连接集群,创建测试数据库,验证写操作路由:
# 连接 Router 读写端口
mysql -umgr_user -p'BgIka^123' -P6446 -h192.168.184.151 -e "select @@hostname; create database maria_mgr_test;"
通过只读端口连接,验证数据库是否同步(能看到 maria_mgr_test):
# 连接 Router 只读端口,查看数据库列表
mysql -umgr_user -p'BgIka^123' -P6447 -h192.168.184.151 -e "show databases;"
登录 184.152 或 184.153 的 MySQL 实例,确认测试数据库已同步:
# 登录 184.152 的 MySQL
mysql -uroot -p
# 查看数据库(应包含 maria_mgr_test)
show databases;
my.cnf 配置(尤其是 server-id 和 MGR 参数)、防火墙端口(3306、33061)是否开放;cluster.status())、Router 配置文件中的集群地址正确;slave_parallel_workers 参数增加并行复制线程数。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online