針對單機/小規模測試環境 (數據節點 4GB 內存) 的 MySQL Cluster config.ini 實戰優化模板。基於作者實測調試,針對有限內存優化併發參數、日誌文件、檢查點速度、心跳間隔、實時調度器、備份緩衝,並附完整節點拓撲定義 (管理、數據、SQL/API 節點),可直接用於開發/測試/POC 環境快速部署。
[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] # 佔位符,預留動態加入
| 參數 | 配置值 | 權衡邏輯 |
|---|---|---|
| DataMemory=2500M | 2.5GB | 4GB 物理極限壓縮,預留 1.5GB 給 OS、IndexMemory、StringMemory、進程開銷。**無冗余**,生產禁用。 |
| IndexMemory=256M | 256MB | 僅支撐少量主鍵/唯一鍵,大量二級索引會 OOM。 |
| RedoBuffer=1024M | 1GB | 激進配置:大內存緩衝合併寫入,減少 fsync 頻率,提升寫入吞吐。風險:節點崩潰丟失 1GB Redo 數據 (需 GCP 保護)。測試環境可接受。 |
| NoOfFragmentLogFiles=8, Size=32M | 256MB 磁盤 Redo | 極小,僅適合低寫入測試。生產需 ≥ 4GB 磁盤 Redo 空間。 |
| RealTimeScheduler=1 | 啟用 | 降低調度延遲,需 root 啟動 ndbd。測試環境常忽略權限導致無效,驗證 ndb_mgm -e "DUMP 2301" 輸出。 |
| HeartbeatIntervalDbDb=15000 | 15秒 | 測試環境網絡/負載波動大,放寬心跳防誤判節點失效觸發遷移風暴。 |
| MaxNoOfExecutionThreads=4 | 4 線程 | **需使用 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."
[NDB_MGMD] 區塊或無 NodeId/HostName,或命令行未指定 --ndb-nodeid。ndb-connectstring 指向錯誤管理節點 IP/端口。ArbitrationRank=1 (仲裁者),其他設置 2 或 0。ndbd 二進制,需替換為 ndbmtd (MySQL Cluster 7.2+ 自帶)。