MySQL 分布式集群系列 · 第四篇——实操部署指南:从零搭建生产级 MySQL NDB 集群

目 录

回顾与导读:把原理变成可上线的集群

[第一章 环境准备](#第一章 环境准备)

[1.1 系统选型与主机规划](#1.1 系统选型与主机规划)

[1.2 端口规划](#1.2 端口规划)

[1.3 系统账号与权限](#1.3 系统账号与权限)

创建专用系统账号

[1.4 内核参数优化](#1.4 内核参数优化)

[第二章 软件安装与分步部署](#第二章 软件安装与分步部署)

[2.1 获取与安装软件包](#2.1 获取与安装软件包)

[安装 NDB Cluster 二进制包](#安装 NDB Cluster 二进制包)

[2.2 部署顺序:先管理、再数据、后 SQL](#2.2 部署顺序:先管理、再数据、后 SQL)

[2.3 管理节点部署](#2.3 管理节点部署)

启动管理节点

[2.4 数据节点部署](#2.4 数据节点部署)

启动数据节点

[2.5 SQL 节点部署](#2.5 SQL 节点部署)

[初始化并启动 SQL 节点](#初始化并启动 SQL 节点)

[第三章 核心配置文件详解](#第三章 核心配置文件详解)

[3.1 config.ini:集群的"总蓝图"](#3.1 config.ini:集群的"总蓝图")

[config.ini 完整示例](#config.ini 完整示例)

[3.2 关键参数解读](#3.2 关键参数解读)

[3.3 my.cnf:SQL 节点接入配置](#3.3 my.cnf:SQL 节点接入配置)

[SQL 节点 my.cnf 示例](#SQL 节点 my.cnf 示例)

[3.4 分片与容错参数的工程权衡](#3.4 分片与容错参数的工程权衡)

[第四章 集群启动、状态检查与基础运维](#第四章 集群启动、状态检查与基础运维)

[4.1 启动顺序与状态验证](#4.1 启动顺序与状态验证)

集群状态检查

[4.2 节点扩容实操](#4.2 节点扩容实操)

在线添加数据节点

[4.3 常用运维命令速查](#4.3 常用运维命令速查)

[4.4 常见问题排查](#4.4 常见问题排查)

[第五章 NDB 建表规范与业务表适配](#第五章 NDB 建表规范与业务表适配)

[5.1 NDB 表创建要求](#5.1 NDB 表创建要求)

[NDB 建表示例](#NDB 建表示例)

[5.2 不支持的字段与语法](#5.2 不支持的字段与语法)

[5.3 业务表适配改造指南](#5.3 业务表适配改造指南)

[第六章 基础读写测试与可用性验证](#第六章 基础读写测试与可用性验证)

[6.1 基础读写测试](#6.1 基础读写测试)

读写与分片验证

[6.2 高可用验证:故障转移实验](#6.2 高可用验证:故障转移实验)

故障转移验证

[6.3 备份与恢复验证](#6.3 备份与恢复验证)

在线备份与恢复

[6.4 可用性检查清单](#6.4 可用性检查清单)

读者收获与下一步

[7.1 读完本篇,你应该带走什么](#7.1 读完本篇,你应该带走什么)

[7.2 下一步建议](#7.2 下一步建议)

回顾与导读:把原理变成可上线的集群

前三篇我们建立了 NDB 的完整认知:它是什么、由什么组成、为什么高性能。但认知终归要落到环境上------这一篇开始动手,从零搭建一套生产级的 NDB 集群。

本篇以 5 台 CentOS 7.9 服务器为例(1 管理节点 + 2 数据节点 + 2 SQL 节点),基于 MySQL NDB Cluster 8.0 版本,走完环境准备、安装配置、启动验证、建表测试的全流程。文中所有配置与命令均可直接照抄,建议跟随操作同步验证。

开始之前,请确保你对前三篇的架构概念(管理/数据/SQL 节点职责、节点组与副本、config.ini 的作用)还有印象------本篇文章的每一步都对应着前面的原理。

第一章 环境准备

1.1 系统选型与主机规划

NDB Cluster 支持 Linux、Windows 等平台,生产环境推荐使用 Linux(RHEL/CentOS 7+、Ubuntu 等)。官方建议:不同类型节点尽量独立部署,数据节点必须独占服务器。

|------------|---------------|--------------|---------------|
| 主机 | 节点角色 | 建议配置 | 说明 |
| mgm01 | 管理节点 ndb_mgmd | 2C4G | 双管理节点时再加一台 |
| ndb01 | 数据节点 ndbd | 4C16G+ | 内存越大越好,决定容量 |
| ndb02 | 数据节点 ndbd | 4C16G+ | 与 ndb01 构成节点组 |
| sql01 | SQL 节点 mysqld | 4C8G | 业务接入,可多台 |
| sql02 | SQL 节点 mysqld | 4C8G | 配合负载均衡消除单点 |

1.2 端口规划

NDB 集群节点间通过 TCP 通信,默认端口如下。生产环境建议在防火墙中仅对必要的端口放行,并对管理面与数据面网络做隔离。

|-------------|-----------------|------------------|--------------|
| 端口 | 默认值 | 用途 | 开放范围 |
| 1186 | 管理节点端口 | 节点注册、配置分发、心跳监控 | 所有节点到管理节点 |
| 2202 | 数据节点间通信 | 数据同步、内部心跳 | 数据节点之间 |
| 3306 | SQL 节点 MySQL 端口 | 业务连接 | 业务网段到 SQL 节点 |
| 63132-63163 | 数据节点 API 通信 | SQL/API 节点对接数据节点 | SQL 节点到数据节点 |

1.3 系统账号与权限

严禁使用 root 直接运行 NDB 相关进程,生产环境必须创建专用账号:

创建专用系统账号

在每台主机上执行 groupadd mysql useradd -g mysql -s /sbin/nologin mysql mkdir -p /usr/local/mysql-ndb # 安装目录 mkdir -p /var/lib/ndb # 数据目录 chown -R mysql:mysql /usr/local/mysql-ndb /var/lib/ndb

1.4 内核参数优化

NDB 是网络密集型 + 内存密集型系统,以下内核参数值得在数据节点上重点调整:

  • 文件句柄:fs.file-max 调大(如 6553600),ulimit -n 同步调大,支撑大量并发连接。
  • 网络缓冲区:增大 net.core.rmem_max / wmem_max,降低高频同步的网络丢包与延迟。
  • 内存相关:关闭 THP(透明大页)或配置为 madvise,避免大页导致的延迟抖动;vm.swappiness 调低(如 10),减少内存回收压力。
  • 时钟同步:部署 NTP/chrony,节点间时钟偏差过大会影响事务时间戳与故障判定。

内核参数修改会立即影响运行中的进程,建议在安装前完成配置并重启验证。

第二章 软件安装与分步部署

2.1 获取与安装软件包

MySQL NDB Cluster 提供统一的二进制发行包(包含 ndb_mgmd、ndbd、mysqld 等全部组件),从 MySQL 官方下载对应平台的发行包后,在每台主机上解压并配置环境变量即可:

安装 NDB Cluster 二进制包

以 CentOS 7 x86_64 为例(版本号按实际替换) tar -xzf mysql-cluster-gpl-8.0.x-linux-glibc2.12-x86_64.tar.gz mv mysql-cluster-gpl-8.0.x-*/* /usr/local/mysql-ndb/ chown -R mysql:mysql /usr/local/mysql-ndb echo "export PATH=/usr/local/mysql-ndb/bin:$PATH" >> /etc/profile source /etc/profile

注意:管理节点与数据节点只需用到 bin 下的 NDB 工具与守护进程;SQL 节点则使用标准的 mysqld。安装后可用 ndb_mgm --version 验证。

2.2 部署顺序:先管理、再数据、后 SQL

NDB 集群对启动顺序有严格要求:管理节点必须先于其他所有节点启动,因为数据节点与 SQL 节点启动时都需要向管理节点注册并获取配置。

  • 第 1 步:启动管理节点(ndb_mgmd)------等待其就绪。
  • 第 2 步:依次启动所有数据节点(ndbd)------观察其完成注册并进入 STARTED 状态。
  • 第 3 步:启动 SQL 节点(mysqld)------连接验证可用性。

这个顺序背后的原理来自第二篇:管理节点是集群的"管控层",节点注册与配置分发都依赖它先就位。

2.3 管理节点部署

管理节点的核心是配置文件 config.ini,它定义了整个集群的拓扑与全部参数。创建 /var/lib/ndb/config.ini(详细参数解读见第三章),然后启动:

启动管理节点

在 mgm01 上执行 ndb_mgmd -f /var/lib/ndb/config.ini --configdir=/var/lib/ndb/ ndb_mgm -e SHOW # 验证管理节点就绪

2.4 数据节点部署

数据节点启动时通过 --ndb-connectstring 指定管理节点地址,自动完成注册并拉取配置:

启动数据节点

在 ndb01、ndb02 上分别执行 ndbd --ndb-connectstring=mgm01:1186 --ndb-nodeid=3 # 节点3 ndbd --ndb-connectstring=mgm01:1186 --ndb-nodeid=4 # 节点4 # 启动后可在管理节点上观察状态 ndb_mgm -e "ALL STATUS"

2.5 SQL 节点部署

SQL 节点是标准 mysqld,其配置(my.cnf)中通过 ndbcluster 与 ndb-connectstring 选项接入集群。首次启动还需初始化数据目录:

初始化并启动 SQL 节点

在 sql01、sql02 上分别执行 mysqld --initialize-insecure --datadir=/var/lib/mysql # 首次初始化 mysqld --defaults-file=/etc/my.cnf & # 启动 # 客户端验证 mysql -uroot -e "SELECT VERSION();"

SQL 节点启动后,可通过 SHOW ENGINE NDBCLUSTER STATUS 查看其与集群的连接状态。

第三章 核心配置文件详解

3.1 config.ini:集群的"总蓝图"

config.ini 是管理节点的核心配置文件,定义了所有节点的身份、内存分配、分片与容错参数。以下是一个 1 管理 + 2 数据 + 2 SQL 节点集群的完整示例:

config.ini 完整示例

ndbd default NoOfReplicas=2 # 副本数=2,节点组内互为备份 DataMemory=8G # 数据内存,决定数据容量 IndexMemory=2G # 索引内存 MaxNoOfExecutionThreads=8 # 数据节点执行线程数(ndbmtd) DataDir=/var/lib/ndb # 数据目录 ndb_mgmd NodeId=1 HostName=mgm01 # 管理节点主机 DataDir=/var/lib/ndb ndbd NodeId=3 HostName=ndb01 # 数据节点 1 ndbd NodeId=4 HostName=ndb02 # 数据节点 2 mysqld NodeId=5 HostName=sql01 # SQL 节点 1 mysqld NodeId=6 HostName=sql02 # SQL 节点 2

3.2 关键参数解读

|-------------------------|------------|---------------------|
| 参数 | 含义 | 配置要点 |
| NoOfReplicas | 数据副本数 | 生产至少 2;越高容错越强但写开销越大 |
| DataMemory | 数据内存上限 | 决定每个数据节点可存多少表数据 |
| IndexMemory | 索引内存上限 | 哈希/有序索引占用的内存 |
| MaxNoOfExecutionThreads | 执行线程数 | 越大并行度越高,按 CPU 核数设置 |
| DataDir | 数据目录 | Redo Log、检查点文件存放位置 |

配置要点:NoOfReplicas=2 时,数据节点必须成对出现(形成节点组);DataMemory 与 IndexMemory 之和不能超过节点物理内存的约 80%,需预留系统与日志空间。

3.3 my.cnf:SQL 节点接入配置

SQL 节点 my.cnf 示例

mysqld ndbcluster # 启用 NDB 引擎 ndb-connectstring=mgm01:1186 # 指向管理节点 ndb-nodeid=5 # 与 config.ini 中 NodeId 一致 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock character-set-server=utf8mb4 mysql_cluster ndb-connectstring=mgm01:1186

3.4 分片与容错参数的工程权衡

  • 副本数 vs 写性能:NoOfReplicas=2 是多数场景的平衡点;提高到 3~4 可容忍更多节点同时故障,但每次写入的副本确认开销同步上升。
  • 数据节点数 vs 节点组数:节点组数 = 数据节点数 ÷ 副本数,节点组越多,数据打散粒度越细、并行度越高,但跨分区事务也会增多。
  • 内存分配:DataMemory 直接决定可承载的数据量,业务规划时应预留 30% 以上余量,避免扩容前就内存告急。

第四章 集群启动、状态检查与基础运维

4.1 启动顺序与状态验证

再次强调启动顺序:管理节点 → 数据节点 → SQL 节点。全部启动后,用管理客户端检查集群整体状态:

集群状态检查

ndb_mgm -e SHOW # 期望输出示例 Node 1: connected (Version 8.0.x) Node 3: started (ndbd, nodegroup 0, master) Node 4: started (ndbd, nodegroup 0) Node 5: started (mysqld) Node 6: started (mysqld)

在 SQL 节点上执行 SHOW ENGINE NDBCLUSTER STATUS,应能看到与所有数据节点的连接。看到 "started" 与 connected 字样,说明集群已就绪。

4.2 节点扩容实操

NDB 支持在线添加数据节点(形成新节点组),全程业务无中断。基本流程:

在线添加数据节点

1. 在 config.ini 中新增 ndbd 段并配置新 NodeId # 2. 滚动重启管理节点使配置生效 ndb_mgm -e "1 RESTART" # 3. 启动新数据节点 ndbd --ndb-connectstring=mgm01:1186 --ndb-nodeid=5 # 4. 将已有表重新分布到新节点组 ALTER TABLE t REORGANIZE PARTITION; # 逐表执行 # 5. 验证新节点状态 ndb_mgm -e "ALL STATUS"

4.3 常用运维命令速查

|-------------------------------------|------------------|
| 命令 | 用途 |
| ndb_mgm -e SHOW | 查看集群拓扑与各节点状态 |
| ndb_mgm -e "ALL STATUS" | 查看所有节点运行状态 |
| ndb_mgm -e "1 STOP" / "1 START" | 停止/启动指定编号节点 |
| ndb_mgm -e "3 RESTART" | 滚动重启指定节点(配合参数升级) |
| ndb_mgm -e "ALL REPORT MEMORYUSAGE" | 查看各数据节点内存使用 |
| ndb_mgm -e "START BACKUP" | 在线一致性备份 |
| ndb_restore | 从备份恢复 |
| ndb_desc -d db t | 查看 NDB 表的分区与副本信息 |

4.4 常见问题排查

  • 数据节点一直处于 "starting":检查管理节点是否已启动、--ndb-connectstring 是否指向正确、端口 1186 是否可达。
  • 节点显示 "not connected":检查网络与防火墙,确认心跳超时阈值配置(HeartbeatIntervalDbDb)是否合理。
  • SQL 节点连不上集群:检查 my.cnf 的 ndb-connectstring 与 ndb-nodeid 是否与 config.ini 一致。
  • 内存不足报错:DataMemory/IndexMemory 超出物理内存,或表数据量已逼近上限,需扩容节点内存或增加数据节点。

第五章 NDB 建表规范与业务表适配

5.1 NDB 表创建要求

使用 NDB 引擎建表,必须遵循以下硬性要求:

  • 表必须有主键(或唯一键)------NDB 依赖主键进行哈希分片与行定位。
  • 表类型使用 ENGINE=NDBCLUSTER(可简写 NDB)。
  • 所有使用 NDB 的表必须显式声明主键,否则建表失败。

NDB 建表示例

CREATE TABLE account ( id BIGINT UNSIGNED NOT NULL, name VARCHAR(64) NOT NULL, balance DECIMAL(18,2) NOT NULL DEFAULT 0, status TINYINT NOT NULL DEFAULT 1, PRIMARY KEY (id) ) ENGINE=NDBCLUSTER COMMENT="account table" DEFAULT CHARSET=utf8mb4;

5.2 不支持的字段与语法

|---------------|---------------------------------------------|
| 限制项 | 说明 |
| 外键约束 | NDB 8.0 支持外键需启用特定选项,传统外键大量使用受限,建议应用层保证引用完整性 |
| TEXT/BLOB 大字段 | 支持但需通过隐藏表间接存储,访问效率低、有额外限制 |
| FULLTEXT 全文索引 | NDB 表不支持全文索引 |
| 事务隔离级别 | 仅支持 READ COMMITTED |
| 在线 DDL | 部分 ALTER 操作需复制表或重建分区,重表变更要规划窗口 |
| JOIN 性能 | 跨分区 JOIN 代价高,应尽量减少或改写为应用层聚合 |

5.3 业务表适配改造指南

把一张现有 InnoDB 表迁移到 NDB,通常需要做以下改造:

  • 补主键:没有主键的表必须设计主键(业务单号、自增 ID、联合唯一键均可)。
  • 拆大字段:将 TEXT/BLOB 列拆分到单独表,或改为 VARCHAR 上限(NDB 单列长度受行大小限制)。
  • 缩窄行宽:NDB 对行大小有限制(8.0 中行最大约 14KB),宽表需瘦身,过长字段建议拆表。
  • 去外键:将外键约束改为应用层校验,或在 NDB 8.0 中显式启用外键支持。
  • 改查询:避免无主键全表扫描与复杂 JOIN,查询尽量以主键/唯一键驱动。

改造原则一句话:让每条 SQL 都能快速定位到少数分区,这是 NDB 高性能的前提,也是前面第三篇"访问模式决定性能"的落地。

第六章 基础读写测试与可用性验证

6.1 基础读写测试

读写与分片验证

-- 1. 建表并写入 CREATE TABLE t_user (id BIGINT PRIMARY KEY, name VARCHAR(64)) ENGINE=NDBCLUSTER; INSERT INTO t_user VALUES (1,"alice"),(2,"bob"),(3,"carol"); -- 2. 查询验证 SELECT * FROM t_user WHERE id=2; -- 主键查询,走单分区 -- 3. 事务验证(多行写入原子性) START TRANSACTION; INSERT INTO t_user VALUES (4,"dave"); UPDATE t_user SET name="alice2" WHERE id=1; COMMIT; -- 4. 查看分区分布 ndb_desc -d test t_user; -- 显示分区与副本所在节点

6.2 高可用验证:故障转移实验

这是验证集群"是否真的高可用"的关键一步。以 2 数据节点(节点组 0)为例:

故障转移验证

1. 在管理节点观察正常状态 ndb_mgm -e "ALL STATUS" # 2. 强制停止一个数据节点(模拟宕机) ndb_mgm -e "3 STOP" # 3. 业务侧继续读写(应无感知) mysql -h sql01 -e "SELECT * FROM t_user WHERE id=1;" mysql -h sql01 -e "INSERT INTO t_user VALUES (5,"eve");" # 4. 观察集群自动容错 ndb_mgm -e "ALL STATUS" # 节点3 stopped,但集群仍提供服务 # 5. 恢复节点 ndb_mgm -e "3 START"

实验预期:停止节点 3 后,集群继续正常读写(因为节点 4 持有全部副本);恢复节点 3 后,数据自动重新同步,集群回到双副本状态。若停止节点 3 后业务不可用,说明配置或副本布局有问题,需回查 config.ini 与节点组配置。

6.3 备份与恢复验证

在线备份与恢复

备份(业务不停) ndb_mgm -e "START BACKUP" # 恢复流程 ndb_restore -b 1 -n 3 --backup-dir=/var/lib/ndb/BACKUP/BACKUP-1/ ndb_restore -b 1 -n 4 --backup-dir=/var/lib/ndb/BACKUP/BACKUP-1/

6.4 可用性检查清单

  • 全部节点 SHOW 输出为 started / connected。
  • 建表 + 读写 + 事务提交均正常。
  • 停任一数据节点后读写不受影响,节点恢复后自动回补数据。
  • 在线备份可成功执行并完成恢复演练。
  • 重启管理节点后集群可正常重新拉起(双管理节点场景验证主备切换)。

完成以上验证,一套可直接上线的生产级 NDB 集群就绪。

相关推荐
IT大白鼠1 小时前
MySQL 分布式集群系列 · 第三篇——核心原理精讲:NDB 自动分片、多主写入与数据同步
数据库·分布式·mysql
Elastic 中国社区官方博客1 小时前
教程:使用 ES|QL 进行威胁狩猎
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·安全威胁分析
斑马1393 小时前
Linux软件编程学习笔记(十三)——数据库
数据库·oracle
初願致夕霞3 小时前
MySQL_索引
数据库·mysql
十六年开源服务商4 小时前
2026网站备份方案完整指南
数据库·oracle
一只小李郁vickie4 小时前
mysql 开启压缩传输3402条数据2.1秒压缩到毫秒级
数据库·mysql
张继雁5 小时前
张继雁 个人技术简介|磨削加工过滤方向
大数据·数据库·论文阅读·人工智能·机器学习·创业创新·业界资讯
IvorySQL5 小时前
PostgreSQL 日报|不重启动态修改 shared_buffers(9 月 8 日)
数据库·postgresql
这个DBA有点耶5 小时前
2026年做数据库开发,国产数据库已经是绕不开的选项了
数据库·dba·敏捷开发