某證券公司 OA 系統,初期 30 萬在線用戶,後擴容至 50 萬且全寫入場景。原 Master-Master-Slave 讀寫分離架構無法滿足高併發寫入需求,最終選型 MySQL Cluster (NDB 引擎):
| 節點類型 | 角色 | 啟動命令 |
|---|---|---|
| 管理節點 (MGM) | 集群配置、啟停節點、備份、日誌 | ndb_mgmd |
| 數據節點 (NDB) | 存儲數據、執行事務、自動分片 | ndbd / ndbmtd |
| SQL 節點 (API) | MySQL Server 接入層,解析 SQL、路由到數據節點 | mysqld --ndbcluster |
| 角色 | 主機名 | IP |
|---|---|---|
| MGM | ndb_mgmd | 192.168.5.101 |
| NDB1 | ndb1 | 192.168.5.102 |
| NDB2 | ndb2 | 192.168.5.103 |
| SQL1 | mysqld1 | 192.168.5.104 |
| SQL2 | mysqld2 | 192.168.5.105 |
網絡要求: 僅限可信子網,TCP 通信無加密,禁跨公網。
groupadd mysql
useradd -g mysql mysql
tar zxf mysql-max-5.0.24-linux-i686.tar.gz
mv mysql-max-5.0.24-linux-i686 /usr/local/mysql
cd /usr/local/mysql
./scripts/mysql_install_db
chown -R mysql:mysql /usr/local/mysql
/etc/my.cnf[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
user = mysql
port = 3306
socket = /tmp/mysql.sock
ndbcluster
ndb-connectstring=192.168.5.101
[mysql_cluster]
ndb-connectstring=192.168.5.101
/etc/my.cnf[mysqld]
ndbcluster
ndb-connectstring=192.168.5.101
[mysql_cluster]
ndb-connectstring=192.168.5.101
mkdir -p /usr/local/mysql/data
cp mysql-max-5.0.24-linux-i686/bin/ndb_mgm* /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/config.ini[ndbd default]
NoOfReplicas=1
[tcp default]
portnumber=2202 # 建議專用端口,非 3306
[ndb_mgmd]
hostname=192.168.5.101
datadir=/usr/local/mysql/data
[ndbd]
hostname=192.168.5.102
datadir=/usr/local/mysql/data
[ndbd]
hostname=192.168.5.103
datadir=/usr/local/mysql/data
[mysqld]
hostname=192.168.5.104
[mysqld]
hostname=192.168.5.105
/usr/local/mysql/ndb_mgmd -f /usr/local/mysql/config.ini/usr/local/mysql/bin/ndbd --initial(後續啟動去掉 --initial)/usr/local/mysql/bin/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: 5.0.24, Nodegroup: 0, Master)
id=3 @192.168.5.103 (Version: 5.0.24, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.5.101 (Version: 5.0.24)
[mysqld(API)] 2 node(s)
id=4 @192.168.5.104 (Version: 5.0.24)
id=5 @192.168.5.105 (Version: 5.0.24)
-- SQL1
CREATE TABLE t1(a INT) ENGINE=NDB;
INSERT INTO t1 VALUES(100);
-- SQL2
SHOW TABLES; -- 可見 t1
SELECT * FROM t1; -- 可見 100
注意: NDB 表必須有主鍵,否則自動生成隱藏主鍵佔用內存。
擴容至 4 NDB 節點(雙副本雙分片),壓測一個月後上線。
# 關閉整個集群
ndb_mgm -e shutdown
# 關閉 SQL 節點
mysqladmin -uroot shutdown
MySQL Cluster 通過共無架構、內存計算、自動分片解決了高併發寫入瓶頸。部署關鍵在於:拓撲規劃、配置文件一致性、啟動順序、NDB 表主鍵設計、網絡隔離。生產環境建議:多副本、跨機房部署、監控 ndb_mgm -e "ALL REPORT MEMORYUSAGE"、定期 ONLINE BACKUP。