MySQL NDB Cluster(原 MySQL Cluster)是共享無、多主同步複寫、自動分片、內存為主的高可用架構。核心三角色:
Server1 (192.168.0.1) : Data Node 1 + SQL Node 1
Server2 (192.168.0.2) : Data Node 2 + SQL Node 2
Server3 (192.168.0.3) : Management Node (可兼輕量應用)
關鍵點:僅 2 台 Data Node 無法容忍單點故障後繼續服務(需仲裁),故必須有第 3 台獨立 Management Node 做仲裁者。生產建議 4+ Data Node (2 Node Groups) + 2 Management Node。
ndb_mgmd, ndbd, ndbmtd),標準 Server 版不含 NDB 存儲引擎。mysql-cluster-gpl-8.0.xx-linux-glibc2.12-x86_64.tar.gz。groupadd mysql
useradd -r -g mysql -s /bin/false mysql
mkdir -p /opt/mysql-cluster
tar -zxf mysql-cluster-gpl-8.0.xx-linux-glibc2.12-x86_64.tar.gz -C /opt/mysql-cluster
ln -s /opt/mysql-cluster/mysql-cluster-gpl-8.0.xx-linux-glibc2.12-x86_64 /opt/mysql-cluster/current
chown -R mysql:mysql /opt/mysql-cluster/current
mkdir -p /var/lib/mysql-cluster
cat > /var/lib/mysql-cluster/config.ini <<'EOF'
[ndbd default]
NoOfReplicas=2 # 兩副本,需 2 Data Node
DataMemory=512M # 數據內存 (按實際調整)
IndexMemory=128M # 索引內存
MaxNoOfConcurrentOperations=100000
[mysqld default]
BatchSize=256
[ndb_mgmd default]
[tcp default]
# Management Node
[ndb_mgmd]
NodeId=1
HostName=192.168.0.3
DataDir=/var/lib/mysql-cluster
# Data Nodes
[ndbd]
NodeId=2
HostName=192.168.0.1
DataDir=/var/lib/mysql-cluster
[ndbd]
NodeId=3
HostName=192.168.0.2
DataDir=/var/lib/mysql-cluster
# SQL Nodes (留空 HostName 允許任意主機連接)
[mysqld]
NodeId=4
[mysqld]
NodeId=5
EOF
/opt/mysql-cluster/current/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
# --initial 僅首次或 config.ini 變更後使用
# 驗證
/opt/mysql-cluster/current/bin/ndb_mgm -e show
cat > /etc/my.cnf <<'EOF'
[mysqld]
ndbcluster # 啟用 NDB 存儲引擎
ndb-connectstring=192.168.0.3 # Management Node IP
default_storage_engine=ndbcluster
[mysql_cluster]
ndb-connectstring=192.168.0.3
EOF
mkdir -p /var/lib/mysql-cluster
/opt/mysql-cluster/current/bin/ndbd --initial # 首次或配置變更
# 加入開機自啟
echo "/opt/mysql-cluster/current/bin/ndbd" >> /etc/rc.local
/opt/mysql-cluster/current/scripts/mysql_install_db --user=mysql --basedir=/opt/mysql-cluster/current --datadir=/opt/mysql-cluster/current/data
chown -R mysql:mysql /opt/mysql-cluster/current/data
/opt/mysql-cluster/current/bin/mysqld_safe --user=mysql &
# 設置 root 密碼
/opt/mysql-cluster/current/bin/mysqladmin -u root password 'StrongPass123!'
[root@mgmt ~]# /opt/mysql-cluster/current/bin/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.xx, Nodegroup: 0, Master)
id=3 @192.168.0.2 (Version: 8.0.xx, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.3 (Version: 8.0.xx)
[mysqld(API)] 2 node(s)
id=4 (Version: 8.0.xx)
id=5 (Version: 8.0.xx)
關鍵指標:2 Data Node 同屬 Nodegroup 0、狀態為 Master/非 Master、2 SQL Node 就緒。
# 在 Server1 (SQL Node 1)
mysql -u root -p -e "
CREATE DATABASE test_cluster;
USE test_cluster;
CREATE TABLE ctest (id INT PRIMARY KEY, val VARCHAR(50)) ENGINE=NDBCLUSTER;
INSERT INTO ctest VALUES (1, 'from server1');
SELECT * FROM ctest;
"
# 在 Server2 (SQL Node 2) 驗證同步
mysql -u root -p -e "USE test_cluster; SELECT * FROM ctest; INSERT INTO ctest VALUES (2, 'from server2');"
# 回 Server1 確認雙向同步
mysql -u root -p -e "USE test_cluster; SELECT * FROM ctest;"
# 應見 id=1,2 兩行
# Server1 上
pkill -9 ndbd
# 或拔網線
# 觀察:Server2 繼續服務,Management Node show 顯示 Node 2 disconnected
# 恢復:Server1 重啟 ndbd (無需 --initial)
/opt/mysql-cluster/current/bin/ndbd
# 數據自動同步追趕
# Server3 上
pkill ndb_mgmd
# 現象:Data Node + SQL Node 繼續運行(無管理節點不影響數據面)
# 風險:若此時再掛一個 Data Node,無仲裁者將導致集群整體停止 (Split-brain 保護)
# 恢復:重啟 ndb_mgmd
Server1/Server2 心跳網絡斷開但各自與 Management Node 通信正常 → 仲裁機制決定哪個 Node Group 存活,另一組主動關閉。這就是為什麼需要奇數節點/獨立仲裁者。
| 指標 | 工具/命令 | 告警閾值 |
|---|---|---|
| Data Node 狀態 | ndb_mgm -e "ALL STATUS" | 非 STARTED 即告警 |
| 內存使用率 | ndb_mgm -e "ALL REPORT MEMORYUSAGE" | DataMemory > 80% / IndexMemory > 80% |
| 磁盤使用率 | ndb_mgm -e "ALL REPORT MEMORYUSAGE" (含 DiskData) | > 85% |
| 複製延遲 | ndb_mgm -e "ALL REPORT BACKUPSTATUS" | > 10 秒 |
| SQL Node 連接數 | SHOW STATUS LIKE 'Threads_connected' | 接近 max_connections |
# 線上熱備份 (不鎖表)
ndb_mgm -e "START BACKUP 1" # 備份 ID 1
# 備份文件生成在各 Data Node DataDir/BACKUP/BACKUP-1/
# 恢復 (需停寫入)
ndb_restore -c 192.168.0.3 -n 2 -b 1 -r /var/lib/mysql-cluster/BACKUP/BACKUP-1/ --restore-data --restore-meta
MySQL NDB Cluster 提供真正的高可用、自動分片、多主寫入,但代價是:
適用場景:電信級計費、實時竞价、游戏狀態、物聯網時序——高併發、低延遲、可容忍功能受限、預算允許大內存集群。常規 Web 業務推薦 InnoDB + MGR (MySQL Group Replication) 或 Galera Cluster,功能完整、生態成熟、運維友好。