贝博恩创新科技网

MySQL Cluster教程,如何快速搭建与配置?

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

MySQL Cluster教程,如何快速搭建与配置?-图1
(图片来源网络,侵删)

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)
  • 依赖安装:所有节点安装 libaio1libncurses5 等依赖:
    sudo apt update && sudo apt install -y libaio1 libncurses5
  • 用户与权限:创建 mysql 用户并赋予相关权限,确保节点间无密码 SSH 互信(可选,便于管理)。

下载并解压 MySQL Cluster

MySQL 官网 下载适用于 Linux 的 MySQL Cluster 8.0.28 压缩包,并解压到 /usr/local/mysql-cluster 目录,所有节点需使用相同的版本和安装路径。

MySQL Cluster教程,如何快速搭建与配置?-图2
(图片来源网络,侵删)

配置管理节点

在管理节点上创建配置文件 /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 个副本,分布在不同的数据节点上。
  • DataMemoryIndexMemory 需根据实际数据量调整,避免内存溢出。

启动管理节点

在管理节点上创建数据目录,并启动管理节点守护进程:

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,后续重启可省略,备用管理节点可通过相同命令启动,自动实现高可用。

MySQL Cluster教程,如何快速搭建与配置?-图3
(图片来源网络,侵删)

启动数据节点

在数据节点上创建数据目录,并启动数据节点守护进程:

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) 确保分布式事务的一致性,事务提交时,数据会同步到所有副本节点,确保故障恢复时数据不丢失。

内存管理

数据主要存储在内存中,访问速度极快(微秒级响应),但需合理配置 DataMemoryIndexMemory,避免因内存不足导致性能下降,可通过 ndb_size.pl 工具估算所需内存。

高可用与故障恢复

  • 数据节点故障:副本机制保证数据不丢失,集群自动将请求切换到健康副本,故障恢复后自动同步数据。
  • 管理节点故障:备用管理节点自动接管,不影响数据节点和 SQL 节点运行。

常见问题与最佳实践

  1. 性能优化

    • 调整 MaxNoOfConcurrentOperations 以提高并发处理能力。
    • 避免大事务,尽量拆分为小事务,减少锁竞争。
    • 使用 ndb_desc 表检查分片分布,避免数据倾斜。
  2. 监控与维护

    • 使用 ndb_mgm 或 MySQL Cluster Manager (MCM) 监控集群状态。
    • 定期备份数据:可通过 mysqldump --ndbcluster 导出数据,或使用 NDB 自带的备份功能。

相关问答 FAQs

Q1:MySQL Cluster 与 MySQL 主从复制有何区别?
A:MySQL Cluster 采用“无共享”架构,数据在内存中同步,节点间通过高速网络通信,支持多主写入和毫秒级故障切换;而主从复制是基于二进制日志的异步/半同步复制,通常仅支持主从写入,故障恢复时间较长(秒级到分钟级),Cluster 适合高并发、低延迟场景,主从复制适合读写分离和简单容错场景。

Q2:如何处理 MySQL Cluster 内存溢出问题?
A:内存溢出通常因 DataMemoryIndexMemory 不足导致,可通过以下步骤解决:

  1. 使用 ndb_show_tablesndb_desc 检查表大小和索引占用。
  2. 增加 DataMemoryIndexMemory 配置,重启数据节点。
  3. 优化表结构,减少不必要的字段和索引;或分库分表,降低单表数据量。
分享:
扫描分享到社交APP
上一篇
下一篇