| 角色 | 節點 ID 類型 | 主機名 | IP | 核心進程 |
|---|---|---|---|---|
| 管理節點 (MGM) | ndb_mgmd | db1 | 192.168.0.1 | 管理仲裁、配置分發、集群狀態監控 |
| SQL 節點 1 | mysqld (API) | db2 | 192.168.0.2 | 接收客戶端 SQL,解析優化,轉發給數據節點 |
| SQL 節點 2 | mysqld (API) | db3 | 192.168.0.3 | 高可用/負載均衡入口 |
| 數據節點 1 | ndbd/ndbmtd | db4 | 192.168.0.4 | 存儲分片數據、索引、執行本地事務、副本同步 |
| 數據節點 2 | ndbd/ndbmtd | db5 | 192.168.0.5 | 鏡像數據節點 1,保證無單點故障 |
關鍵約束: 僅限**單一子網/專用網絡**部署(TCP 明文傳輸、高帶宽低延遲需求),嚴禁跨公網。單機多實例僅供測試,生產必須物理/虛擬機隔離。
# 所有節點執行
groupadd nobody
useradd -r -g nobody -s /bin/false nobody # 統一以 nobody 低權限用戶運行
# 下載 MySQL Cluster 二進制包 (含 NDB 存儲引擎)
# 官網: https://dev.mysql.com/downloads/cluster/
# 示例版本: mysql-max-5.0.24-linux-i686.tar.gz (文中版本較老,生產請用 7.6+/8.0+)
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 --user=nobody
chown -R nobody:nobody /usr/local/mysql
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
user = nobody
port = 3306
socket = /tmp/mysql.sock
ndbcluster # 啟用 NDB 存儲引擎
ndb-connectstring=db1 # 指向管理節點主機名
[mysql_cluster]
ndb-connectstring=db1
[mysqld]
ndbcluster
ndb-connectstring=db1
[mysql_cluster]
ndb-connectstring=db1
※ 數據節點**不運行 mysqld**,只需配置連接管理節點信息供 `ndbd` 進程讀取。
tar zxf mysql-max-5.0.24-linux-i686.tar.gz
mkdir -p /usr/local/mysql/data
cd mysql-max-5.0.24-linux-i686/bin
cp ndb_mgm* /usr/local/mysql/ # 僅需管理客戶端與服務端二進制
chown -R nobody:nobody /usr/local/mysql
[NDBD DEFAULT]
NoOfReplicas=2 # 副本數 = 數據節點數/節點組數,此處 2 節點 1 組 => 2 副本 (全同步鏡像)
DataMemory=512M # 數據內存 (按實際 RAM 規劃,留 20-30% 給 OS)
IndexMemory=128M # 索引內存
[TCP DEFAULT]
portnumber=2202 # 數據節點間通信端口 (管理節點默認 1186)
[NDB_MGMD] # 管理節點
hostname=db1
datadir=/usr/local/mysql/data
[NDBD] # 數據節點 1
hostname=db4
datadir=/usr/local/mysql/data
[NDBD] # 數據節點 2
hostname=db5
datadir=/usr/local/mysql/data
[MYSQLD] # SQL 節點 1
hostname=db2
[MYSQLD] # SQL 節點 2
hostname=db3
關鍵參數解讀:
# 1. 管理節點 (db1) — 首次需指定配置文件
ndb_mgmd -f /usr/local/mysql/config.ini --initial # --initial 僅首次/配置變更時使用
# 2. 數據節點 (db4, db5) — 首次啟動必加 --initial
ndbd --initial # 初始化文件系統、清空舊數據/日志
# 後續常規啟動
ndbd
# 3. SQL 節點 (db2, db3)
mysqld_safe --defaults-file=/usr/local/mysql/my.cnf --user=nobody &
⚠️ `--initial` **慎用**:會刪除該節點所有持久化數據/重做日志/檢查點文件,**相當於格式化該數據節點**。僅在首次部署、配置結構變更 (如 `NoOfReplicas`)、全量恢復時使用。
# 管理節點執行
ndb_mgm
ndb_mgm> SHOW
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)
關鍵確認點:
CREATE DATABASE test_cluster;
USE test_cluster;
CREATE TABLE users (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=NDB DEFAULT CHARSET=utf8mb4;
INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com'), ('bob', 'bob@example.com');
SELECT * FROM users;
驗證:在另一 SQL 節點 (db3) 查詢,數據即時可見 —— **多主同步寫入、強一致性讀取**。
| 維度 | 關鍵動作 |
|---|---|
| 備份 | `ndb_mgm -e "START BACKUP"` 熱備份到各數據節點 `datadir/BACKUP/`,不阻塞寫入 |
| 監控 | `ndb_mgm -e "ALL REPORT MEMORY"` 監控 DataMemory/IndexMemory 使用率,**超 80% 必須擴容** |
| 擴容 | 在線添加數據節點需重新分區 (`ALTER TABLE ... REORGANIZE PARTITION`),規劃窗口期操作 |
| 故障轉移 | 單數據節點故障自動秒級切換,SQL 節點無感;管理節點單點故障不影響數據服務,但無法執行管理操作 |
| 版本升級 | 滾動升級:先升管理節點,再逐個升數據節點 (需 `--initial` 重初始化),最後升 SQL 節點 |
MySQL Cluster (NDB) 以**共享無架構、純內存、同步多主複製**實現極致高可用與寫入擴展。部署核心在於:**嚴格啟動順序、內存容量精準規劃、主鍵強制顯式定義、專用網絡隔離**。掌握 `config.ini` 參數語義與 `ndb_mgm` 管理命令,即可駕馭這套企業級分佈式數據庫。生產環境強烈建議使用 **MySQL Cluster 7.6/8.0 LTS 版本**,獲得長期支持與關鍵特性 (如磁盤數據、讀取備份、地理分佈複製)。