目 录
[第一章 环境准备](#第一章 环境准备)
[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 集群就绪。