MySQL Cluster (NDB) 提供 99.999% 高可用性、記憶體內運算、無共享架構。本文記錄 5 節點 (1 管理 + 2 資料 + 2 SQL) 完整部署流程,含配置檔、啟動順序與雙向同步測試。
一、架構核心概念
三類節點角色
- 管理節點 (MGM): 叢集配置、仲裁、監控,單點即可
- 資料節點 (NDBD): 核心儲存與同步,≥2 節點實現高可用,節點越多同步越慢
- SQL 節點 (API): 對外服務入口,可部署於 Web 伺服器或獨立主機,增加節點提升並發吞吐
NDB 引擎特性
- 記憶體內運算,無磁碟 I/O 瓶頸,速度極快
- 資料規模受限於叢集總記憶體 (建議單節點 8-16GB)
- 分散式架構,理論上 2 節點即可解決單點故障
優缺點權衡
| 優點 | 缺點 |
| 跨地理位置部署、擴展性佳、冗余度高、低成本高可用 | 資料量受記憶體限制、斷電風險、網路延遲影響效能 |
二、實驗環境規劃 (5 台 CentOS 6.4 VM)
| 角色 | 主機名 | IP |
| 管理節點 | mgm-node | 192.168.124.141 |
| 資料節點 1 | data-node-1 | 192.168.124.142 |
| 資料節點 2 | data-node-2 | 192.168.124.143 |
| SQL 節點 1 | sql-node-1 | 192.168.124.144 |
| SQL 節點 2 | sql-node-2 | 192.168.124.145 |
三、公共前置配置 (所有節點)
# 1. 安裝 MySQL Cluster
cd /root/Downloads
tar -xvzf mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64.tar.gz
mv mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64 /usr/local/mysql
# 2. 關閉防火牆與 SELinux
chkconfig --level 35 iptables off
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
reboot
四、管理節點配置 (192.168.124.141)
mkdir /var/lib/mysql-cluster
cat > /var/lib/mysql-cluster/config.ini << 'EOF'
[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
[ndb_mgmd]
NodeId=1
hostname=192.168.124.141
datadir=/var/lib/mysql-cluster
[ndbd]
NodeId=2
hostname=192.168.124.142
datadir=/usr/local/mysql/data
[ndbd]
NodeId=3
hostname=192.168.124.143
datadir=/usr/local/mysql/data
[mysqld]
NodeId=4
hostname=192.168.124.144
[mysqld]
NodeId=5
hostname=192.168.124.145
EOF
# 安裝管理工具
cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin
chmod +x /usr/local/bin/ndb_mgm*
五、資料節點配置 (142, 143 同步執行)
# 1. 建立使用者
groupadd mysql; useradd -g mysql mysql
# 2. 配置 my.cnf
cat > /etc/my.cnf << 'EOF'
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/sock/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=192.168.124.141
EOF
# 3. 初始化系統資料庫
cd /usr/local/mysql
mkdir sock
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 4. 設定目錄權限
chown -R root .
chown -R mysql:mysql /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql/sock
chgrp -R mysql .
# 5. 註冊服務
cp support-files/mysql.server /etc/rc.d/init.d/
chmod +x /etc/rc.d/init.d/mysql.server
chkconfig --add mysql.server
六、SQL 節點配置 (144, 145 同步執行)
# my.cnf 差異:啟用 ndbcluster 引擎
cat > /etc/my.cnf << 'EOF'
[client]
socket=/usr/local/mysql/sock/mysql.sock
[mysqld]
ndbcluster
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/sock/mysql.sock
ndb-connectstring=192.168.124.141
[mysql_cluster]
ndb-connectstring=192.168.124.141
EOF
# 後續初始化、權限、服務註冊步驟同資料節點
七、叢集啟動順序 (關鍵!)
- 管理節點:
ndb_mgmd -f /var/lib/mysql-cluster/config.ini (可用 ndb_mgm 監控)
- 資料節點 (首次):
/usr/local/mysql/bin/ndbd --initial (後續啟動不可加 --initial)
- SQL 節點:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
八、雙向同步測試驗證
測試一:建表與資料同步
-- SQL 節點 1 執行
CREATE DATABASE aa;
USE aa;
CREATE TABLE ctest2 (i INT) ENGINE=NDB; -- 必須指定 NDB 引擎
INSERT INTO ctest2 VALUES (1);
SELECT * FROM ctest2;
-- SQL 節點 2 驗證
SHOW DATABASES;
USE aa;
SELECT * FROM ctest2; -- 應看到同步資料
測試二:節點故障恢復同步
- 關閉資料節點 1
- SQL 節點 2 寫入新資料
- 重啟資料節點 1 (
ndbd --initial + service mysqld start)
- 驗證資料節點 1 同步回寫入期間的資料
九、關閉叢集順序
# 1. 管理節點關閉所有
ndb_mgm -e shutdown
# 2. SQL 節點停止服務
/etc/init.d/mysql.server stop