MySQL Cluster 是一种高性能、高可用、可扩展的分布式数据库解决方案,基于 NDB (Network Database) 存储引擎构建,专为满足对数据一致性和实时性要求严苛的应用场景设计,与传统的 MySQL 主从复制不同,MySQL Cluster 采用“无共享”(Shared-Nothing) 架构,所有数据节点在内存中存储数据,并通过高速网络进行同步,确保节点故障时数据不丢失且服务快速恢复,本文将详细介绍 MySQL Cluster 的架构、部署步骤、核心配置及最佳实践。

MySQL Cluster 架构概述
MySQL Cluster 主要由三类节点组成:管理节点 (Management Node, MGM)、数据节点 (Data Node, NDB) 和 SQL 节点 (SQL Node,即 MySQL Server),各节点职责如下:
| 节点类型 | 职描述 |
|---|---|
| 管理节点 (MGM) | 负责集群的配置管理、节点状态监控、启动/停止节点等,通常部署 2-3 个节点实现高可用。 |
| 数据节点 (NDB) | 存储实际数据,数据在内存中管理,并通过 LCP (Checkpoint) 持久化到磁盘,每个数据节点可属于不同数据分区 (Partition),实现数据分片。 |
| SQL 节点 | 提供标准的 MySQL 服务器接口,应用程序通过 SQL 节点访问集群数据,本身不存储数据,仅转发查询到数据节点。 |
MySQL Cluster 还依赖 管理客户端 (ndb_mgm) 进行集群管理,以及 数据节点守护进程 (ndbd) 和 管理节点守护进程 (ndb_mgmd) 运行各节点服务。
MySQL Cluster 部署步骤
以部署一个包含 2 个管理节点、2 个数据节点和 2 个 SQL 节点的集群为例,环境为 Linux (Ubuntu 20.04),MySQL Cluster 版本为 8.0.28。
环境准备
- 节点规划:
- MGM 节点:192.168.1.10 (mgm1)、192.168.1.11 (mgm2)
- 数据节点:192.168.1.20 (ndb1)、192.168.1.21 (ndb2)
- SQL 节点:192.168.1.30 (sql1)、192.168.1.31 (sql2)
- 依赖安装:所有节点安装
libaio1、libncurses5等依赖:sudo apt update && sudo apt install -y libaio1 libncurses5
- 用户与权限:创建
mysql用户并赋予相关权限,确保节点间无密码 SSH 互信(可选,便于管理)。
下载并解压 MySQL Cluster
从 MySQL 官网 下载适用于 Linux 的 MySQL Cluster 8.0.28 压缩包,并解压到 /usr/local/mysql-cluster 目录,所有节点需使用相同的版本和安装路径。

配置管理节点
在管理节点上创建配置文件 /usr/local/mysql-cluster/config.ini如下:
[ndbd default] # 数据节点默认配置 NoOfReplicas=2 # 每个数据分区副本数(建议为偶数,2) DataMemory=512M # 数据内存大小 IndexMemory=128M # 索引内存大小 MaxNoOfConcurrentOperations=32768 # 并发操作数 [ndb_mgmd] # 管理节点配置 NodeId=1 # 节点唯一 ID Hostname=192.168.1.10 # 管理节点 1 的 IP DataDir=/usr/local/mysql-cluster/data # 数据存储目录 [ndb_mgmd] NodeId=2 Hostname=192.168.1.11 DataDir=/usr/local/mysql-cluster/data [ndbd] # 数据节点 1 NodeId=11 Hostname=192.168.1.20 DataDir=/usr/local/mysql-cluster/data [ndbd] # 数据节点 2 NodeId=12 Hostname=192.168.1.21 DataDir=/usr/local/mysql-cluster/data [mysqld] # SQL 节点配置(可重复定义多个) NodeId=21 Hostname=192.168.1.30 [mysqld] NodeId=22 Hostname=192.168.1.31
说明:
NoOfReplicas决定数据冗余度,2 表示每个数据分区有 2 个副本,分布在不同的数据节点上。DataMemory和IndexMemory需根据实际数据量调整,避免内存溢出。
启动管理节点
在管理节点上创建数据目录,并启动管理节点守护进程:
sudo mkdir -p /usr/local/mysql-cluster/data sudo /usr/local/mysql-cluster/bin/ndb_mgmd -f /usr/local/mysql-cluster/config.ini --initial
首次启动需使用 --initial,后续重启可省略,备用管理节点可通过相同命令启动,自动实现高可用。

启动数据节点
在数据节点上创建数据目录,并启动数据节点守护进程:
sudo mkdir -p /usr/local/mysql-cluster/data sudo /usr/local/mysql-cluster/bin/ndbd --initial
同样,首次启动需 --initial,启动后可通过 ndb_mgm -e "show" 查看节点状态,显示 “STARTED” 表示成功。
配置并启动 SQL 节点
在 SQL 节点上安装 MySQL Server,并修改配置文件 /etc/mysql/my.cnf,添加:
[mysqld] ndbcluster # 启用 NDB 集群模式 ndb-connectstring=192.168.1.10,192.168.1.11 # 管理节点 IP 列表
启动 MySQL 服务,并登录验证:
sudo systemctl restart mysql mysql -u root -p
执行 SHOW STATUS LIKE 'Ndb%' 检查是否连接到集群,若 Ndb_connected 为 “Connected” 则成功。
核心特性与优化
数据分片与冗余
MySQL Cluster 自动将数据分片 (Partition) 存储到不同的数据节点,分片数量由 NoOfFrags (默认 4) 决定,每个分片通过 NoOfReplicas 指定副本数,2 个副本时,数据会同时存储在 2 个数据节点上,实现容错。
事务支持
NDB 存储引擎支持 ACID 事务,通过两阶段提交 (2PC) 确保分布式事务的一致性,事务提交时,数据会同步到所有副本节点,确保故障恢复时数据不丢失。
内存管理
数据主要存储在内存中,访问速度极快(微秒级响应),但需合理配置 DataMemory 和 IndexMemory,避免因内存不足导致性能下降,可通过 ndb_size.pl 工具估算所需内存。
高可用与故障恢复
- 数据节点故障:副本机制保证数据不丢失,集群自动将请求切换到健康副本,故障恢复后自动同步数据。
- 管理节点故障:备用管理节点自动接管,不影响数据节点和 SQL 节点运行。
常见问题与最佳实践
-
性能优化:
- 调整
MaxNoOfConcurrentOperations以提高并发处理能力。 - 避免大事务,尽量拆分为小事务,减少锁竞争。
- 使用
ndb_desc表检查分片分布,避免数据倾斜。
- 调整
-
监控与维护:
- 使用
ndb_mgm或 MySQL Cluster Manager (MCM) 监控集群状态。 - 定期备份数据:可通过
mysqldump --ndbcluster导出数据,或使用 NDB 自带的备份功能。
- 使用
相关问答 FAQs
Q1:MySQL Cluster 与 MySQL 主从复制有何区别?
A:MySQL Cluster 采用“无共享”架构,数据在内存中同步,节点间通过高速网络通信,支持多主写入和毫秒级故障切换;而主从复制是基于二进制日志的异步/半同步复制,通常仅支持主从写入,故障恢复时间较长(秒级到分钟级),Cluster 适合高并发、低延迟场景,主从复制适合读写分离和简单容错场景。
Q2:如何处理 MySQL Cluster 内存溢出问题?
A:内存溢出通常因 DataMemory 或 IndexMemory 不足导致,可通过以下步骤解决:
- 使用
ndb_show_tables和ndb_desc检查表大小和索引占用。 - 增加
DataMemory和IndexMemory配置,重启数据节点。 - 优化表结构,减少不必要的字段和索引;或分库分表,降低单表数据量。
