MySQL Cluster (NDB) 採用 **Share-Nothing** 內存數據庫架構,最小生產集群需 4 節點(2 管理 + 2 數據 + 2 SQL),本文演示**雙機模擬**(單機承擔管理+SQL+數據),僅供開發測試/教學,生產嚴禁。
| 主機 | IP | 角色 |
|---|---|---|
| ndb1 | 192.168.1.100 | ndb_mgmd (管理) + ndbd (數據) + mysqld (SQL) |
| ndb2 | 192.168.1.200 | ndbd (數據) + mysqld (SQL) |
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster-gpl-7.6.19-linux-glibc2.12-x86_64.tar.gz
tar zxf mysql-cluster-gpl-*.tar.gz
mv mysql-cluster-gpl-* /usr/local/mysql-cluster
ln -s /usr/local/mysql-cluster /usr/local/mysql
注意:必須使用 **Cluster 版本**(含 ndb_mgmd、ndbd、ndb_mgm),標準 MySQL Server 不包含 NDB 組件。
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=512M
IndexMemory=128M
MaxNoOfConcurrentOperations=100000
[TCP DEFAULT]
SendBufferMemory=2M
ReceiveBufferMemory=2M
[NDB_MGMD]
NodeId=1
HostName=192.168.1.100
DataDir=/var/lib/mysql-cluster
[NDBD]
NodeId=2
HostName=192.168.1.100
DataDir=/usr/local/mysql/data
[NDBD]
NodeId=3
HostName=192.168.1.200
DataDir=/usr/local/mysql/data
[MYSQLD]
NodeId=4
HostName=192.168.1.100
[MYSQLD]
NodeId=5
HostName=192.168.1.200
[mysqld]
ndbcluster
ndb-connectstring=192.168.1.100
default-storage-engine=NDBCLUSTER
[mysql_cluster]
ndb-connectstring=192.168.1.100
mkdir -p /var/lib/mysql-clusterndb_mgmd -f /var/lib/mysql-cluster/config.ini --initialndbd --initial (僅首次使用 --initial)mysqld --initialize-insecure --user=mysql (首次)systemctl start mysqld 或 /usr/local/mysql/support-files/mysql.server startndb_mgm -e "SHOW"
-- 預期輸出:
Connected to Management Server at: 192.168.1.100:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.1.100 (Version: 7.6.19, Nodegroup: 0, Master)
id=3 @192.168.1.200 (Version: 7.6.19, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.100 (Version: 7.6.19)
[mysqld(SQL)] 2 node(s)
id=4 @192.168.1.100 (Version: 7.6.19)
id=5 @192.168.1.200 (Version: 7.6.19)
# ndb1 建表寫入
mysql -u root -e "
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE city (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(35) NOT NULL,
country CHAR(3) NOT NULL,
population INT NOT NULL
) ENGINE=NDBCLUSTER;
INSERT INTO city VALUES (1,'Kabul','AFG',1780000),(2,'Qandahar','AFG',237500);
"
# ndb2 讀取驗證
mysql -u root -e "USE testdb; SELECT * FROM city;"
# 關閉
ndb_mgm -e "SHUTDOWN" # 管理節點發送關閉信號,數據節點自動跟隨
systemctl stop mysqld # 兩台停止 SQL 節點
# 重啟(順序嚴格)
# 1. 管理節點
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
# 2. 數據節點
ndbd # 無 --initial
# 3. SQL 節點
systemctl start mysqld
| 區塊 | 關鍵參數 | 說明 |
|---|---|---|
| NDBD DEFAULT | NoOfReplicas | 副本數,決定節點組數量,生產建議 2 |
| DataMemory | 數據內存,含行數據、索引、重做日誌,佔物理內存 70-80% | |
| IndexMemory | 哈希/有序索引內存,通常 10-20% DataMemory | |
| NDB_MGMD | DataDir | 管理節點日誌/检查點目錄 |
| NDBD | DataDir | 數據節點本地數據文件目錄 |
| MYSQLD | HostName | SQL 節點 IP,允許同一主機多實例 |
memlock_unlimited、關閉 Swap、NUMA 綁定ndb_mgm -e "ALL REPORT MEMORYUSAGE"、ndbinfo 表、Prometheus Exporterndb_mgm -e "START BACKUP" 線程熱備、異地歸檔