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

MySQL Cluster 管理節點配置文件實戰模板:數據節點 4GB 內存測試環境優化

     編輯:MySQL 綜合教學

針對單機/小規模測試環境 (數據節點 4GB 內存) 的 MySQL Cluster config.ini 實戰優化模板。基於作者實測調試,針對有限內存優化併發參數、日誌文件、檢查點速度、心跳間隔、實時調度器、備份緩衝,並附完整節點拓撲定義 (管理、數據、SQL/API 節點),可直接用於開發/測試/POC 環境快速部署。

配置文件全文 (config.ini)

[NDBD DEFAULT]
# 總發送緩衝 (可選,TCP DEFAULT 中統一設置更佳)
# TotalSendBufferMemory = 256M

NoOfReplicas=2                        # 雙副本
DataMemory=2500M                      # 2.5GB 數據內存 (4GB 物理 * 62.5%)
IndexMemory=256M                      # 256MB 索引內存
DataDir=/var/lib/mysql-cluster        # 數據/日誌目錄
# FileSystemPath=/data/dbdata         # 可選:分離數據與日誌磁盤

# ===== Redo Log 配置 (關鍵寫入性能) =====
FragmentLogFileSize=32M               # 32MB/文件
InitFragmentLogFiles=SPARSE           # 稀疏文件快速創建
NoOfFragmentLogFiles=8                # 8 文件 -> 256MB 總 Redo 空間 (測試足夠)
RedoBuffer=1024M                      # 1GB Redo 內存緩衝 (大緩衝合併寫入,測試環境可激進)

StringMemory=25                       # 25% 元數據字符串內存
LockPagesInMainMemory=1               # 鎖定內存防 Swap (需權限/巨頁,測試可設 0)
MaxNoOfTables=4096                    # 表上限
MaxNoOfOrderedIndexes=2048            # 有序索引上限
MaxNoOfUniqueHashIndexes=1024         # 唯一哈希索引上限
MaxNoOfAttributes=24576               # 列屬性上限
MaxNoOfTriggers=14336                 # 觸發器上限
ODirect=1                             # O_DIRECT I/O (繞過 OS Cache,穩定延遲)

# ===== 併發與事務參數 (測試環境適度放大) =====
MaxNoOfConcurrentTransactions=10000
MaxNoOfConcurrentOperations=50000
MaxNoOfLocalOperations=55000
TimeBetweenGlobalCheckpoints=1000     # GCP 間隔 1秒 (1000ms)
TimeBetweenEpochs=100                 # Epoch 間隔 100ms
TimeBetweenWatchdogCheckInitial=60000
TransactionBufferMemory=10M
DiskCheckpointSpeed=10M               # LCP 寫入限速 10MB/s
DiskCheckpointSpeedInRestart=100M     # 重啟 LCP 限速 100MB/s
TimeBetweenLocalCheckpoints=20        # LCP 間隔 20 * 100 = 2000 秒 (~33分鐘)

# ===== 實時調度器 (關鍵低延遲) =====
SchedulerSpinTimer=400                # 微秒級忙等待
SchedulerExecutionTimer=100
RealTimeScheduler=1                   # 啟用實時調度 (需 root 權限/能力 CAP_SYS_NICE)

# ===== 備份參數 =====
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M

# ===== 執行線程與掃描 =====
MaxNoOfExecutionThreads=4             # 4 線程 (ndbmtd 模式),單線程 ndbd 忽略此參數
TransactionDeadLockDetectionTimeOut=10000
BatchSizePerLocalScan=512

# ===== 增加 LongMessageBuffer (修復已知 Bug) =====
LongMessageBuffer=8M

# ===== 心跳參數 (測試環境放寬防誤判) =====
HeartbeatIntervalDbDb=15000           # 數據節點間心跳 15秒
HeartbeatIntervalDbApi=15000          # API 節點心跳 15秒

[MGM DEFAULT]
PortNumber: 1186
DataDir: /var/lib/mysql-cluster1      # 管理節點專用目錄

[TCP DEFAULT]
SendBufferMemory: 64M                 # TCP 發送緩衝 64MB

# ===== 節點拓撲定義 (生產強制固定 ID) =====
# 修改 HOST1-HOST9 為實際 IP/主機名
[NDB_MGMD]
NodeId: 1
HostName: 10.100.200.36               # 管理節點
ArbitrationRank: 1                    # 仲裁者

[NDBD]
NodeId: 4
HostName: 10.100.200.37               # 數據節點 1

[NDBD]
NodeId: 5
HostName: 10.100.200.38               # 數據節點 2

# [NDBD] 可擴展更多節點

# ===== SQL/API 節點 (可動態增減,預留槽位) =====
[API]
NodeId: 10
HostName: 10.100.200.39
ArbitrationRank: 2

[API]
NodeId: 11
HostName: 10.100.200.39
ArbitrationRank: 2

[API]
NodeId: 12
HostName: 10.100.200.39
ArbitrationRank: 2

[API]
NodeId: 13
HostName: 10.100.200.39
ArbitrationRank: 2

[API]
NodeId: 14
HostName: 10.100.200.41
ArbitrationRank: 2

[API]
NodeId: 15
HostName: 10.100.200.41
ArbitrationRank: 2

[API]
NodeId: 16
HostName: 10.100.200.41
ArbitrationRank: 2

[API]
NodeId: 17
HostName: 10.100.200.41
ArbitrationRank: 2

[API]
[API]  # 佔位符,預留動態加入

4GB 內存環境關鍵參數權衡表

參數配置值權衡邏輯
DataMemory=2500M2.5GB4GB 物理極限壓縮,預留 1.5GB 給 OS、IndexMemory、StringMemory、進程開銷。**無冗余**,生產禁用。
IndexMemory=256M256MB僅支撐少量主鍵/唯一鍵,大量二級索引會 OOM。
RedoBuffer=1024M1GB激進配置:大內存緩衝合併寫入,減少 fsync 頻率,提升寫入吞吐。風險:節點崩潰丟失 1GB Redo 數據 (需 GCP 保護)。測試環境可接受。
NoOfFragmentLogFiles=8, Size=32M256MB 磁盤 Redo極小,僅適合低寫入測試。生產需 ≥ 4GB 磁盤 Redo 空間。
RealTimeScheduler=1啟用降低調度延遲,需 root 啟動 ndbd。測試環境常忽略權限導致無效,驗證 ndb_mgm -e "DUMP 2301" 輸出。
HeartbeatIntervalDbDb=1500015秒測試環境網絡/負載波動大,放寬心跳防誤判節點失效觸發遷移風暴。
MaxNoOfExecutionThreads=44 線程**需使用 ndbmtd 二進制**。單線程 ndbd 無法利用多核,4GB 內存場景更依賴多線程並行處理 LCP/Redo/網絡。

測試環境部署腳本 (自動化)

#!/bin/bash
# deploy_cluster_test.sh
set -e
CONF=/etc/mysql-cluster/config.ini
DATADIR=/var/lib/mysql-cluster
MGMD_DATADIR=/var/lib/mysql-cluster1

echo "Creating directories..."
mkdir -p $DATADIR $MGMD_DATADIR
chown -R mysql:mysql $DATADIR $MGMD_DATADIR

echo "Starting Management Node..."
ndb_mgmd -f $CONF --configdir=/etc/mysql-cluster --initial

echo "Starting Data Nodes (ndbmtd)..."
# 假設節點 ID 4,5 在當前機器 (單機多節點測試)
ndbmtd --ndb-nodeid=4 -c 10.100.200.36 --initial
ndbmtd --ndb-nodeid=5 -c 10.100.200.36 --initial

echo "Waiting for nodes to start..."
sleep 10
ndb_mgm -e "SHOW"

echo "Starting SQL Node..."
systemctl start mysqld

echo "Verification:"
mysql -e "SHOW ENGINE NDB STATUS\G"
mysql -e "CREATE DATABASE IF NOT EXISTS test_cluster;"
mysql -e "CREATE TABLE test_cluster.t1 (id INT PRIMARY KEY, data VARCHAR(100)) ENGINE=NDBCLUSTER;"
mysql -e "INSERT INTO test_cluster.t1 VALUES (1, 'test'); SELECT * FROM test_cluster.t1;"

echo "Test cluster deployed successfully."

常見測試環境故障速查

  1. ndbd 啟動即退出,日誌 "Job buffer full" / "Out of memory": DataMemory/IndexMemory 總和超過物理內存,降低參數或增加 Swap (不推薦)。
  2. 管理節點無法啟動 "Could not determine which nodeid": 配置文件無 [NDB_MGMD] 區塊或無 NodeId/HostName,或命令行未指定 --ndb-nodeid。
  3. SQL 節點連不上集群 "ERROR 1296: Got error 4009 'Cluster Failure'": 數據節點未全部 STARTED,或 ndb-connectstring 指向錯誤管理節點 IP/端口。
  4. ArbitrationRank 衝突: 僅 1 個管理節點或 1 個 SQL 節點設置 ArbitrationRank=1 (仲裁者),其他設置 2 或 0。
  5. ndbmtd 不識別 MaxNoOfExecutionThreads: 使用了單線程 ndbd 二進制,需替換為 ndbmtd (MySQL Cluster 7.2+ 自帶)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved