ITPub博客

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

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

原创 MySQL 作者:mfkqwyc86 时间:2026-09-16 11:12:48 0 删除 编辑

数据库教程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实例,消除代理层单点故障风险,实现整套数据库高可用架构闭环。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9664900/viewspace-3182523/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
风哥Oracle,MySQL,PostgreSQL,Linux,大数据,国产数据库,中间件等教程

注册时间:2010-10-26

  • 博文量
    68
  • 访问量
    406003