MySQL Group Replication(MGR)集群部署实战:基于InnoDB Cluster与MySQL Router

一、引言

在企业级应用中,MySQL数据库的高可用是保障业务稳定运行的核心需求。MySQL Group Replication(简称MGR)作为官方推荐的高可用解决方案,支持多主模式和单主模式,能实现数据实时同步与故障自动切换。本文将详细介绍如何基于3台服务器搭建MGR集群,结合MySQL Shell快速部署集群,并通过MySQL Router实现集群访问入口的统一管理,全程附带实操命令与配置说明,适用于运维人员和数据库工程师参考。

二、部署架构介绍

本次MGR集群部署采用3台物理机(或虚拟机),整体架构如下:

  1. 核心组件:3台服务器(IP分别为192.168.184.151、184.152、184.153)各部署1个MySQL实例,组成InnoDB Cluster集群;
  2. 部署工具:通过MySQL Shell实现集群的创建、节点管理与状态监控;
  3. 访问入口:在192.168.184.151上部署MySQL Router,作为集群的"中间件",提供读写分离端口(6446)和只读端口(6447),屏蔽后端节点细节;
  4. 生产环境建议
    • 每台MySQL服务器均部署MySQL Shell,便于节点故障时的本地运维;
    • MySQL Router需单独搭建高可用环境(如双机热备),避免成为单点故障;
    • 不同MGR集群可通过不同端口区分,或直接部署在应用服务器本地。

三、准备阶段:环境初始化与MySQL配置

3.1 修改Hosts文件(三台机器均执行)

为实现服务器间通过主机名通信,需在每台机器的/etc/hosts中添加IP与主机名的映射:

bash 复制代码
# 编辑hosts文件
vim /etc/hosts

# 添加以下内容(IP与主机名对应)
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环境(三台机器均执行)
bash 复制代码
# 停止MySQL服务
/etc/init.d/mysql.server stop

# 删除MySQL数据文件与安装目录(谨慎操作,确保数据已备份)
rm /data/mysql -rf
rm /usr/local/mysql/ -rf
3.2.2 执行MySQL安装脚本
bash 复制代码
# 进入安装脚本目录(需提前准备好install_mysql.sh脚本)
cd /data/script/install_mysql8

# 执行安装脚本
sh install_mysql.sh
3.2.3 验证MySQL安装

安装完成后,通过root用户登录测试:

bash 复制代码
# 登录MySQL
mysql -uroot -p
# 输入密码:maria(脚本预设密码,实际环境需修改为强密码)
3.2.4 修改MySQL配置文件(my.cnf)

进入配置文件目录,调整参数以满足MGR集群需求(每台机器需修改server-id,与IP后两位对应):

bash 复制代码
# 进入配置文件目录
cd /data/mysql/conf/

# 编辑my.cnf
vim my.cnf

配置文件核心内容如下(注意标注"需修改"的部分):

ini 复制代码
# 基础配置:每台机器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"  # 禁用非InnoDB引擎
super-read-only=OFF  # 允许super权限用户执行写操作

# 组复制参数
group_replication_start_on_boot=off  # 禁止开机自动启动组复制
group_replication_local_address= "maria-01:33061"  # 本地通信地址(152机器为maria-02:33061,153同理)
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
3.2.5 重启MySQL服务

配置修改后,重启服务使参数生效:

bash 复制代码
# 正确重启命令
/etc/init.d/mysql.server restart
3.2.6 安装MySQL Shell(仅184.151机器,生产环境建议每台部署)

MySQL Shell是管理MGR集群的核心工具,通过官方源安装:

bash 复制代码
# 进入脚本目录
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集群与添加节点

4.1 创建集群专用用户(三台机器均执行)

为MGR集群创建专用用户mgr_user,并授予所需权限(避免使用root用户直接管理集群):

bash 复制代码
# 登录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;

4.2 用MySQL Shell创建MGR集群(仅184.151机器执行)

4.2.1 连接MySQL实例
bash 复制代码
# 通过mgr_user连接184.151的MySQL实例
mysqlsh -umgr_user -p'BgIka^123' -h192.168.184.151
4.2.2 创建集群

进入MySQL Shell交互模式后,执行以下命令创建名为Cluster01的MGR集群:

javascript 复制代码
// 创建集群
var cluster = dba.createCluster('Cluster01');

// 若后续退出Shell,重新连接后需执行此命令加载集群(无需重复创建)
var cluster = dba.getCluster('Cluster01');

4.3 向集群添加节点(184.152与184.153)

在MySQL Shell中,依次将184.152和184.153的MySQL实例加入集群:

4.3.1 添加184.152节点
javascript 复制代码
// 添加184.152节点(端口默认3306)
cluster.addInstance('mgr_user@192.168.184.152:3306');

// 若提示"重启超时",执行此命令更新集群状态后重试
cluster.rescan();
4.3.2 查看集群状态

添加节点后,验证集群状态(确保节点均为ONLINE):

javascript 复制代码
cluster.status();
4.3.3 添加184.153节点
javascript 复制代码
// 添加184.153节点
cluster.addInstance('mgr_user@192.168.184.153:3306');

// 再次查看状态,确认3个节点均在线
cluster.status();

五、测试阶段:部署MySQL Router并验证集群可用性

5.1 安装MySQL Router(仅184.151机器,生产环境需高可用部署)

MySQL Router用于将客户端请求路由到MGR集群节点,实现读写分离与故障自动切换:

bash 复制代码
# 下载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

5.2 生成Router配置文件

bash 复制代码
# 创建Router工作目录
mkdir /data/mysqlroute

# 生成配置文件(关联MGR集群,--force覆盖已有文件)
mysqlrouter -B mgr_user@192.168.184.151:3306 --directory=/data/mysqlroute -u root --force

# 查看配置文件(可根据需求调整端口,默认读写6446、只读6447)
cd /data/mysqlroute
vim mysqlrouter.conf

5.3 启动MySQL Router并测试

5.3.1 启动Router
bash 复制代码
# 执行启动脚本
/data/mysqlroute/start.sh
5.3.2 测试读写端口(6446)

通过Router的读写端口连接集群,创建测试数据库,验证写操作路由:

bash 复制代码
# 连接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):

bash 复制代码
# 连接Router只读端口,查看数据库列表
mysql -umgr_user -p'BgIka^123' -P6447 -h192.168.184.151 -e "show databases;"
5.3.4 直接验证集群节点同步

登录184.152或184.153的MySQL实例,确认测试数据库已同步:

bash 复制代码
# 登录184.152的MySQL
mysql -uroot -p

# 查看数据库(应包含maria_mgr_test)
show databases;

六、总结与注意事项

  1. 核心要点:本次部署通过MySQL Shell简化了MGR集群创建流程,MySQL Router实现了请求统一入口,3台节点组成的集群可满足中小规模业务的高可用需求;
  2. 生产环境优化
    • 每台服务器均部署MySQL Shell,便于节点故障时的本地运维;
    • MySQL Router需通过Keepalived或容器化实现高可用,避免单点故障;
    • 定期备份MySQL数据,建议结合binlog实现时间点恢复;
  3. 常见问题排查
    • 节点加入失败:检查my.cnf配置(尤其是server-id和MGR参数)、防火墙端口(3306、33061)是否开放;
    • Router路由失败:确认集群状态正常(cluster.status())、Router配置文件中的集群地址正确;
    • 数据同步延迟:可调整slave_parallel_workers参数增加并行复制线程数。
相关推荐
邵伯5 小时前
为什么你的 SELECT 有时会阻塞?
数据库·后端
洛小豆5 小时前
代码修仙录 · 第1期:宗门大阵崩了?只因少了毫秒三魂!
数据库·后端·mysql
2501_941886866 小时前
基于法兰克福金融系统实践的高可靠消息队列设计与多语言实现经验总结分享
服务器·前端·数据库
ANnianStriver6 小时前
redis安装包方式下载安装
数据库·redis·缓存
墨瑾轩6 小时前
MySQL索引创建不锁表:90%的DBA都踩过的3个坑!
mysql·adb·dba
云和恩墨6 小时前
表空间、巡检、建库:DBA最熟悉的3个场景,正在被zCloud开放运维中心重新定义
运维·数据库·表空间·dba·巡检·建库
Austindatabases6 小时前
临时工说:上云后给 我一个 不裁 DBA的理由
数据库·dba
IT邦德6 小时前
为什么顶尖DBA,都爱混社交圈?
数据库·dba
逻极6 小时前
数据分析项目:Pandas + SQLAlchemy,从数据库到DataFrame的丝滑实战
python·mysql·数据分析·pandas·sqlalchemy
tqs_123456 小时前
事务消息实现
数据库·java-rocketmq