MySQL Cluster 採用 Shared-Nothing (無共享) 架構,核心組件:
| 角色 | 進程 | 配置檔區段 | 預設埠 |
|---|---|---|---|
| 管理節點 | ndb_mgmd | [NDB_MGMD] | 1186 |
| 資料節點 | ndbd (單執行緒) / ndbmtd (多執行緒) | [NDBD] | 動態分配 (2202 起) |
| SQL 節點 | mysqld | [MYSQLD] | 3306 |
| 主機名 | IP | 角色 |
|---|---|---|
| db1 | 192.168.0.1 | MGM |
| db2 | 192.168.0.2 | SQL 1 |
| db3 | 192.168.0.3 | SQL 2 |
| db4 | 192.168.0.4 | NDBD 1 |
| db5 | 192.168.0.5 | NDBD 2 |
要求:同一子網、低延遲、關閉防火牆或開放 1186/3306/動態埠、同步時間 (NTP)、/etc/hosts 互解。
# 所有節點建立統一運行用戶 groupadd -r mysql useradd -r -g mysql -s /sbin/nologin mysql # 下載 MySQL Cluster 套件 (含 NDB) # 官網: https://dev.mysql.com/downloads/cluster/ # 解壓至 /usr/local/mysql-cluster
[NDBD DEFAULT] NoOfReplicas=2 # 複本數,資料節點數需為倍數 DataMemory=512M # 記憶體資料大小 IndexMemory=64M # 索引記憶體 NoOfFragmentLogFiles=16 MaxNoOfConcurrentOperations=100000 [TCP DEFAULT] SendBufferMemory=2M ReceiveBufferMemory=2M [NDB_MGMD] HostName=db1 DataDir=/var/lib/mysql-cluster NodeId=1 [NDBD] HostName=db4 NodeId=2 DataDir=/var/lib/mysql-cluster [NDBD] HostName=db5 NodeId=3 DataDir=/var/lib/mysql-cluster [MYSQLD] HostName=db2 NodeId=4 [MYSQLD] HostName=db3 NodeId=5
[mysqld] ndbcluster # 啟用 NDB 引擎 ndb-connectstring=db1 # 管理節點主機名 default_storage_engine=ndbcluster [mysql_cluster] ndb-connectstring=db1
ndb_mgmd -f /usr/local/mysql-cluster/config.ini --initial
# 首次啟動需 --initial ndbd --initial # 後續啟動 ndbd
systemctl start mysqld # 或 mysqld_safe --defaults-file=/etc/my.cnf &
# 管理節點執行 ndb_mgm -- 進入管理客戶端 ndb_mgm> SHOW Connected to Management Server at: db1:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.4 (Version: 8.0.x, Nodegroup: 0, Master) id=3 @192.168.0.5 (Version: 8.0.x, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.1 (Version: 8.0.x) [mysqld(SQL)] 2 node(s) id=4 @192.168.0.2 (Version: 8.0.x) id=5 @192.168.0.3 (Version: 8.0.x)
# SQL 節點 db2
mysql -u root -p
CREATE DATABASE test_cluster;
USE test_cluster;
CREATE TABLE city (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
) ENGINE=NDBCLUSTER DEFAULT CHARSET=utf8mb4;
INSERT INTO city (name) VALUES ('Taipei'), ('Tokyo'), ('Seoul');
# SQL 節點 db3 驗證同步
mysql -u root -p -e "USE test_cluster; SELECT * FROM city;"
# 管理節點 ndb_mgm -e shutdown # SQL 節點 mysqladmin -u root -p shutdown
MySQL Cluster (NDB) 提供高可用、自動分片、同步複本的分散式資料庫能力。部署核心:config.ini 定義拓撲 → 管理節點優先啟動 → 資料節點 --initial 首啟 → SQL 節點掛載 NDB 引擎。適用場景:高併發、低延遲、資料量可控 (記憶體容量)、可接受功能限制 (無外鍵/全文) 的電信、遊戲、即時競價等領域。生產部署必須進行故障注入測試 (殺節點、斷網、磁碟滿) 驗證自動恢復能力。