












FGDBA-MySQL 8/9 InnoDB Cluster 自动化安装工具是一款由风哥自主研发的、面向企业级生产环境的一键式 MySQL 8/9 InnoDB Cluster 自动化部署工具。
FGDBA-MySQL 8/9 InnoDB Cluster 自动化安装工具是一款由风哥自主研发的、面向企业级生产环境的一键式 MySQL 8/9 InnoDB Cluster 自动化部署工具。该工具基于 Python 3 编写,采用配置驱动(YAML 配置文件)的设计理念,通过 SSH 远程连接协议对多台目标主机进行并行操作,能够在一条命令内完成从底层系统参数调优、MySQL Server 二进制安装、MGR 组复制集群搭建、MySQL Shell 集群管理工具部署、InnoDB Cluster 元数据配置,到 MySQL Router 读写分离代理部署的完整高可用架构搭建工作。
工具采用经典的"三阶段架构"设计:
整个安装过程采用多线程并行执行机制,相比传统的串行安装方式,整体部署时间可缩短 55% 以上。工具内置完善的错误处理、分阶段回滚、断点续装、符号链接检测、日志增强等机制,确保即使在复杂网络环境下也能安全、稳定、可重复地完成部署。
作者:风哥
官方网站 http://www.fgedu.net.cn , http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html
mysql MGR组复制集群一键安装教程 https://edu.51cto.com/course/40556.html
在企业级数据库运维场景中,MySQL InnoDB Cluster 架构的搭建涉及多个组件(MySQL Server、MySQL Shell、MySQL Router)、多台服务器(至少 3 台数据节点 + 2 台代理节点)、大量配置参数(系统内核参数、MySQL 参数、MGR 参数、Router 参数)以及繁琐的手工操作步骤。传统手工部署方式存在以下痛点:
基于上述背景,本工具的设计理念如下:
{host_ip})。本工具适用于以下对象和场景:
使用本工具前,建议操作者具备以下基础知识:
本工具围绕 InnoDB Cluster 全栈架构的自动化部署,提供以下核心功能:
/mysql/log/ 目录下,便于集中查看与运维管理。除核心功能外,工具还提供以下增强特性:
{host_ip} 等变量,在生成各节点配置文件时自动替换为对应主机的实际 IP 地址。fs.file-max、net.core.somaxconn、vm.swappiness、vm.overcommit_memory、大页内存等内核参数。工具代码以 MySQLMGRInstall 类为核心,内部集成了以下功能模块:
负责命令行参数解析(argparse)与 YAML 配置文件的加载、校验、动态更新。命令行参数可覆盖配置文件中的对应项(如 SSH 凭据、集群成员 IP、集群名称等),实现"配置文件打底 + 命令行覆盖"的灵活配置方式。
在安装前对目标主机进行全面体检,包括:网络连通性检测(MySQL 端口 3306、MGR 端口 33006、X Protocol 端口 33060)、MySQL Shell 可用性检测(同时检查实际安装目录与符号链接)、Router 端口可用性检测(6446、6447、6450)、集群仲裁配置检查、Router 部署验证与依赖检查、元数据版本检查。
使用多线程(threading)对多台 MySQL Server 节点并行执行二进制解压、目录创建、初始化、配置文件生成、systemd 服务注册、启动、root 密码设置等操作。安装结果通过线程锁保护的结果字典集中追踪,失败节点自动回滚。MySQL Shell 与 MySQL Router 安装同样支持多节点并行。
在 MySQL Server 安装完成后,配置 MGR 组复制集群:创建复制用户、配置 group_replication 参数(group_name、local_address、group_seeds、autorejoin_tries、member_expel_timeout 等)、启动组复制、设置单主模式、验证成员状态。
通过 MySQL Shell 的 adoptFromGR 模式,将已有的 MGR 集群整合升级为 InnoDB Cluster。包括:创建集群管理用户(clusteradmin)、执行 adoptFromGR 创建集群、元数据初始化、集群状态验证。
负责 MySQL Router 的二进制安装、Bootstrap 操作、配置生成。采用非主节点优先策略,优化 Router 分布;支持读写路由策略(first-available)与只读路由策略(round-robin 轮询负载均衡);支持 REST API 监控端口(8081)。
追踪失败的步骤编号(failed_step)与失败的组件(failed_components),提供分阶段回滚能力:InnoDB Cluster 销毁、集群元数据清理、MySQL Router 卸载、MySQL 安装回滚、系统配置还原。保证失败后环境可整洁重试。
安装完成后自动创建测试库与测试数据,提供 MGR 集群状态验证、健康检查(health_check)、读写分离验证等能力。
本工具基于二进制方式安装 MySQL 8/9,对操作系统的要求如下:
| 操作系统 | 版本 | 支持状态 | 说明 |
|---|---|---|---|
| RHEL(Red Hat Enterprise Linux) | 9.x | 推荐(主要测试环境) | 官方推荐运行环境 |
| Oracle Linux(OEL) | 9.x | 支持 | 与 RHEL 兼容 |
| Kylin Linux(麒麟) | 9.x | 支持 | 国产化适配 |
| CentOS Stream | 9.x | 兼容 | 社区版本 |
| 其他 RHEL 系衍生发行版 | 9.x | 可能兼容 | 需自行验证 |
说明:
每个节点的硬件资源配置建议如下:
| 资源 | 最低要求 | 推荐配置(生产) | 说明 |
|---|---|---|---|
| CPU | 2 核 | 4 核及以上 | MGR 对 CPU 有一定要求 |
| 内存 | 4 GB | 8 GB 及以上 | innodb_buffer_pool_size 建议设为物理内存的 50%-70% |
| 磁盘 | 50 GB | 100 GB 及以上(SSD) | 数据目录建议使用 SSD,提升 IO 性能 |
| 网络 | 千兆网卡 | 万兆网卡 | MGR 节点间通信对网络延迟敏感 |
| 磁盘类型 | HDD | SSD | 数据目录、binlog、redo log 建议 SSD |
| 包名 | 版本要求 | 用途 |
|---|---|---|
| Python | 3.6+(推荐 3.9+) | 运行环境 |
| paramiko | 4.0.0 | SSH 远程连接与文件传输 |
| pyyaml | 6.0 | YAML 配置文件解析 |
| cryptography | 47.0.0 | 加密支持(paramiko 依赖) |
| invoke | 3.0.3 | 命令执行辅助 |
| bcrypt | 5.0.0 | SSH 密钥处理依赖 |
| pynacl | 1.6.2 | 加密依赖 |
| cffi | 2.0.0 | CFFI 绑定 |
| pycparser | 2.23 | C 解析器 |
| typing_extensions | 4.15.0 | 类型扩展 |
控制机需安装 Python 3 及上述扩展包。工具在 python-pkgs 目录中附带了离线安装包(.whl 与 .tar.gz),支持在无网络环境下离线安装。在线安装可使用 pip3 install -r requirements.txt。
工具会在安装过程中自动通过 yum 安装以下系统包:
| 系统包 | 用途 |
|---|---|
| libaio | Linux 异步 IO 库(MySQL 依赖) |
| numactl | NUMA 内存管理工具 |
| perl | Perl 运行时(MySQL 部分脚本依赖) |
| net-tools | 网络工具(含 netstat 等) |
| wget | 文件下载工具 |
| tar | 解压工具 |
| openssh-clients | SSH 客户端工具 |
| socat | 网络数据转发工具 |
| openssl | 加密库 |
需提前将以下 MySQL 二进制安装包放置在每台目标主机的 /tmp 目录:
| 组件 | 软件包名称示例 | 放置位置 | 说明 |
|---|---|---|---|
| MySQL Server | mysql-community-server-9.7.0-el9-x86_64.tar.gz | /tmp | 数据库服务端 |
| MySQL Shell | mysql-shell-9.7.0-linux-glibc2.28-x86_64.tar.gz | /tmp | 集群管理工具 |
| MySQL Router | mysql-router-9.7.0-linux-glibc2.28-x86_64.tar.gz | /tmp | 读写分离代理 |
说明:工具支持在 /tmp 目录下自动扫描并选择匹配的安装包版本,无需严格固定文件名。
| 端口 | 组件 | 用途 | 状态 |
|---|---|---|---|
| 22 | SSH | 远程管理与文件传输 | 必须开放 |
| 3306 | MySQL Server | 数据库连接端口 | 必须开放 |
| 33060 | MySQL Server | X Protocol 端口(MySQL Shell 连接) | 必须开放 |
| 33006 | MGR | 组复制成员间通信 | 必须开放 |
| 6446 | MySQL Router | 读写端口(连接主节点) | 必须开放 |
| 6447 | MySQL Router | 只读端口(连接从节点,轮询) | 必须开放 |
| 6450 | MySQL Router | X Protocol 读写分离端口 | 可选开放 |
| 8081 | MySQL Router | REST API 监控端口 | 可选开放 |
| 33066 | MySQL Server | Admin 端口 | 内部使用 |
注意:配置文件中 MGR 通信端口为 33006(与部分文档示例中的 33061 不同,以实际 中 group_replication_local_address 配置为准)。
| 组件 | 最小数量 | 推荐数量 | 说明 |
|---|---|---|---|
| MySQL Server(MGR 数据节点) | 3 台 | 3-9 台 | 奇数台保证仲裁 |
| MySQL Router(代理节点) | 2 台 | 2-4 台 | 可与 MySQL Server 共享主机 |
| MySQL Shell(管理工具) | 3 台 | 与 Cluster 节点相同 | 建议安装在每个数据节点 |
工具的目录结构如下:
FGMySQLAutoInstall_IC1.2/
├── FGMySQLAutoInstall_IC.py # 主程序脚本(自动化安装核心逻辑)
├── mysql_config.yaml # 配置文件(所有参数集中管理)
├── requirements.txt # Python 依赖包清单
├── docs/ # 文档目录
│ ├── README.md # 功能说明文档
│ ├── README2.md # 详细说明手册(本文档)
│ └── INSTALL.md # 安装指南(Step by Step)
├── logs/ # 日志目录(安装日志按时间戳命名)
│ └── mysql_mgr_install_<时间戳>.log
├── python-pkgs/ # Python 离线安装包目录
│ ├── paramiko-4.0.0-*.whl
│ ├── pyyaml-6.0-*.whl
│ └── ...(其他依赖)
└── __pycache__/ # Python 编译缓存(自动生成)
安装后的 MySQL 相关目录结构(目标主机上):
/mysql/
├── app/
│ ├── mysql/ # MySQL Server 安装目录
│ ├── mysql-shell/ # MySQL Shell 安装目录
│ └── mysql-route/ # MySQL Router 安装目录
├── data/
│ ├── 3306/
│ │ ├── data/ # MySQL 数据目录
│ │ └── my.cnf # MySQL 配置文件
│ └── mysqlrouter/ # Router 数据目录
└── log/
├── 3306/ # MySQL 日志目录
│ ├── fgedudb-error.err # MySQL 错误日志
│ ├── fgedudb-query.log # 慢查询日志
│ └── binlog/ # binlog 目录
├── mysqlsh/ # MySQL Shell 日志
└── mysqlrouter/ # MySQL Router 日志
/backup/ # 备份目录(LVM 自动创建)
# 安装 Python 3 与 pip(如未安装)
sudo yum install -y python3 python3-pip
# 在线安装依赖包
pip3 install -r requirements.txt
# 或离线安装(使用 python-pkgs 目录)
cd python-pkgs
pip3 install --no-index --find-links=. -r ../requirements.txt
将 MySQL Server、MySQL Shell、MySQL Router 三类二进制包上传到每台目标主机的 /tmp 目录:
# 上传 MySQL Server 到所有数据节点
for ip in 192.168.1.51 192.168.1.52 192.168.1.53; do
scp mysql-community-server-9.7.0-el9-x86_64.tar.gz root@$ip:/tmp/
done
# 上传 MySQL Shell 到所有数据节点
for ip in 192.168.1.51 192.168.1.52 192.168.1.53; do
scp mysql-shell-9.7.0-linux-glibc2.28-x86_64.tar.gz root@$ip:/tmp/
done
# 上传 MySQL Router 到 Router 节点
for ip in 192.168.1.51 192.168.1.52; do
scp mysql-router-9.7.0-linux-glibc2.28-x86_64.tar.gz root@$ip:/tmp/
done
编辑 ,根据实际环境修改以下关键配置项:
innodb_cluster.cluster_members:InnoDB Cluster 成员 IP 列表innodb_cluster.mysql_routers:Router 节点 IP 列表mgr.group_replication_group_seeds:MGR 种子节点列表mysql.root_password:MySQL root 密码ssh.username / ssh.password / ssh.port:SSH 连接凭据说明:命令行参数会覆盖配置文件中的 IP 和 SSH 设置,因此也可以在执行命令时通过命令行参数指定,无需修改配置文件。
# 验证 Python 环境
python3 --version
pip3 list | grep paramiko
# 验证 SSH 连通性
for ip in 192.168.1.51 192.168.1.52 192.168.1.53; do
ssh -o ConnectTimeout=5 root@$ip "hostname"
done
# 验证软件包
for ip in 192.168.1.51 192.168.1.52 192.168.1.53; do
ssh root@$ip "ls -lh /tmp/mysql*.tar.*"
done
配置文件 采用 YAML 格式,包含以下主要配置段:
innodb_cluster:
cluster_members: # Cluster 成员 IP 列表(必须 3 台)
- 192.168.1.51
- 192.168.1.52
- 192.168.1.53
cluster_name: fgedu-innodb-cluster # 集群名称
mysql_routers: # Router 节点 IP 列表(至少 2 台)
- 192.168.1.51
- 192.168.1.52
router_ports:
classic: 6446 # 读写端口
xprotocol: 6450 # X Protocol 读写分离端口
admin: 6447 # 只读端口
cluster_admin_user: clusteradmin # 集群管理用户
cluster_admin_password: clusteradmin_123 # 集群管理用户密码
topology_mode: Single-Primary # 拓扑模式(Single-Primary 或 Multi-Primary)
expel_timeout: 5 # 成员驱逐超时(秒)
member_weight: 50 # 成员权重(故障转移选举权重)
mgr:
group_name: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1 # MGR 组名(UUID 格式,所有节点一致)
group_replication_mode: single-primary # 复制模式
group_replication_local_address: '{host_ip}:33006' # 本地通信地址({host_ip} 自动替换)
group_replication_group_seeds: 192.168.1.51:33006,192.168.1.52:33006,192.168.1.53:33006
autorejoin_tries: 288 # 自动重连尝试次数(约 2 小时)
member_expel_timeout: 5 # 成员驱逐超时
member_weight: 50
replication_user: mgr_repl # MGR 复制用户
replication_password: mgr_repl_123
mysql_shell:
install_dir: /mysql/app/mysql-shell # 安装目录
mysqlsh_path: /usr/bin/mysqlsh # mysqlsh 可执行文件路径(符号链接)
version: 9.7.0 # 版本
mysqlsh_options: --sql --log-level=INFO
mysql_router:
install_dir: /mysql/app/mysql-route # 安装目录
config_dir: /etc/mysqlrouter # 配置目录
log_dir: /mysql/log/mysqlrouter # 日志目录
data_dir: /mysql/data/mysqlrouter # 数据目录
bootstrap_user: clusteradmin # Bootstrap 用户
bootstrap_password: clusteradmin_123
bootstrap_address: 192.168.1.51:3306 # Bootstrap 地址(主节点)
routing_strategies:
read_write: first-available # 读写策略(优先第一个可用节点)
read_only: round-robin # 只读策略(轮询负载均衡)
max_connections: 1024
enable_rest_api: true # 启用 REST API
rest_port: 8081 # 监控端口
mysql:
install_dir: /mysql/app/mysql # 安装目录
data_dir: /mysql/data/3306/data # 数据目录
log_dir: /mysql/log/3306 # 日志目录
port: 3306 # 端口
root_password: fgedu123 # root 密码
version: 9.7.0
binary_package: /tmp/mysql-community-server-9.7.0-el9-x86_64.tar.gz
my_cnf: # my.cnf 配置参数
innodb_buffer_pool_size: 2G
max_connections: 300
# ... 更多参数
system:
packages: # 系统依赖包
- libaio
- numactl
- perl
# ...
lvm: # LVM 逻辑卷配置
- vg_name: mysqlvg
lv_name: mysqllv
pv_devices: /dev/sdc
mount_point: /mysql
filesystem: xfs
size: 50G
kernel: # 内核参数
fs.file-max: 655350
net.core.somaxconn: 65535
vm.swappiness: 1
# ...
security: # 安全配置
firewall: disabled
selinux: disabled
numa: disabled
ssh:
username: root
password: rootroot
port: 22
timeout: 30
retry_count: 3
test:
database: fgedudb
user: fgedu
password: fgedu123
table: fgtest_table
table_structure: 'id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), value INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP'
test_data:
- name: fgtest01
value: 100
- name: fgtest02
value: 200
| 参数 | 全称 | 说明 | 示例 |
|---|---|---|---|
| -ic | --ic-hosts | InnoDB Cluster 成员 IP(至少 3 台,逗号分隔) | -ic 192.168.1.51,192.168.1.52,192.168.1.53 |
| -shell | --shell-hosts | MySQL Shell 安装 IP(通常与 -ic 相同) | -shell 192.168.1.51,192.168.1.52,192.168.1.53 |
| -route | --route-hosts | MySQL Router 安装 IP(至少 2 台) | -route 192.168.1.51,192.168.1.52 |
| -u | --username | SSH 用户名 | -u root |
| -p | --password | SSH 密码 | -p rootroot |
| 参数 | 全称 | 说明 | 默认值 |
|---|---|---|---|
| -P | --port | SSH 端口 | 22 |
| -c | --config | 配置文件路径 | mysql_config.yaml |
| --cluster-name | - | 指定 InnoDB Cluster 名称(覆盖配置文件) | fgedu-innodb-cluster |
| --recreate-cluster | - | 强制重新创建集群(删除现有集群) | False |
| --verify-only | - | 仅验证环境不执行安装 | False |
基本使用流程如下:
基本安装命令:
python FGMySQLAutoInstall_IC.py \
-ic 192.168.1.51,192.168.1.52,192.168.1.53 \
-shell 192.168.1.51,192.168.1.52,192.168.1.53 \
-route 192.168.1.51,192.168.1.52 \
-u root \
-p rootroot
工具将 InnoDB Cluster 的部署分为三个阶段,每个阶段完成后自动进入下一阶段:
| 阶段 | 名称 | 内容 | 预计耗时 |
|---|---|---|---|
| 阶段一 | MGR | 并行安装 3 台 MySQL Server,配置 MGR 单主组复制集群 | 10-15 分钟 |
| 阶段二 | Shell + Cluster | 安装 MySQL Shell,通过 adoptFromGR 创建 InnoDB Cluster | 5-8 分钟 |
| 阶段三 | Router | 安装 2 台 MySQL Router,Bootstrap 读写分离配置 | 5-8 分钟 |
| 合计 | - | 完整 InnoDB Cluster 部署 | 20-30 分钟 |
以下通过十个典型场景,详细说明工具的操作过程。
场景描述:在 3 台服务器(192.168.1.51、192.168.1.52、192.168.1.53)上部署 MySQL 8/9 InnoDB Cluster,在 2 台服务器(192.168.1.51、192.168.1.52)上部署 MySQL Router,SSH 用户为 root,密码为 rootroot。
操作步骤:
for ip in 192.168.1.51 192.168.1.52 192.168.1.53; do
ssh root@$ip "ls -lh /tmp/mysql*.tar.*"
done
python FGMySQLAutoInstall_IC.py \
-ic 192.168.1.51,192.168.1.52,192.168.1.53 \
-shell 192.168.1.51,192.168.1.52,192.168.1.53 \
-route 192.168.1.51,192.168.1.52 \
-u root \
-p rootroot
工具自动执行以下流程:
安装完成后,输出集群状态、节点角色、Router 端口、连接信息与管理命令。
场景描述:在正式安装前,先对目标环境进行体检,验证网络连通性、端口可用性、软件包完整性等,不执行任何安装操作。
操作命令:
python FGMySQLAutoInstall_IC.py \
-ic 192.168.1.51,192.168.1.52,192.168.1.53 \
-shell 192.168.1.51,192.168.1.52,192.168.1.53 \
-route 192.168.1.51,192.168.1.52 \
-u root \
-p rootroot \
--verify-only
说明:--verify-only 参数使工具仅更新配置文件并退出,不执行安装。可结合手动检查命令进一步验证:
# 检查端口占用
for ip in 192.168.1.51 192.168.1.52 192.168.1.53; do
ssh root@$ip "ss -tlnp | grep -E '3306|33060|33006|6446|6447|6450'"
done
场景描述:上次安装过程中,阶段一(MGR)和阶段二(Shell + Cluster)已成功完成,但阶段三(Router)安装失败。重新执行时希望跳过已完成的阶段,直接从 Router 安装继续。
操作命令:
python FGMySQLAutoInstall_IC.py \
-ic 192.168.1.51,192.168.1.52,192.168.1.53 \
-shell 192.168.1.51,192.168.1.52,192.168.1.53 \
-route 192.168.1.51,192.168.1.52 \
-u root \
-p rootroot
说明:工具内置断点续装机制,会自动检测:
已完成的阶段会显示"已安装完成,将跳过",直接进入下一阶段。无需额外参数。
场景描述:希望将 InnoDB Cluster 命名为 mycluster,而非配置文件中的默认名称 fgedu-innodb-cluster。
操作命令:
python FGMySQLAutoInstall_IC.py \
-ic 192.168.1.51,192.168.1.52,192.168.1.53 \
-shell 192.168.1.51,192.168.1.52,192.168.1.53 \
-route 192.168.1.51,192.168.1.52 \
-u root \
-p rootroot \
--cluster-name mycluster
说明:--cluster-name 参数会覆盖配置文件中的 innodb_cluster.cluster_name,创建的 InnoDB Cluster 将使用指定的名称。
场景描述:集群已存在但状态异常,需要删除现有集群并重新创建。
操作命令:
python FGMySQLAutoInstall_IC.py \
-ic 192.168.1.51,192.168.1.52,192.168.1.53 \
-shell 192.168.1.51,192.168.1.52,192.168.1.53 \
-route 192.168.1.51,192.168.1.52 \
-u root \
-p rootroot \
--recreate-cluster
说明:--recreate-cluster 参数会先销毁现有的 InnoDB Cluster 并清理元数据,然后重新创建集群。适用于集群状态损坏、元数据不一致等场景。
场景描述:目标主机的 SSH 服务运行在 2222 端口,而非默认的 22 端口。
操作命令:
python FGMySQLAutoInstall_IC.py \
-ic 192.168.1.51,192.168.1.52,192.168.1.53 \
-shell 192.168.1.51,192.168.1.52,192.168.1.53 \
-route 192.168.1.51,192.168.1.52 \
-u root \
-p rootroot \
-P 2222
说明:-P(或 --port)参数指定 SSH 端口,默认为 22。该参数会写入配置文件的 ssh.port 字段。
场景描述:已准备了一份自定义配置文件 /opt/myconfig.yaml,希望使用该文件而非默认的 mysql_config.yaml。
操作命令:
python FGMySQLAutoInstall_IC.py \
-ic 192.168.1.51,192.168.1.52,192.168.1.53 \
-shell 192.168.1.51,192.168.1.52,192.168.1.53 \
-route 192.168.1.51,192.168.1.52 \
-u root \
-p rootroot \
-c /opt/myconfig.yaml
说明:-c(或 --config)参数指定配置文件路径。工具会读取该文件,并将命令行参数(SSH 凭据、集群成员、Router 成员等)写入该文件后再执行。
场景描述:安装完成后,验证 MySQL Router 的读写分离功能是否正常。
操作步骤:
mysql -h 192.168.1.51 -P 6446 -u root -pfgedu123 -e "SELECT @@hostname, @@read_only;"
# 预期输出:主节点主机名,read_only=0
mysql -h 192.168.1.51 -P 6447 -u root -pfgedu123 -e "SELECT @@hostname, @@read_only;"
# 预期输出:从节点主机名,read_only=1
# 多次执行可观察到主机名在多个从节点间轮询
# 写入数据(走主节点)
mysql -h 192.168.1.52 -P 6450 -u root -pfgedu123 -e "INSERT INTO fgedudb.fgtest_table VALUES (3,'fgedu03',300);"
# 查询数据(走从节点)
mysql -h 192.168.1.51 -P 6450 -u root -pfgedu123 -e "SELECT * FROM fgedudb.fgtest_table;"
mysqlsh clusteradmin@192.168.1.51:6446 -e "cluster = dba.getCluster(); cluster.status();"
场景描述:安装完成后的日常运维操作。
mysqlsh clusteradmin@192.168.1.51:6446
# 在 MySQL Shell 中执行
cluster = dba.getCluster()
cluster.status()
mysql -h 192.168.1.51 -P 3306 -u root -pfgedu123 -e "SELECT * FROM performance_schema.replication_group_members;"
systemctl status mysqlrouter # 查看状态
systemctl restart mysqlrouter # 重启
systemctl stop mysqlrouter # 停止
systemctl start mysqlrouter # 启动
systemctl status mysqld # 查看状态
systemctl restart mysqld # 重启
systemctl stop mysqld # 停止
systemctl start mysqld # 启动
场景描述:集群出现节点故障或整体故障时的恢复操作。
# 在故障节点上执行
mysql -u root -pfgedu123 -e "STOP GROUP_REPLICATION; START GROUP_REPLICATION;"
# 验证节点状态
mysql -u root -pfgedu123 -e "SELECT * FROM performance_schema.replication_group_members;"
mysql -u root -pfgedu123 -e "SET GLOBAL group_replication_bootstrap_group=ON;"
mysql -u root -pfgedu123 -e "START GROUP_REPLICATION;"
mysql -u root -pfgedu123 -e "SET GLOBAL group_replication_bootstrap_group=OFF;"
# 重启 Router 服务
systemctl restart mysqlrouter
# 如需重新 Bootstrap
sudo mysqlrouter --bootstrap clusteradmin@192.168.1.51:3306 \
--directory=/mysql/data/mysqlrouter --force
# 清理测试库
mysql -h 192.168.1.51 -P 6446 -u clusteradmin -pclusteradmin_123 -e "DROP DATABASE IF EXISTS fgedudb;"
mysql -h 192.168.1.51 -P 6446 -u clusteradmin -pclusteradmin_123 -e "DROP USER IF EXISTS 'fgedu'@'%';"
# 清理临时文件
for ip in 192.168.1.51 192.168.1.52 192.168.1.53; do
ssh root@$ip "rm -rf /tmp/mysql*.tar.*"
done
现象:pip3 install paramiko 报错。
排查与解决:
# 安装系统依赖
sudo yum install -y libffi-devel openssl-devel gcc gcc-c++
# 重新安装
pip3 install paramiko==4.0.0
# 或使用离线包安装
cd python-pkgs
pip3 install --no-index --find-links=. paramiko==4.0.0
现象:加载配置文件时报 YAML 解析错误。
排查与解决:
pip3 uninstall pyyaml -y
pip3 install pyyaml==6.0
现象:cryptography 编译安装报错。
排查与解决:
sudo yum install -y libffi-devel openssl-devel
pip3 install cryptography==47.0.0
# 如仍有问题,设置环境变量
export CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
现象:离线安装时出现依赖冲突。
排查与解决:
pip3 install --ignore-installed --no-index --find-links=. paramiko==4.0.0
现象:工具提示网络连通性检查失败。
排查与解决:
# 检查网络连通性
ping <目标主机IP>
nc -zv -w 5 <目标主机IP> 22
# 检查 SSH 服务状态
ssh root@<目标主机IP> "systemctl status sshd"
现象:SSH 连接提示主机密钥验证失败。
排查与解决:
ssh-keygen -R <目标主机IP>
ssh-keyscan -H <目标主机IP> >> ~/.ssh/known_hosts
现象:工具提示认证失败。
排查与解决:确认命令行 -u 和 -p 参数与目标主机的实际 SSH 凭据一致。
现象:工具提示"主机 X 未找到 MySQL 安装包"。
排查与解决:
# 确认软件包已上传到 /tmp 目录
ssh root@<目标主机IP> "ls -lh /tmp/mysql*.tar.*"
# 如缺失,上传软件包
scp mysql-community-server-9.7.0-el9-x86_64.tar.gz root@<目标主机IP>:/tmp/
现象:MySQL 启动失败,提示端口 3306 已被占用。
排查与解决:
# 查看占用进程
ss -tlnp | grep :3306
# 或
sudo lsof -i :3306
# 停止占用进程或使用工具清理
# 工具检测到已存在 MySQL 时会提示清理选项(y=清理并安装, s=跳过, n=取消)
现象:工具检测到已存在的 MySQL 并提示选择。
排查与解决:根据提示选择:
现象:START GROUP_REPLICATION 报错,提示 group_replication.so 未找到。
排查与解决:
mysql -u root -pfgedu123 -e "INSTALL PLUGIN group_replication SONAME 'group_replication.so';"
现象:节点无法加入 MGR 集群。
排查与解决:
# 确保所有节点使用相同的 group_name
mysql -u root -pfgedu123 -e "SHOW GLOBAL VARIABLES LIKE 'group_replication_group_name';"
现象:成员状态长时间停留在 RECOVERING。
排查与解决:
/mysql/log/3306/fgedudb-error.err现象:工具误判 MySQL Shell 已安装或未安装。
排查与解决:工具会同时检查实际安装目录(/mysql/app/mysql-shell/bin/mysqlsh)与符号链接(/usr/bin/mysqlsh)。如符号链接失效会自动清理。手动检查:
ls -la /mysql/app/mysql-shell/bin/mysqlsh
ls -la /usr/bin/mysqlsh
现象:MySQL Shell 9.7 在 JavaScript 模式下出现 GraalVM 兼容性问题。
排查与解决:工具已将集群配置脚本从 JavaScript 模式迁移到 Python 模式,避免兼容性问题。确保使用与工具匹配的 MySQL Shell 版本(9.7.0)。
现象:adoptFromGR 创建集群时报错。
排查与解决:
# 检查 MySQL X Protocol 是否启用
mysql -u root -pfgedu123 -e "SHOW VARIABLES LIKE 'mysqlx_port';"
# 预期:33060
# 检查 clusteradmin 用户权限
mysql -u root -pfgedu123 -e "SHOW GRANTS FOR 'clusteradmin'@'%';"
# 查看 MySQL 错误日志
tail -100 /mysql/log/3306/fgedudb-error.err
现象:工具提示元数据版本检查异常。
排查与解决:工具在安装前会检查 metadata_version。如版本不一致,可使用 --recreate-cluster 参数强制重新创建集群。
现象:Router Bootstrap 命令执行失败。
排查与解决:
# 检查 clusteradmin 用户权限与主节点连通性
mysql -h 192.168.1.51 -P 3306 -u clusteradmin -pclusteradmin_123 -e "SELECT 1;"
# 手动 Bootstrap 测试
sudo mysqlrouter --bootstrap clusteradmin@192.168.1.51:3306 \
--directory=/mysql/data/mysqlrouter --force
# 查看端口是否开放
ssh root@192.168.1.51 "ss -tlnp | grep -E '6446|6447|6450'"
现象:Router 启动失败,提示端口被占用。
排查与解决:
# 查看占用进程
sudo lsof -i :6446
sudo lsof -i :6447
# 工具内置端口冲突自动调整功能,会自动递增寻找可用端口
# 如需手动处理,停止占用进程后重启 Router
systemctl restart mysqlrouter
现象:通过 6446 端口查询返回的是从节点(read_only=1)。
排查与解决:
# 检查集群状态,确认主节点是否在线
mysqlsh clusteradmin@192.168.1.51:6446 -e "cluster = dba.getCluster(); cluster.status();"
# 如主节点故障,Router 会自动切换到新的主节点
# 检查 Router 日志
tail -100 /mysql/log/mysqlrouter/mysqlrouter.log
现象:通过 6447 端口查询返回的是主节点。
排查与解决:
安装与运维过程中,相关日志文件位置如下:
| 日志类型 | 文件路径 | 说明 |
|---|---|---|
| 安装日志 | logs/mysql_mgr_install_时间戳.log | 工具执行的完整操作记录 |
| MySQL 错误日志 | /mysql/log/3306/fgedudb-error.err | MySQL Server 错误信息 |
| MySQL 慢查询日志 | /mysql/log/3306/fgedudb-query.log | 慢查询记录(阈值 5 秒) |
| MySQL 通用日志 | /mysql/log/3306/fgedudb-general.err | 通用查询日志(默认关闭) |
| binlog 日志 | /mysql/log/3306/binlog/fgedudb-binlog.* | 二进制日志 |
| MySQL Shell 日志 | /mysql/log/mysqlsh/mysqlsh.log | Shell 操作日志 |
| MySQL Router 日志 | /mysql/log/mysqlrouter/mysqlrouter.log | Router 运行日志 |
| 阶段 | 时间范围 | 说明 |
|---|---|---|
| 阶段一(MGR) | 10-15 分钟 | 并行安装 3 台 MySQL Server 并配置 MGR |
| 阶段二(Shell + Cluster) | 5-8 分钟 | 安装 MySQL Shell 并配置 InnoDB Cluster |
| 阶段三(Router) | 5-8 分钟 | 安装 MySQL Router(2 台) |
| 总计 | 20-30 分钟 | 完整安装时间 |
| 安装方式 | 耗时 | 效率 |
|---|---|---|
| 串行安装 | 约 45 分钟 | 基准 |
| 并行安装 | 约 20 分钟 | 提升 55%+ |
| 参数 | 建议值 | 说明 |
|---|---|---|
| innodb_buffer_pool_size | 物理内存的 50%-70% | 根据服务器内存调整 |
| max_connections | 300-2048 | 根据并发量调整 |
| innodb_io_capacity | 2000-4000 | 根据磁盘 IO 能力调整 |
| vm.swappiness | 1-5 | 减少 swap 使用 |
| fs.file-max | 655350 | 文件描述符上限 |
| net.core.somaxconn | 65535 | TCP 连接队列 |
| member_expel_timeout | 5-30 | 防止网络抖动误驱逐 |
| autorejoin_tries | 288 | 约 2 小时自动重连尝试 |
| 资源 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核+ |
| 内存 | 4 GB | 8 GB+ |
| 磁盘 | 50 GB | 100 GB+ SSD |
| 网络 | 千兆网卡 | 万兆网卡 |
作者:风哥
官方网站 http://www.fgedu.net.cn , http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html
mysql MGR组复制集群一键安装教程 https://edu.51cto.com/course/40556.html
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。