| 邏輯角色 | 主機名 | IP | 說明 |
|---|---|---|---|
| 管理節點 (MGM) | db1 | 192.168.0.10 | 仲裁、配置分發、狀態監控,輕量 |
| SQL 節點 1 (API) | db2 | 192.168.0.20 | 接收客戶端連線、解析 SQL、路由到資料節點 |
| SQL 節點 2 (API) | db3 | 192.168.0.30 | 高可用備援、讀寫分離入口 |
| 資料節點 1 (NDBD) | db4 | 192.168.0.40 | 儲存實際資料、索引、處理事務 |
| 資料節點 2 (NDBD) | db5 | 192.168.0.50 | 雙副本 (NoOfReplicas=2),自動分片 |
資源受限時:可將 MGM+SQL1+NDBD1 合併部署在 db1,SQL2+NDBD2 合併在 db3,但生產環境強烈建議物理隔離。
mysql-cluster-gpl-7.x.x-win32.msi (官網 MySQL Cluster 專用版,非 Community Server)D:\Program Files\MySQL\MySQL Server 7.x\# 建立目錄與配置檔
mkdir C:\mysql\mysql-cluster
notepad C:\mysql\mysql-cluster\config.ini
config.ini 完整內容:
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=512M
IndexMemory=128M
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# 管理節點
[NDB_MGMD]
HostName=192.168.0.10
NodeId=1
# 資料節點 1
[NDBD]
HostName=192.168.0.40
NodeId=2
DataDir=E:\mysql-cluster\data
# 資料節點 2
[NDBD]
HostName=192.168.0.50
NodeId=3
DataDir=E:\mysql-cluster\data
# SQL 節點
[MYSQLD]
HostName=192.168.0.20
NodeId=4
[MYSQLD]
HostName=192.168.0.30
NodeId=5
關鍵點:NodeId 顯式指定避免衝突;DataDir 須預先建立;DataMemory/IndexMemory 依實際記憶體規劃 (留 20% 給 OS)。
在各節點 MySQL 安裝目錄下的 my.ini 末尾追加:
ndbcluster
ndb-connectstring=192.168.0.10
[mysql_cluster]
ndb-connectstring=192.168.0.10
確保 my.ini 中 basedir/datadir 指向正確路徑。
cd "D:\Program Files\MySQL\MySQL Server 7.x\bin"
ndb_mgmd.exe -f "C:\mysql\mysql-cluster\config.ini" --initial
ndbd.exe --initial
--initial 僅首次啟動或結構變更使用,後續重啟移除 此參數。
net start mysql
# 進入管理客戶端
ndb_mgm.exe
# 顯示拓撲
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.40 (Version: 7.x.x, Nodegroup: 0, Master)
id=3 @192.168.0.50 (Version: 7.x.x, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.10 (Version: 7.x.x)
[mysqld(API)] 2 node(s)
id=4 @192.168.0.20 (Version: 7.x.x)
id=5 @192.168.0.30 (Version: 7.x.x)
關鍵檢查:兩個 NDBD 同屬 Nodegroup 0、狀態正常、SQL 節點已連線。
在任一 SQL 節點 (如 db2) 執行:
CREATE DATABASE test;
USE test;
CREATE TABLE city (
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL DEFAULT ''
) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4;
INSERT INTO city VALUES (1, 'city1'), (2, 'city2');
在另一 SQL 節點 (db3) 驗證:
USE test;
SELECT * FROM city;
-- 應返回 city1, city2,證明跨節點同步正常
核心鐵律:ENGINE=ndbcluster,否則為本地表不參與叢集。
# 正常關機 (確保資料落盤)
ndb_mgm.exe -e "SHUTDOWN"
# 強制關機 (僅緊急)
# 1. 關閉 SQL 節點: net stop mysql
# 2. 關閉資料節點: ndb_mgm> 2 STOP / 3 STOP
# 3. 關閉管理節點: ndb_mgm> 1 STOP
⚠️ 切勿直接關機或殺進程,NDB 需正常關機完成 Checkpoint、Redo Log 落盤,否則重啟需漫長恢復甚至資料不一致。
| 現象 | 原因 | 解決 |
|---|---|---|
| 資料節點卡在 Starting | 無法連線管理節點、NodeId 衝突、防火牆攔截 1186/2202 埠 | 檢查 config.ini HostName、防火牆、telnet 1186 |
| SQL 節點不顯示在 SHOW | my.ini 缺 ndbcluster/ndb-connectstring、版本不匹配 | 補全配置、重啟 SQL 服務、確認版本一致 |
| 建表報錯 Unknown storage engine | 未載入 ndbcluster 插件 | my.ini 加 ndbcluster、重啟驗證 SHOW ENGINES |
| 資料不同步 | 表非 ndbcluster、網路分區、資料節點故障 | 檢查引擎、ndb_mgm> ALL REPORT MEMORY、網路連通性 |