某證券公司 OA 系統初期規劃 30 萬用戶在線,後需求激增至 50 萬並發且皆有寫入需求。原 Master-Master-Slave 讀寫分離架構無法滿足高寫入並發與高可用需求,故引入 MySQL Cluster(NDB Cluster 存儲引擎)實現真正的分散式、多主寫入、無單點故障架構。
| 節點類型 | 進程名稱 | 功能職責 | 啟動命令 |
|---|---|---|---|
| 管理節點 (MGM) | ndb_mgmd | 叢集配置分發、節點啟停控制、備份協調、日誌收集 | ndb_mgmd -f config.ini |
| 資料節點 (NDB) | ndbd / ndbmtd | 儲存分區資料、處理事務、維護索引、同步複本 | ndbd --initial (首次) / ndbd |
| SQL 節點 (API) | mysqld | 接收客戶端 SQL 請求、解析優化、轉發至資料節點 | mysqld --ndbcluster |
| 角色 | 主機名 | IP | 備註 |
|---|---|---|---|
| MGM | mgm1 | 192.168.5.101 | 管理節點,單點建議雙機熱備 |
| NDB1 | ndb1 | 192.168.5.102 | 資料節點群組 0 |
| NDB2 | ndb2 | 192.168.5.103 | 資料節點群組 1 |
| SQL1 | sql1 | 192.168.5.104 | SQL 節點,對外服務 |
| SQL2 | sql2 | 192.168.5.105 | SQL 節點,負載均衡 |
網路要求:節點間走專用子網(如 10GbE),禁止跨公網;關閉防火牆或開放 1186、3306、2202 等埠。
groupadd mysql
useradd -r -g mysql -s /sbin/nologin mysql
mkdir -p /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
建議使用 MySQL Cluster 官方二進制包(如 mysql-cluster-gpl-8.0.x-linux-glibc2.12-x86_64.tar.gz),而非舊版 MySQL-max。
tar zxf mysql-cluster-gpl-*.tar.gz
mv mysql-cluster-gpl-* /usr/local/mysql
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
[mysqld]
ndbcluster
ndb-connectstring=192.168.5.101
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
port=3306
socket=/tmp/mysql.sock
user=mysql
[mysql_cluster]
ndb-connectstring=192.168.5.101
[mysqld]
ndbcluster
ndb-connectstring=192.168.5.101
[mysql_cluster]
ndb-connectstring=192.168.5.101
# 僅需複製管理工具
cp /usr/local/mysql/bin/ndb_mgm* /usr/local/mysql/bin/
# 建立配置檔 /usr/local/mysql/config.ini
[ndbd default]
NoOfReplicas=2 # 兩個複本,需 2 的倍數資料節點
DataMemory=2G # 資料記憶體
IndexMemory=512M # 索引記憶體
MaxNoOfConcurrentOperations=100000
[tcp default]
SendBufferMemory=8M
ReceiveBufferMemory=8M
[ndb_mgmd]
HostName=192.168.5.101
DataDir=/usr/local/mysql/data
NodeId=1
[ndbd]
HostName=192.168.5.102
DataDir=/usr/local/mysql/data
NodeId=2
[ndbd]
HostName=192.168.5.103
DataDir=/usr/local/mysql/data
NodeId=3
[mysqld]
HostName=192.168.5.104
NodeId=4
[mysqld]
HostName=192.168.5.105
NodeId=5
ndb_mgmd -f /usr/local/mysql/config.ini --initial(首次加 --initial)ndbd --initial(首次)或 ndbdsystemctl start mysqld 或 mysqld_safe --defaults-file=/etc/my.cnf &ndb_mgm -e show
預期輸出:
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.5.102 (Version: 8.0.x, Nodegroup: 0, Master)
id=3 @192.168.5.103 (Version: 8.0.x, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.5.101 (Version: 8.0.x)
[mysqld(API)] 2 node(s)
id=4 @192.168.5.104 (Version: 8.0.x)
id=5 @192.168.5.105 (Version: 8.0.x)
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(50)) ENGINE=NDB;
-- 或轉換既有表
ALTER TABLE existing_table ENGINE=NDB;
強制要求:NDB 表必須有 Primary Key,否則引擎自動產生隱藏 PK(佔用額外記憶體)。
-- SQL1 插入
INSERT INTO t1 VALUES (1, 'test');
-- SQL2 立即可見
SELECT * FROM t1;
| 參數 | 建議值/策略 | 說明 |
|---|---|---|
| DataMemory | 物理記憶體 70-80% | 預留 OS 與 ndbd 進程本身記憶體 |
| NoOfReplicas | 2(生產環境) | 單複本風險極高,至少 2 |
| MaxNoOfConcurrentOperations | 根據峰值 QPS 估算 | 防止交易佇列溢位 |
| Redo Log / LCP | 調整 FragmentLogFileSize, NoOfFragmentLogFiles | 平衡恢復時間與磁碟 I/O |
| ThreadConfig | ndbmtd 多執行緒模式 | 多核 CPU 必開,綁定 CPU 核心 |
| 優點 | 缺點/限制 |
|---|---|
| 真正的多主寫入、線性擴展 | Join 複雜查詢效能弱(跨節點資料傳輸) |
| 99.999% 高可用、無單點故障 | 資料量受限於記憶體(Disk Data 表效能較差) |
| 同步複寫、強一致性 | 外鍵支援有限(8.0 開始支援) |
| 線上 Schema 變更、線上加節點 | 不支援全文索引、空間索引 |
# 1. 關閉叢集(從管理節點)
ndb_mgm -e shutdown
# 2. 關閉各 SQL 節點
mysqladmin -u root -p shutdown
MySQL Cluster 以 Shared-Nothing、記憶體內、同步複寫三大核心特性,解決了傳統架構難以突破的寫入擴展與高可用瓶頸。雖然存在 Join 弱、記憶體成本高等限制,但在「高併發寫入 + 簡單存取 + 極致可用」的場景下,它是極具性價比的選擇。部署前務必進行充分壓測(建議 1 個月以上),驗證故障切換、擴容縮容、備份恢復全流程,方可上線。