1. 首页 > MySQL教程 > 正文

数据库教程FGMT34‑MySQL主从复制项目实施与维护07(InnoDB Cluster)

数据库教程FGMT34‑MySQL主从复制项目实施与维护07(InnoDB Cluster)

## 前言

本套风哥教程围绕MySQL官方高可用组件InnoDB Cluster展开,完整覆盖集群架构理论、环境规划、实例配置、集群创建、MySQL Shell运维、MySQL Router代理部署、故障切换、启停管控、日常运维排错完整流程。风哥教程本文部署两套完全相互独立的Linux环境,第一套环境基于MySQL8.4版本搭建InnoDB Cluster组复制集群;第二套环境基于MySQL9.7版本搭建另一套InnoDB Cluster组复制集群;两套集群硬件规格统一为单台主机64G内存、8CPU,主机名定义为`fgedu‑net‑cn1`、`fgedu‑net‑cn2`,数据库实例路径统一使用`/fgedudb`,业务库、数据库用户名统一为`fgedudb`、`fgedu`,两套环境网络、实例、元数据完全隔离,不存在互相同步与调用关系。

风哥教程本文内容结构分为前言与大纲介绍、InnoDB Cluster理论体系、两套环境完整实战操作、风哥针对本文总结四个部分。本套风哥教程实操全部基于生产级配置,所有命令、参数均可直接在测试环境复现,DBA可以根据业务硬件规格做参数微调。本套风哥教程的主要内容大纲罗列如下:

1. InnoDB Cluster集群架构基础;
2. InnoDB Cluster集群项目需求与环境准备;
3. MySQL MGR组复制底层原理;
4. MySQL Shell组件安装与基础使用;
5. MySQL8.4 InnoDB Cluster完整配置过程;
6. MySQL9.7独立InnoDB Cluster完整配置过程;
7. InnoDB Cluster集群创建、实例加入、状态检查;
8. InnoDB Cluster集群主从手动切换、自动故障转移;
9. InnoDB Cluster集群启动、停止流程;
10. MySQL Router安装配置、配置文件生成、启动脚本编写;
11. InnoDB Cluster集群业务功能测试;
12. InnoDB Cluster集群日常维护操作、常见故障排查。

>
> 风哥 itpux‑com

## 一、InnoDB Cluster集群理论体系

InnoDB Cluster是MySQL官方推出完整原生高可用数据库解决方案,底层核心依赖Group Replication(MGR组复制),配合MySQL Shell管理API(AdminAPI)、MySQL Router轻量代理中间件,三者共同构成完整高可用栈,解决传统主从复制的单点故障、手动切换、数据一致性风险等问题。传统异步复制、半同步复制仅实现binlog日志单向传输,无法保证多节点之间数据一致性,故障切换依赖外部中间件脚本;MGR组复制引入分布式共识协议,事务提交需要集群多数节点确认接收事务日志,保障多实例之间数据一致性,InnoDB Cluster将MGR复杂配置封装为AdminAPI接口,降低DBA运维成本。

### 1.1 InnoDB Cluster三大核心组件

1. **MySQL Server+Group Replication(MGR组复制)**:集群数据存储层,多个MySQL实例组成复制组,底层XCom通信层实现类Paxos共识协议,负责事务投票、消息排序、成员故障探测、自动成员管理,分为单主(Single‑Primary)模式与多主(Multi‑Primary)模式。生产环境绝大多数业务采用单主模式,集群仅一个可读写Primary主实例,其余实例为只读Secondary从实例;主实例故障,集群自动完成选主,业务无感知切换。多主模式全部节点均可读写,适合特定分片场景,冲突概率高,生产谨慎选用。
2. **MySQL Shell**:高级交互式客户端,提供JavaScript、Python、SQL三种执行模式,内置AdminAPI管理接口,DBA通过API完成实例检查、集群创建、实例添加、故障修复、元数据维护等全部集群管理工作,不需要手动修改大量MGR底层系统变量。MySQL Shell版本建议不低于Server版本,高版本Shell向下兼容低版本MySQL服务端。
3. **MySQL Router**:轻量数据库代理中间件,业务应用连接Router,Router自动识别InnoDB Cluster集群元数据,将读写请求转发至对应集群节点。提供两个端口,读写端口转发至Primary主实例;只读端口分发流量至全部Secondary从实例,实现读写分离;主节点故障发生切换时Router自动感知集群元数据变化,自动更新后端节点路由信息,业务不需要修改连接字符串。Router支持bootstrap引导模式,直接连接集群自动生成完整配置文件,无需手动编写大量配置参数。

>
> 风哥教程 113257174

### 1.2 MGR组复制底层运行原理

MGR在MySQL原有复制体系上增加三层逻辑模块,分别是组复制逻辑层GCS组通信系统层、XCom共识协议层。客户端提交DML事务到主实例,实例本地执行事务,生成binlog日志,事务提交之前,MGR模块将事务事件广播至集群全部节点,XCom层执行投票;当集群超过半数(多数派majority)节点确认接收该事务事件,事务才允许本地提交;如果投票没有获得多数节点确认,事务直接回滚拒绝提交,以此保证所有存活节点拥有完全相同事务执行序列,避免脑裂与数据分歧。

集群成员状态包含ONLINE、RECOVERING、ERROR、UNREACHABLE。新节点加入集群进入RECOVERING状态,通过分布式状态恢复,从集群已有节点复制缺失数据;数据同步完成后状态切换ONLINE,正式成为集群成员。当节点网络中断,集群标记节点UNREACHABLE,超过超时时间节点被驱逐出复制组。集群必须保留大于等于半数节点存活,维持多数派;如果存活节点不足半数,集群失去quorum多数派,集群全部实例停止读写业务,防止数据脑裂,此时需要DBA执行强制仲裁恢复集群。

MGR有硬性约束条件:存储引擎必须使用InnoDB;业务数据表必须拥有主键或者唯一键;不支持MyISAM等非事务引擎;GTID必须开启;binlog日志格式必须设置为ROW行模式;系统变量`log_replica_updates`开启;实例之间网络低延迟,建议内网千兆网络环境,MGR通信端口默认33061。

### 1.3 集群环境硬件与软件需求(64G内存,8CPU规格)

两套独立集群硬件规格统一,单主机64GB物理内存,8颗物理CPU核心,操作系统使用Linux x86‑64平台,磁盘采用SSD存储,数据库数据目录`/fgedudb/data`,binlog目录`/fgedudb/binlog`,redo日志、undo表空间统一放置/fgedudb路径。

MySQL8.4集群第一套环境主机清单:

| 主机名 | 角色 | MySQL版本 | IP地址 | 端口 | MGR通信端口 |
| — | — | — | — | — | — |
| fgedu‑net‑cn1‑node1 | 实例1(候选主) | MySQL8.4 | 192.168.10.11 | 3306 | 33061 |
| fgedu‑net‑cn1‑node2 | 实例2(从) | MySQL8.4 | 192.168.10.12 | 3306 | 33061 |
| fgedu‑net‑cn1‑node3 | 实例3(从) | MySQL8.4 | 192.168.10.13 | 3306 | 33061 |

MySQL9.7第二套独立集群主机清单:

| 主机名 | 角色 | MySQL版本 | IP地址 | 端口 | MGR通信端口 |
| — | — | — | — | — | — |
| fgedu‑net‑cn2‑node1 | 实例1(候选主) | MySQL9.7 | 192.168.20.21 | 3306 | 33061 |
| fgedu‑net‑cn2‑node2 | 实例2(从) | MySQL9.7 | 192.168.20.22 | 3306 | 33061 |
| fgedu‑net‑cn2‑node3 | 实例3(从) | MySQL9.7 | 192.168.20.23 | 3306 | 33061 |

两套集群网络互相隔离,网段分别192.168.10.0/24、192.168.20.0/24,主机名解析写入每台主机/etc/hosts;防火墙放行3306数据库端口、33061 MGR组复制通信端口;关闭SELinux;时间同步NTP服务必须全部节点保持时间一致,时间偏移会严重干扰MGR投票机制。

### 1.4 64G内存8CPU规格my.cnf核心参数详解

针对64G内存8CPU物理服务器,InnoDB Cluster实例my.cnf核心参数,第一套MySQL8.4、第二套MySQL9.7参数基础逻辑一致,版本细微差异后面实战标注。

“`
[mysqld]
user=mysql
basedir=/fgedudb/mysql
datadir=/fgedudb/data
socket=/fgedudb/mysql.sock
pid‑file=/fgedudb/mysql.pid
port=3306
server_id=11 #每台实例server_id唯一,不能重复
default‑storage‑engine=InnoDB
innodb_buffer_pool_size=42G
innodb_log_file_size=4G
innodb_log_buffer_size=256M
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log‑bin=/fgedudb/binlog/mysql‑bin
log_replica_updates=ON
relay_log=/fgedudb/relaylog/relay‑bin
read_only=ON
super_read_only=OFF
disabled_storage_engines=”MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY”
group_replication_group_name=”aaaaaaaa‑aaaa‑aaaa‑aaaa‑aaaaaaaaaaaa”
group_replication_local_address=”fgedu‑net‑cn1‑node1:33061″
group_replication_group_seeds=”fgedu‑net‑cn1‑node1:33061,fgedu‑net‑cn1‑node2:33061,fgedu‑net‑cn1‑node3:33061″
group_replication_bootstrap_group=OFF
group_replication_start_on_boot=OFF
group_replication_member_expel_timeout=10
group_replication_autorejoin_tries=200
“`

`innodb_buffer_pool_size`64G内存分配42G,为物理内存65%‑70%;binlog强制ROW格式;开启GTID;`log_replica_updates`必须开启,组复制节点需要记录从组接收的事务binlog;禁用不支持的存储引擎;`group_replication_start_on_boot=OFF`实例开机不会自动启动MGR,由MySQL Shell接管集群启停管理,防止异常自举脑裂。

>
> 风哥数据库教程 itpux‑com

## 二、MySQL8.4 InnoDB Cluster第一套环境完整实战操作

本章节完整完成第一套相互独立环境,MySQL8.4三节点InnoDB Cluster部署,主机名`fgedu‑net‑cn1‑node1`、`fgedu‑net‑cn1‑node2`、`fgedu‑net‑cn1‑node3`,路径全部使用`/fgedudb`,业务账号`fgedu`,业务库`fgedudb`。

### 2.1 系统环境初始化(三台节点全部执行)

第一步配置/etc/hosts主机名解析,三台机器全部写入:

“`
cat >>/etc/hosts <<EOF
192.168.10.11 fgedu‑net‑cn1‑node1
192.168.10.12 fgedu‑net‑cn1‑node2
192.168.10.13 fgedu‑net‑cn1‑node3
EOF
“`

关闭SELinux,设置开机不启动:

“`
setenforce 0
sed ‑i ‘s/^SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
“`

防火墙放行端口,firewalld示例:

“`
firewall‑cmd ‑‑permanent ‑‑add‑port=3306/tcp
firewall‑cmd ‑‑permanent ‑‑add‑port=33061/tcp
firewall‑cmd ‑‑reload
“`

创建数据库目录,赋予mysql用户权限:

“`
mkdir ‑p /fgedudb/data /fgedudb/binlog /fgedudb/relaylog /fgedudb/tmp
chown ‑R mysql:mysql /fgedudb
chmod 750 /fgedudb
“`

NTP时间同步配置,保证三台服务器时间严格对齐,示例chrony配置:

“`
yum install -y chrony
systemctl enable –now chronyd
chronyc sources
“`

>
> 网上搜索风哥教程可以学习全套数据库教程

### 2.2 MySQL8.4数据库软件安装与实例初始化

将MySQL8.4二进制软件包解压到`/fgedudb/mysql`目录,三台节点安装相同版本。

“`
tar ‑zxvf mysql‑8.4.4‑linux‑glibc2.28‑x86_64.tar.gz ‑C /fgedudb/
mv /fgedudb/mysql‑8.4.4‑linux‑glibc2.28‑x86_64 /fgedudb/mysql
chown ‑R mysql:mysql /fgedudb/mysql
“`

编写my.cnf配置文件放置/etc/my.cnf,每台实例修改server_id、`group_replication_local_address`参数。完成配置后执行mysqld初始化:

“`
/fgedudb/mysql/bin/mysqld ‑‑defaults‑file=/etc/my.cnf ‑‑initialize‑user=mysql
“`

生成root临时密码,查看日志获取密码:

“`
grep password /fgedudb/data/*.err
“`

编写systemd服务单元文件`/etc/systemd/system/mysqld‑fgedudb.service`:

“`
[Unit]
Description=MySQL‑fgedudb‑8.4 Database Service
After=network.target

[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/fgedudb/mysql/bin/mysqld ‑‑defaults‑file=/etc/my.cnf
ExecStop=/fgedudb/mysql/bin/mysqladmin ‑S /fgedudb/mysql.sock shutdown
Restart=no
LimitNOFILE=65535

[Install]
WantedBy=multi‑user.target
“`

重载systemd,启动MySQL服务:

“`
systemctl daemon‑reload
systemctl start mysqld‑fgedudb
systemctl enable mysqld‑fgedudb
systemctl status mysqld‑fgedudb
“`

登录数据库修改root密码,创建集群管理账号、业务账号fgedu。**三台实例都必须创建完全一致账号,密码保持统一**。

“`
ALTER USER ‘root’@’localhost’ IDENTIFIED BY “FgDba@2026”;
CREATE USER fgedu@’%’ IDENTIFIED BY “FgDba@2026”;
GRANT ALL PRIVILEGES ON *.* TO fgedu@’%’ WITH GRANT OPTION;
CREATE USER icadmin@’%’ IDENTIFIED BY “Admin@2026”;
GRANT ALL PRIVILEGES ON *.* TO icadmin@’%’ WITH GRANT OPTION;
GRANT BACKUP_ADMIN, CLONE_ADMIN, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN ON *.* TO icadmin@’%’;
FLUSH PRIVILEGES;
CREATE DATABASE fgedudb;
“`

>
> 上51CTO搜索风哥可以学习全套数据库教程

### 2.3 MySQL Shell 8.4安装

MySQL Shell用于集群管理,可以部署任意一台节点,本环境部署`fgedu‑net‑cn1‑node1`。解压二进制包,配置环境变量。

“`
tar ‑zxvf mysql‑shell‑8.4.4‑linux‑glibc2.28‑x86‑64.tar.gz ‑C /fgedudb/
mv /fgedudb/mysql‑shell‑8.4.4‑linux‑glibc2.28‑x86‑64 /fgedudb/mysqlsh
echo “export PATH=\$PATH:/fgedudb/mysqlsh/bin” >> /etc/profile
source /etc/profile
“`

验证mysqlsh版本:

“`
mysqlsh ‑‑version
“`

登录数据库实例,使用集群管理员icadmin账号,进入JS模式:

“`
mysqlsh ‑‑js icadmin@fgedu‑net‑cn1‑node1:3306
“`

进入MySQL Shell JS交互提示符 `mysql‑js>`。

### 2.4 AdminAPI实例配置检查与实例配置

AdminAPI提供`dba.checkInstanceConfiguration()`检查实例是否满足InnoDB Cluster全部前置条件;`dba.configureInstance()`自动修正实例参数,持久化到mysqld系统变量,不需要手动修改my.cnf,部分参数修改需要重启MySQL实例。

连接icadmin@fgedu‑net‑cn1‑node1,JS模式执行三台实例配置检查:

“`
dba.checkInstanceConfiguration(“icadmin@fgedu‑net‑cn1‑node1:3306”)
dba.checkInstanceConfiguration(“icadmin@fgedu‑net‑cn1‑node2:3306”)
dba.checkInstanceConfiguration(“icadmin@fgedu‑net‑cn1‑node3:3306”)
“`

输出报告会列出不满足条件项,如果出现错误,调用`dba.configureInstance`自动修复配置:

“`
dba.configureInstance(“icadmin@fgedu‑net‑cn1‑node1:3306″,{clusterAdmin:”icadmin”,clusterAdminPassword:”Admin@2026″,restart:true})
dba.configureInstance(“icadmin@fgedu‑net‑cn1‑node2:3306″,{clusterAdmin:”icadmin”,clusterAdminPassword:”Admin@2026″,restart:true})
dba.configureInstance(“icadmin@fgedu‑net‑cn1‑node3:3306″,{clusterAdmin:”icadmin”,clusterAdminPassword:”Admin@2026″,restart:true})
“`

参数restart:true允许API自动重启MySQL实例完成参数生效。实例配置全部通过,返回status:ok,才可以创建集群。

### 2.5 创建MySQL8.4 InnoDB Cluster集群

连接`fgedu‑net‑cn1‑node1`节点,JS模式执行`dba.createCluster()`创建集群,集群名称定义`cluster_fg84`,单主模式,设置成员权重memberWeight。

“`
var cluster = dba.createCluster(“cluster_fg84″, {
memberWeight:80,
communicationStack:”xcom”,
bootstrapGroup:true
})
“`

创建完成后查看集群基础状态status():

“`
cluster.status()
“`

正常输出集群状态`healthStatus:OK`,当前仅有node1一个实例。接下来把node2、node3实例加入集群。

“`
cluster.addInstance(“icadmin@fgedu‑net‑cn1‑node2:3306”,{memberWeight:70})
cluster.addInstance(“icadmin@fgedu‑net‑cn1‑node3:3306”,{memberWeight:60})
“`

实例加入集群,节点进入RECOVERING状态,执行分布式状态恢复克隆数据,等待数据同步完成切换ONLINE。再次执行`cluster.status()`确认三台实例状态全部ONLINE,role区分PRIMARY、SECONDARY。

### 2.6 MySQL Router8.4部署配置

MySQL Router部署`fgedu‑net‑cn1‑node1`,二进制包解压,使用bootstrap引导模式自动连接集群生成全套配置文件,工作目录`/fgedudb/mysqlrouter`。

“`
tar ‑zxvf mysql‑router‑8.4.4‑linux‑glibc2.28‑x86_64.tar.gz ‑C /fgedudb/
mv /fgedudb/mysql‑router‑8.4.4‑linux‑glibc2.28‑x86_64 /fgedudb/mysqlrouter
“`

执行bootstrap引导,连接集群管理员账号,自动生成配置:

“`
/fgedudb/mysqlrouter/bin/mysqlrouter ‑‑bootstrap icadmin@fgedu‑net‑cn1‑node1:3306 \
‑‑directory=/fgedudb/mysqlrouter/run \
‑‑user=mysql \
‑‑force
“`

bootstrap完成后自动生成mysqlrouter.conf配置文件,读写端口6450(转发Primary);只读端口6451(分发所有Secondary)。编写systemd启动单元文件`/etc/systemd/system/mysqlrouter‑fg84.service`:

“`
[Unit]
Description=MySQL‑Router‑fg84 Service
After=network.target

[Service]
User=mysql
Group=mysql
ExecStart=/fgedudb/mysqlrouter/bin/mysqlrouter ‑‑config=/fgedudb/mysqlrouter/run/mysqlrouter.conf
Restart=on‑failure

[Install]
WantedBy=multi‑user.target
“`

启动Router服务:

“`
systemctl daemon‑reload
systemctl start mysqlrouter‑fg84
systemctl enable mysqlrouter‑fg84
systemctl status mysqlrouter‑fg84
“`

业务测试连接读写端口6450,写入测试数据到fgedudb库:

“`
mysql ‑h127.0.0.1 ‑P6450 ‑ufgedu ‑p’FgDba@2026′
use fgedudb;
create table t_fg84(id int primary key auto_increment,c1 varchar(64));
insert into t_fg84(c1) values(“test‑innodb‑cluster‑84”);
select * from t_fg84;
“`

连接只读端口6451,验证可以查询数据,无法执行写入操作。

### 2.7 InnoDB Cluster集群主从切换、启停维护实战

#### 2.7.1 手动切换主节点setPrimaryInstance

业务维护场景手动切换主实例,将主节点切换到`fgedu‑net‑cn1‑node2`,JS模式:

“`
var cluster = dba.getCluster()
cluster.setPrimaryInstance(“icadmin@fgedu‑net‑cn1‑node2:3306”,{runningTransactionsTimeout:120})
“`

`runningTransactionsTimeout=120`等待现存业务事务120秒,超时拒绝新事务执行切换。切换完成执行cluster.status()确认PRIMARY角色变更。

#### 2.7.2 模拟主节点故障,验证自动故障转移

systemctl stop mysqld‑fgedudb停止当前Primary节点数据库服务,观察集群状态,集群自动完成选主,剩余节点中memberWeight权重最高实例升级为PRIMARY;MySQL Router自动识别元数据变化,业务连接不受影响。故障节点恢复启动MySQL服务,节点自动加入集群,角色为SECONDARY。

#### 2.7.3 集群完整停止流程

InnoDB Cluster不能直接全部暴力关闭MySQL,正确运维停机顺序:

1. 停止业务流量,停止MySQL Router服务;
2. Shell连接集群,执行集群优雅停止,逐个停止实例;
3. 依次systemctl stop mysqld‑fgedudb三台实例。

集群启动流程:

1. 优先启动全部MySQL实例;
2. MySQL Shell连接任意存活节点,执行`cluster.rescan()`扫描集群成员;
3. 确认全部实例ONLINE;
4. 启动MySQL Router服务,业务接入。

#### 2.7.4 集群失去多数派quorum故障恢复

当存活节点不足半数,集群失去quorum,全部实例只读。此时使用forceQuorumUsingPartitionOf强制仲裁恢复集群:

“`
var cluster = dba.getCluster()
cluster.forceQuorumUsingPartitionOf(“icadmin@fgedu‑net‑cn1‑node2:3306”)
“`

该操作属于高危运维,DBA必须确认故障节点已经彻底离线,防止脑裂风险。集群整体全部宕机场景,使用`dba.rebootClusterFromCompleteOutage`完成集群整体重启恢复:

“`
var cluster = dba.rebootClusterFromCompleteOutage(“cluster_fg84”,{force:false})
“`

### 2.8 MySQL8.4集群常用维护命令汇总(JS模式)

“`
var cluster = dba.getCluster() //获取集群对象
cluster.status() //集群完整状态查看
cluster.describe() //集群元数据描述
cluster.rescan() //集群成员重新扫描
cluster.removeInstance(“icadmin@fgedu‑net‑cn1‑node3:3306”) //删除集群实例
cluster.rejoinInstance(“icadmin@fgedu‑net‑cn1‑node3:3306”) //故障节点重新加入集群
cluster.switchToMultiPrimaryMode() //切换多主模式
cluster.switchToSinglePrimaryMode(“icadmin@fgedu‑net‑cn1‑node1:3306”) //切回单主模式
“`

## 三、MySQL9.7 InnoDB Cluster第二套独立环境完整实战操作

>
> 本套风哥教程第二套环境完全独立,网段192.168.20.0/24,主机名`fgedu‑net‑cn2‑node1`、`fgedu‑net‑cn2‑node2`、`fgedu‑net‑cn2‑node3`,硬件规格同样64G内存8CPU,路径统一`/fgedudb`,业务账号`fgedu`,业务库`fgedudb`;**两套集群完全隔离,元数据互不干扰,不能跨集群执行dba操作**。MySQL9.7底层MGR组件部分系统变量发生变更,废弃部分旧版本参数,本章节重点标注版本差异点。

### 3.1 系统环境初始化(三台节点全部执行)

修改/etc/hosts主机解析:

“`
cat >>/etc/hosts <<EOF
192.168.20.21 fgedu‑net‑cn2‑node1
192.168.20.22 fgedu‑net‑cn2‑node2
192.168.20.23 fgedu‑net‑cn2‑node3
EOF
“`

关闭SELinux,firewalld放行3306、33061端口;创建数据库目录,授权mysql用户。

“`
mkdir ‑p /fgedudb/data /fgedudb/binlog /fgedudb/relaylog /fgedudb/tmp
chown ‑R mysql:mysql /fgedudb
“`

配置NTP时间同步,保证三节点时间一致。

### 3.2 MySQL9.7软件部署与实例初始化

解压MySQL9.7二进制包到`/fgedudb/mysql`:

“`
tar ‑zxvf mysql‑9.7.0‑linux‑glibc2.34‑x86_64.tar.gz ‑C /fgedudb/
mv /fgedudb/mysql‑9.7.0‑linux‑glibc2.34‑x86_64 /fgedudb/mysql
chown ‑R mysql:mysql /fgedudb/mysql
“`

编写/etc/my.cnf配置文件,64G内存8CPU规格参数,注意MySQL9.7部分系统变量命名调整,`log_replica_updates`继续保留;MGR通信栈默认xcom。每个实例修改server_id、`group_replication_local_address`参数。

执行实例初始化:

“`
/fgedudb/mysql/bin/mysqld ‑‑defaults‑file=/etc/my.cnf ‑‑initialize‑user=mysql
“`

编写systemd服务单元`/etc/systemd/system/mysqld‑fgedudb.service`,和8.4版本逻辑保持一致,启动MySQL服务。登录数据库修改root密码,创建集群管理员icadmin、业务账号fgedu,创建业务库fgedudb,三台实例账号权限完全统一。

“`
ALTER USER ‘root’@’localhost’ IDENTIFIED BY “FgDba@2026”;
CREATE USER fgedu@’%’ IDENTIFIED BY “FgDba@2026”;
GRANT ALL PRIVILEGES ON *.* TO fgedu@’%’ WITH GRANT OPTION;
CREATE USER icadmin@’%’ IDENTIFIED BY “Admin@2026”;
GRANT ALL PRIVILEGES ON *.* TO icadmin@’%’ WITH GRANT OPTION;
GRANT BACKUP_ADMIN, CLONE_ADMIN, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN ON *.* TO icadmin@’%’;
FLUSH PRIVILEGES;
CREATE DATABASE fgedudb;
“`

### 3.3 MySQL Shell9.7安装部署

MySQL Shell9.7部署`fgedu‑net‑cn2‑node1`节点,解压二进制包配置PATH环境变量:

“`
tar ‑zxvf mysql‑shell‑9.7.0‑linux‑glibc2.34‑x86_64.tar.gz ‑C /fgedudb/
mv /fgedudb/mysql‑shell‑9.7.0‑linux‑glibc2.34‑x86_64 /fgedudb/mysqlsh
echo “export PATH=\$PATH:/fgedudb/mysqlsh/bin” >> /etc/profile
source /etc/profile
mysqlsh ‑‑version
“`

登录进入JS交互模式:

“`
mysqlsh ‑‑js icadmin@fgedu‑net‑cn2‑node1:3306
“`

### 3.4 实例配置检查与自动配置dba API

MySQL9.7的AdminAPI接口语法基本兼容8.4,内部校验规则更新。执行三台实例配置检查:

“`
dba.checkInstanceConfiguration(“icadmin@fgedu‑net‑cn2‑node1:3306”)
dba.checkInstanceConfiguration(“icadmin@fgedu‑net‑cn2‑node2:3306”)
dba.checkInstanceConfiguration(“icadmin@fgedu‑net‑cn2‑node3:3306”)
“`

调用dba.configureInstance自动修复实例配置:

“`
dba.configureInstance(“icadmin@fgedu‑net‑cn2‑node1:3306″,{clusterAdmin:”icadmin”,clusterAdminPassword:”Admin@2026″,restart:true})
dba.configureInstance(“icadmin@fgedu‑net‑cn2‑node2:3306″,{clusterAdmin:”icadmin”,clusterAdminPassword:”Admin@2026″,restart:true})
dba.configureInstance(“icadmin@fgedu‑net‑cn2‑node3:3306″,{clusterAdmin:”icadmin”,clusterAdminPassword:”Admin@2026″,restart:true})
“`

等待实例重启完成,所有检查项status:OK,方可创建集群。

### 3.5 MySQL9.7 InnoDB Cluster集群创建

连接`fgedu‑net‑cn2‑node1`,JS模式创建集群,集群名称`cluster_fg97`:

“`
var cluster97 = dba.createCluster(“cluster_fg97″,{
memberWeight:80,
communicationStack:”xcom”,
bootstrapGroup:true
})
“`

查看集群状态cluster97.status();添加node2、node3实例加入集群:

“`
cluster97.addInstance(“icadmin@fgedu‑net‑cn2‑node2:3306”,{memberWeight:70})
cluster97.addInstance(“icadmin@fgedu‑net‑cn2‑node3:3306”,{memberWeight:60})
“`

等待RECOVERING状态完成,三实例全部ONLINE,确认角色PRIMARY、SECONDARY。

### 3.6 MySQL Router9.7部署配置

部署Router9.7在`fgedu‑net‑cn2‑node1`节点,二进制包解压,执行bootstrap引导模式自动生成配置文件,工作目录`/fgedudb/mysqlrouter`。

“`
tar ‑zxvf mysql‑router‑9.7.0‑linux‑glibc2.34‑x86_64.tar.gz ‑C /fgedudb/
mv /fgedudb/mysql‑router‑9.7.0‑linux‑glibc2.34‑x86_64 /fgedudb/mysqlrouter
/fgedudb/mysqlrouter/bin/mysqlrouter ‑‑bootstrap icadmin@fgedu‑net‑cn2‑node1:3306 \
‑‑directory=/fgedudb/mysqlrouter/run \
‑‑user=mysql \
‑‑force
“`

编写systemd单元文件,启动Router服务。业务测试连接读写端口6450写入测试表到fgedudb库,6451只读端口验证查询,确认集群复制正常。

### 3.7 MySQL9.7集群切换、启停、故障修复运维

手动切换主实例命令,9.7版本API和8.4保持一致:

“`
var cluster97 = dba.getCluster()
cluster97.setPrimaryInstance(“icadmin@fgedu‑net‑cn2‑node2:3306”,{runningTransactionsTimeout:120})
cluster97.status()
“`

模拟主节点故障停止mysqld‑fgedudb服务,集群自动选主,Router自动路由转发。集群quorum丢失强制仲裁恢复命令:

“`
cluster97.forceQuorumUsingPartitionOf(“icadmin@fgedu‑net‑cn2‑node2:3306”)
“`

>
> 注意:MySQL9.7废弃部分MGR旧系统变量,禁止直接照搬8.4 my.cnf全部参数,优先使用AdminAPI持久化系统变量,减少手动my.cnf维护工作量。集群完整启停顺序、实例删除、实例重新加入命令和8.4语法兼容。

## 四、两套集群业务功能与故障模拟综合测试

### 4.1 MySQL8.4集群业务测试

通过Router 6450读写端口,使用fgedu账号操作fgedudb库,持续插入测试数据;分别登录三台数据库实例,验证全部节点数据完全一致。停止Primary节点,观察业务短暂阻塞后自动恢复,Router连接不受人工干预。故障实例恢复启动,自动加入集群作为从节点同步全部数据。

### 4.2 MySQL9.7集群业务测试

独立网段业务访问Router读写端口,执行DML、DDL操作,验证三实例数据一致性;模拟网络中断,节点进入UNREACHABLE状态,集群完成驱逐;网络修复执行`cluster97.rejoinInstance()`恢复实例。两套集群网络隔离,不存在数据互通,DBA不允许交叉调用两套集群AdminAPI对象。

### 4.3 常见故障排查要点汇总

1. MGR 33061端口无法连通:检查防火墙、主机名解析、/etc/hosts,telnet验证端口连通性;
2. addInstance实例加入卡在RECOVERING状态:网络带宽不足、克隆账号权限缺失、磁盘空间不足;优先查看错误日志`/fgedudb/data/*.err`定位根因;
3. 集群healthStatus为NO_QUORUM:存活节点不足半数,执行forceQuorumUsingPartitionOf强制恢复,确认故障节点彻底离线;
4. MySQL Router无法识别集群元数据:确认bootstrap使用集群管理员账号,元数据schema完整;
5. 实例重启后无法自动加入集群:`group_replication_start_on_boot=OFF`,不能手动set global启动MGR,使用Shell rejoinInstance接管实例。
6. 克隆实例报错:确认实例GTID集合不存在冲突,不要存在手动导入的历史脏数据。

## 风哥针对本文总结

本套风哥教程完整讲解InnoDB Cluster高可用整套解决方案,从MGR组复制底层理论,到两套完全独立的MySQL8.4、MySQL9.7生产级环境完整部署实战。硬件统一64G内存8CPU规格,全部实例路径`/fgedudb`,业务账号库名`fgedu`、`fgedudb`,主机名`fgedu‑net‑cn1`、`fgedu‑net‑cn2`,两套集群网络、元数据完全隔离,DBA可以在测试环境完整复现全部操作命令。

InnoDB Cluster由MGR组复制、MySQL Shell AdminAPI、MySQL Router三个组件协同工作,MGR实现分布式数据一致性,AdminAPI屏蔽复杂底层配置,Router对外业务透明读写分离。生产环境优先单主模式,三节点部署保证多数派高可用,运维禁止暴力直接全部关机,遵循集群标准启停流程;当集群丢失quorum多数派,强制仲裁属于高危操作,必须确认故障节点彻底离线,规避脑裂风险。

MySQL8.4与MySQL9.7两套版本API语法大部分兼容,但底层MGR系统变量存在版本差异,升级、部署环境必须查阅对应官方文档;生产环境不建议手动大量修改my.cnf组复制参数,优先使用dba.configureInstance接口持久化系统变量,降低配置错误风险。DBA日常运维重点监控cluster.status()输出状态,关注实例ONLINE、RECOVERING、UNREACHABLE状态,提前规划故障演练,熟悉手动切换、强制仲裁、故障节点重新加入整套操作流程。

InnoDB Cluster不是零运维数据库,虽然提供自动故障转移,仍然需要DBA持续监控磁盘、网络、系统时间同步、节点成员状态;NTP时间同步是MGR稳定运行基础,多节点时间偏移会直接造成MGR投票异常,业务中断。MySQL Router作为业务访问入口,生产建议部署多套Router实例,消除代理层单点故障风险,实现整套数据库高可用架构闭环。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息