首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL Cluster (NDB) 5 節點分佈式部署實戰:從規劃到建表全流程

     編輯:MySQL 綜合教學

架構規劃:5 節點拓撲

角色節點 ID 類型主機名IP核心進程
管理節點 (MGM)ndb_mgmddb1192.168.0.1管理仲裁、配置分發、集群狀態監控
SQL 節點 1mysqld (API)db2192.168.0.2接收客戶端 SQL,解析優化,轉發給數據節點
SQL 節點 2mysqld (API)db3192.168.0.3高可用/負載均衡入口
數據節點 1ndbd/ndbmtddb4192.168.0.4存儲分片數據、索引、執行本地事務、副本同步
數據節點 2ndbd/ndbmtddb5192.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+)

分角色安裝與配置

1. SQL 節點 & 數據節點 (db2/db3/db4/db5) — 統一安裝腳本


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

SQL 節點配置 (`/usr/local/mysql/my.cnf`)


[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

數據節點配置 (`/usr/local/mysql/my.cnf`)


[mysqld]
ndbcluster
ndb-connectstring=db1

[mysql_cluster]
ndb-connectstring=db1

※ 數據節點**不運行 mysqld**,只需配置連接管理節點信息供 `ndbd` 進程讀取。

2. 管理節點 (db1) — 輕量部署


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

核心配置文件 (`/usr/local/mysql/config.ini`)


[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

關鍵參數解讀:

  • `NoOfReplicas=2`:兩個數據節點互為副本,**單節點故障零數據損失、秒級故障轉移**。
  • `DataMemory`/`IndexMemory`:NDB **純內存存儲引擎** (5.1+ 支持磁盤數據),內存容量直接決定集群數據上限,**必須精確規劃**,留足 OS 與進程開銷。
  • 端口:管理 1186,數據節點間 2202 (5.0.3+ 自動分配),SQL 節點 3306。

啟動序列:嚴格順序不可逆


# 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)

關鍵確認點:

  • 所有預期節點均在線 (`Connected`),版本一致;
  • 數據節點處於同一 `Nodegroup`,其中一個標記 `Master` (負責元數據協調);
  • SQL 節點已註冊連接管理節點。

建表與業務接入:兩大鐵律

  1. 引擎強制指定: `ENGINE=NDB` 或 `ENGINE=NDBCLUSTER`。
    遷移現有表:`ALTER TABLE tbl ENGINE=NDB;` 或 `mysqldump` 輸出中替換 `ENGINE` 子句。
  2. 主鍵強制要求: **每個 NDB 表必須有顯式主鍵**。無主鍵時 NDB 會隱式生成隱藏主鍵 (佔用額外內存/索引空間),易導致「內存不足」報錯。**建表即定義 PK**。

建表示例 (在任意 SQL 節點 db2/db3 執行)


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 版本**,獲得長期支持與關鍵特性 (如磁盤數據、讀取備份、地理分佈複製)。

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