首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Cluster 集群架構部署實戰:從小站到大站的擴展之路

     編輯:MySQL 資料庫相關知識

案例背景:為何選擇 MySQL Cluster

某證券公司 OA 系統初期規劃 30 萬用戶在線,後需求激增至 50 萬並發且皆有寫入需求。原 Master-Master-Slave 讀寫分離架構無法滿足高寫入並發與高可用需求,故引入 MySQL Cluster(NDB Cluster 存儲引擎)實現真正的分散式、多主寫入、無單點故障架構。

一、MySQL Cluster 核心架構概念

三大節點角色

節點類型進程名稱功能職責啟動命令
管理節點 (MGM)ndb_mgmd叢集配置分發、節點啟停控制、備份協調、日誌收集ndb_mgmd -f config.ini
資料節點 (NDB)ndbd / ndbmtd儲存分區資料、處理事務、維護索引、同步複本ndbd --initial (首次) / ndbd
SQL 節點 (API)mysqld接收客戶端 SQL 請求、解析優化、轉發至資料節點mysqld --ndbcluster

關鍵特性

  • Shared-Nothing 架構:每節點獨立 CPU/記憶體/磁碟,無共享資源,橫向擴展性極佳。
  • 記憶體內運算:資料與索引駐留記憶體,延遲極低(亞毫秒級)。
  • 同步複寫:寫入同步至多個複本,強一致性,無資料遺失風險。
  • 自動分區:資料按 Primary Key Hash 自動分散至資料節點群組。
  • 線上擴容:支援線上新增資料節點、線上 Schema 變更(部分操作)。

二、部署規劃範例(5 節點叢集)

角色主機名IP備註
MGMmgm1192.168.5.101管理節點,單點建議雙機熱備
NDB1ndb1192.168.5.102資料節點群組 0
NDB2ndb2192.168.5.103資料節點群組 1
SQL1sql1192.168.5.104SQL 節點,對外服務
SQL2sql2192.168.5.105SQL 節點,負載均衡

網路要求:節點間走專用子網(如 10GbE),禁止跨公網;關閉防火牆或開放 1186、3306、2202 等埠。

三、安裝與配置步驟

1. 環境準備(所有節點)

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。

2. SQL/資料節點安裝(4 台機器重複)

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

3. SQL 節點配置 (/etc/my.cnf)

[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

4. 資料節點配置 (/etc/my.cnf)

[mysqld]
ndbcluster
ndb-connectstring=192.168.5.101

[mysql_cluster]
ndb-connectstring=192.168.5.101

5. 管理節點安裝與配置

# 僅需複製管理工具
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

四、叢集啟動與驗證

啟動順序(關鍵)

  1. 管理節點:ndb_mgmd -f /usr/local/mysql/config.ini --initial(首次加 --initial)
  2. 資料節點:各節點執行 ndbd --initial(首次)或 ndbd
  3. SQL 節點:systemctl 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)

五、應用層適配與測試

建表指定 NDB 引擎

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;

故障測試

  • 殺掉一個 NDB 進程:叢集自動故障轉移,服務不中斷。
  • 殺掉一個 SQL 節點:客戶端透過負載均衡器切換至另一 SQL 節點。
  • 管理節點掛掉:不影響資料服務,僅無法執行管理操作;建議 MGM 雙機熱備(備份 config.ini 與二進制檔)。

六、效能調優與生產建議

參數建議值/策略說明
DataMemory物理記憶體 70-80%預留 OS 與 ndbd 進程本身記憶體
NoOfReplicas2(生產環境)單複本風險極高,至少 2
MaxNoOfConcurrentOperations根據峰值 QPS 估算防止交易佇列溢位
Redo Log / LCP調整 FragmentLogFileSize, NoOfFragmentLogFiles平衡恢復時間與磁碟 I/O
ThreadConfigndbmtd 多執行緒模式多核 CPU 必開,綁定 CPU 核心

七、優缺點總結與選型建議

優點缺點/限制
真正的多主寫入、線性擴展Join 複雜查詢效能弱(跨節點資料傳輸)
99.999% 高可用、無單點故障資料量受限於記憶體(Disk Data 表效能較差)
同步複寫、強一致性外鍵支援有限(8.0 開始支援)
線上 Schema 變更、線上加節點不支援全文索引、空間索引

適用場景

  • 高並發寫入、簡單查詢(PK 查詢、範圍掃描)
  • 電信計費、遊戲狀態、物聯網遙測、即時競價
  • 需地理分散部署的多活架構

不適用場景

  • 複雜 OLAP 分析查詢、大量 Join、排序聚合
  • 資料量遠超記憶體容量(TB 級以上)
  • 強依賴存儲過程、觸發器、外鍵的傳統應用

八、安全關閉流程

# 1. 關閉叢集(從管理節點)
ndb_mgm -e shutdown

# 2. 關閉各 SQL 節點
mysqladmin -u root -p shutdown

結語

MySQL Cluster 以 Shared-Nothing、記憶體內、同步複寫三大核心特性,解決了傳統架構難以突破的寫入擴展與高可用瓶頸。雖然存在 Join 弱、記憶體成本高等限制,但在「高併發寫入 + 簡單存取 + 極致可用」的場景下,它是極具性價比的選擇。部署前務必進行充分壓測(建議 1 個月以上),驗證故障切換、擴容縮容、備份恢復全流程,方可上線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved