首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL NDB Cluster 7.x/8.x 高可用集群部署全流程:三節點架構、配置、驗證、故障演練

     編輯:MySQL 資料庫相關知識

架構總覽

MySQL NDB Cluster(原 MySQL Cluster)是共享無、多主同步複寫、自動分片、內存為主的高可用架構。核心三角色:

  • Management Node (MGM):集群配置、啟動協調、狀態監控、仲裁。極輕量,可共用現有服務器。
  • Data Node (NDBD/NDBM):存儲數據、執行事務、冗余副本。至少 2 節點 (NoOfReplicas=2),組成 Node Group。
  • SQL Node (mysqld):對外提供 SQL 接口,路由查詢到 Data Node。可多個負載均衡。

最小生產拓撲:3 台物理機

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。

軟件獲取

  • 官方下載:MySQL Cluster 7.6 / 8.0 (General Availability 版)。
  • 必須選 Cluster 版 (包含 ndb_mgmd, ndbd, ndbmtd),標準 Server 版不含 NDB 存儲引擎。
  • Linux 通用二進制包:mysql-cluster-gpl-8.0.xx-linux-glibc2.12-x86_64.tar.gz。

部署步驟(基於二進制包,通用 Linux)

1. 所有節點:創建用戶、目錄、解壓

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

2. Management Node (Server3):配置 config.ini

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

3. 啟動 Management Node

/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

4. Data Nodes (Server1, Server2):配置 my.cnf

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

5. 初始化並啟動 Data Nodes

mkdir -p /var/lib/mysql-cluster
/opt/mysql-cluster/current/bin/ndbd --initial   # 首次或配置變更
# 加入開機自啟
echo "/opt/mysql-cluster/current/bin/ndbd" >> /etc/rc.local

6. 初始化並啟動 SQL Nodes (Server1, Server2)

/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 兩行

破壞性測試:單點故障演練

測試 1:殺掉一個 Data Node (模擬服務器掉電)

# Server1 上
pkill -9 ndbd
# 或拔網線

# 觀察:Server2 繼續服務,Management Node show 顯示 Node 2 disconnected
# 恢復:Server1 重啟 ndbd (無需 --initial)
/opt/mysql-cluster/current/bin/ndbd
# 數據自動同步追趕

測試 2:殺掉 Management Node

# Server3 上
pkill ndb_mgmd
# 現象:Data Node + SQL Node 繼續運行(無管理節點不影響數據面)
# 風險:若此時再掛一個 Data Node,無仲裁者將導致集群整體停止 (Split-brain 保護)
# 恢復:重啟 ndb_mgmd

測試 3:網絡分區 (Split-brain)

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 提供真正的高可用、自動分片、多主寫入,但代價是:

  • 僅支持內存表 (DiskData 除外),數據量受限於 RAM 成本。
  • 不支持外鍵、全文索引、觸發器、存儲過程 (SQL Node 層限制)。
  • 部署運維複雜度高,需專業 DBA。
  • 網絡延遲敏感,跨機房部署需專線、低延遲 (<2ms)。

適用場景:電信級計費、實時竞价、游戏狀態、物聯網時序——高併發、低延遲、可容忍功能受限、預算允許大內存集群。常規 Web 業務推薦 InnoDB + MGR (MySQL Group Replication) 或 Galera Cluster,功能完整、生態成熟、運維友好。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved