MySQL Cluster 基於 NDB 存儲引擎,提供共享無架構、自動分片、高可用 (99.999%)、單點故障秒級故障轉移。本文記錄單機多端口模擬三節點 (管理、數據×2、SQL) 部署全流程,供學習與測試參考。生產環境必須跨物理機部署。
| 節點類型 | 進程 | 職責 |
|---|---|---|
| 管理節點 (MGM) | ndb_mgmd | 集群配置、啟動協調、狀態監控、仲裁 |
| 數據節點 (NDB) | ndbd / ndbmtd | 存儲數據/索引、同步複寫、事務協調、檢查點 |
| SQL 節點 (API) | mysqld | 接收客戶端 SQL、解析優化、轉發 NDB API 請求 |
啟動順序:ndb_mgmd → ndbd → mysqld
# 下載 MySQL Cluster 通用二進制包 (含 ndb_mgmd, ndbd, mysqld)
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster-gpl-7.6.10-linux-glibc2.12-x86_64.tar.gz
tar -zxvf mysql-cluster-gpl-*.tar.gz
cd mysql-cluster-gpl-*
# 建立工作目錄
mkdir -p /opt/mysql-cluster/{mgmd,ndbd1,ndbd2,mysqld}/{data,logs,conf}
/opt/mysql-cluster/mgmd/conf/config.ini[NDBD DEFAULT]
NoOfReplicas=2 # 兩副本,需至少 2 數據節點
DataMemory=512M # 數據內存 (含索引)
IndexMemory=128M # 索引內存 (舊版參數,新版合併)
MaxNoOfTables=2048
MaxNoOfOrderedIndexes=512
[TCP DEFAULT]
# PortNumber=2202 # 建議使用默認 1186,免配置
[NDB_MGMD]
HostName=192.168.0.10 # 管理節點 IP
NodeId=1
DataDir=/opt/mysql-cluster/mgmd/data
LogDestination=FILE:filename=/opt/mysql-cluster/mgmd/logs/mgmd.log
[NDBD]
HostName=192.168.0.11 # 數據節點 1 IP
NodeId=2
DataDir=/opt/mysql-cluster/ndbd1/data
[NDBD]
HostName=192.168.0.12 # 數據節點 2 IP
NodeId=3
DataDir=/opt/mysql-cluster/ndbd2/data
[MYSQLD]
HostName=192.168.0.13 # SQL 節點 IP
NodeId=4
# 可配置多個 [MYSQLD] 區段對應多個 SQL 節點
/opt/mysql-cluster/ndbd1/conf/my.cnf (ndbd2 同理修改路徑/NodeId)[mysqld]
ndbcluster # 啟用 NDB 存儲引擎
ndb-connectstring=192.168.0.10:1186 # 管理節點 IP:Port
[mysql_cluster]
ndb-connectstring=192.168.0.10:1186
# 可選:MySQL 服務參數
datadir=/opt/mysql-cluster/ndbd1/data
port=3306
socket=/tmp/mysql_ndbd1.sock
/opt/mysql-cluster/mysqld/conf/my.cnf[mysqld]
ndbcluster
ndb-connectstring=192.168.0.10:1186
datadir=/opt/mysql-cluster/mysqld/data
port=3306
socket=/tmp/mysql_cluster.sock
# 一般 MySQL 參數...
key_buffer_size=32M
innodb_buffer_pool_size=64M # InnoDB 仍可用於非 NDB 表
# 1. 啟動管理節點 (首次加 --initial 初始化元數據)
cd /opt/mysql-cluster
bin/ndb_mgmd -f mgmd/conf/config.ini --initial --configdir=mgmd/conf
# 2. 驗證管理節點
bin/ndb_mgm -e "SHOW"
# 應顯示 2 個 NDB 節點 "not connected, accepting connect",1 個 MGM 節點 connected
# 3. 啟動數據節點 (首次加 --initial 格式化本地數據目錄)
bin/ndbd --defaults-file=ndbd1/conf/my.cnf --initial
bin/ndbd --defaults-file=ndbd2/conf/my.cnf --initial
# 4. 驗證數據節點就緒
bin/ndb_mgm -e "SHOW"
# 兩個 NDB 節點應變為 "connected",顯示 Nodegroup、Master 角色
# 5. 初始化 SQL 節點系統表
bin/mysqld --defaults-file=mysqld/conf/my.cnf --initialize-insecure --user=mysql
# 或已有數據目錄直接啟動
bin/mysqld --defaults-file=mysqld/conf/my.cnf &
# 6. 驗證 SQL 節點接入
bin/ndb_mgm -e "SHOW"
# 應顯示 [MYSQLD(API)] 1 node(s) connected
# 連接 SQL 節點
mysql -h 192.168.0.13 -P 3306 -u root
# 必須指定 ENGINE=NDB
CREATE DATABASE test_cluster;
USE test_cluster;
CREATE TABLE t1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50)
) ENGINE=NDB;
INSERT INTO t1 VALUES (1, 'node1'), (2, 'node2');
SELECT * FROM t1;
# 觀察數據分片分佈
ndb_mgm -e "ALL REPORT MEMORYUSAGE"
ndb_mgm -e "ALL DUMP 1000" # 打印分片映射
# 管理客戶端
ndb_mgm -h 192.168.0.10 -p 1186
# 狀態總覽
ndb_mgm -e "SHOW"
# 節點重啟 (滾動重啟不停服)
ndb_mgm -e "2 RESTART" # 重啟 NodeId=2 數據節點
# 內存使用報告
ndb_mgm -e "ALL REPORT MEMORYUSAGE"
# 備份 (線上熱備,不加鎖)
ndb_mgm -e "START BACKUP 1" # 備份 ID=1
# 備份文件生成在各數據節點 DataDir/BACKUP/BACKUP-/
# 恢復
ndb_restore -b 1 -n 2 -m -r /opt/mysql-cluster/ndbd1/data/BACKUP/BACKUP-1/
# 關閉集群
ndb_mgm -e "SHUTDOWN"
DataMemory + IndexMemory ≤ 物理內存 80%,預留 OS、NDB 進程、檢查點緩衝。ArbitrationRank、ArbitrationTimeout 防腦裂,奇數節點或仲裁器 (mgmd) 決定存活分區。DataMemoryUsage、IndexMemoryUsage、RedoLogSpace、TransactionLatency、NodeState。MySQL Cluster 以共享無架構實現真正的線性擴展與極致高可用,但運維複雜度遠超主從/InnoDB Cluster。適用於電信級計費、遊戲狀態、會話存儲等強一致、高併發、容錯要求極高的核心業務。學習階段單機多端口驗證流程,生產務必跨機房多可用區部署。