MySQL Cluster (NDB) 採用 **Shared-Nothing** 架構,最小高可用拓撲為:
本文環境:
Server1 (Data+SQL): 192.168.0.1 mysql1.vmtest.net
Server2 (Data+SQL): 192.168.0.2 mysql2.vmtest.net
Server3 (Mgmt) : 192.168.0.3 mysql3.vmtest.net
必須使用 mysql-max 或 cluster 版本 (含 NDB 存儲引擎),Standard 版不支援。下載 mysql-cluster-gpl-7.x.x-linux-glibc2.12-x86_64.tar.gz (現代版本建議 7.6/8.0)。
mkdir -p /opt/mysql-cluster /var/lib/mysql-cluster
cd /opt/mysql-cluster
tar xzf mysql-cluster-*.tar.gz
ln -s mysql-cluster-* mysqlc
# 僅提取管理工具
cp mysqlc/bin/ndb_mgm* /usr/local/bin/
chmod +x /usr/local/bin/ndb_mgm*
# 配置文件 /var/lib/mysql-cluster/config.ini
cat > /var/lib/mysql-cluster/config.ini <<'EOF'
[ndbd default]
NoOfReplicas=2
DataMemory=256M
IndexMemory=32M
[mysqld default]
[ndb_mgmd default]
[tcp default]
[ndb_mgmd]
HostName=192.168.0.3
NodeId=1
[ndbd]
HostName=192.168.0.1
NodeId=2
DataDir=/var/lib/mysql-cluster
[ndbd]
HostName=192.168.0.2
NodeId=3
DataDir=/var/lib/mysql-cluster
[mysqld]
NodeId=4
HostName=192.168.0.1
[mysqld]
NodeId=5
HostName=192.168.0.2
EOF
# 啟動管理節點
ndb_mgmd --config-file=/var/lib/mysql-cluster/config.ini --initial
# 安裝 MySQL Cluster 二進制 (同管理節點解壓路徑)
# 建立 mysql 用戶、目錄權限...
# 配置 /etc/my.cnf
cat > /etc/my.cnf <<'EOF'
[mysqld]
ndbcluster
ndb-connectstring=192.168.0.3
datadir=/var/lib/mysql
basedir=/opt/mysql-cluster/mysqlc
port=3306
[mysql_cluster]
ndb-connectstring=192.168.0.3
EOF
# 初始化數據節點 (僅首次或 config.ini 變更後)
mkdir -p /var/lib/mysql-cluster
/opt/mysql-cluster/mysqlc/bin/ndbd --initial
# 啟動 SQL 節點
/opt/mysql-cluster/mysqlc/bin/mysqld_safe --defaults-file=/etc/my.cnf &
# Server3 執行
ndb_mgm -e show
預期輸出:
Connected to Management Server at: 192.168.0.3:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.1 (Version: 8.0.x, Nodegroup: 0, Master)
id=3 @192.168.0.2 (Version: 8.0.x, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.3 (Version: 8.0.x)
[mysqld(API)] 2 node(s)
id=4 @192.168.0.1 (Version: 8.0.x)
id=5 @192.168.0.2 (Version: 8.0.x)
# Server1
mysql -u root -h 127.0.0.1 -e "CREATE DATABASE test; USE test; CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER; INSERT INTO ctest VALUES (1); SELECT * FROM ctest;"
# Server2 驗證同步
mysql -u root -h 127.0.0.1 -e "USE test; INSERT INTO ctest VALUES (2); SELECT * FROM ctest;"
# 應看到 1,2 兩行
# Server1 拔網線或 kill -9 ndbd 進程
# Server2 查詢仍正常
# Server3 ndb_mgm -e show 觀察 Node 2 狀態變為 "not started"
# 故障恢復
# Server1 重啟 ndbd (無需 --initial)
ndbd
# 集群自動同步增量數據,幾秒內恢復同步
| 項目 | 建議 |
|---|---|
| DataMemory/IndexMemory | 按數據量規劃,預留 30% 緩衝,避免 OOM |
| NoOfReplicas | 生產建議 2,極高可用可 3 (需 3 數據節點) |
| 網絡 | 專用 VLAN/交換機跑 Cluster 通訊,MTU 9000 Jumbo Frame |
| 磁碟 | NDB 數據目錄掛載 NVMe/SSD,Redo/Undo 日誌分盤 |
| 監控 | Prometheus mysqld_exporter + ndb_mgm -e "ALL REPORT MEMORYUSAGE" 定時抓取 |
| 備份 | ndb_mgm -e "START BACKUP" 線上熱備,配合 ndb_restore 恢復 |
MySQL NDB Cluster 提供真正的 **同步多主高可用**,但運維複雜度遠超主從/半同步複制。兩數據節點 + 一管理節點是最小 HA 閉環,**管理節點請保持常駐** 以應對網絡分區仲裁。若業務能接受最終一致性,Galera Cluster (PXC) 或 MGR 往往是更輕量的選擇。