| 角色 | 主機名 | IP | 架構 | 進程 |
|---|---|---|---|---|
| 管理節點 (MGM) | erpdbtest | 192.168.32.22 | 32位 | ndb_mgmd, ndb_mgm |
| 數據節點 1 | dbs1 | 202.122.32.68 | 64位 | ndbd |
| 數據節點 2 | dbs2 | 202.38.128.153 | 64位 | ndbd |
| SQL 節點 1 | dbs1 | 202.122.32.68 | 64位 | mysqld |
| SQL 節點 2 | dbs2 | 202.38.128.153 | 64位 | mysqld |
複製因子 NoOfReplicas=2:兩數據節點互為備份,單點故障不丟數據。
# 關閉防火牆
service iptables stop
chkconfig --level 35 iptables off
# 關閉 SELinux
vim /etc/selinux/config
# SELINUX=permissive 或 disabled
# 重啟生效
# 卸載舊 MySQL
rpm -qa | grep -i mysql | xargs rpm -e --nodeps
rm -rf /etc/my.cnf /var/lib/mysql
# 解壓 32 位包
tar -zxvf mysql-cluster-gpl-7.2.4-linux2.6-i686.tar.gz
# 創建目錄
mkdir -p /usr/local/mysql/bin /usr/local/mysql/ndbdata /var/lib/mysql-cluster /usr/local/mysql/cluster-conf
# 拷貝二進制
cp mysql-cluster-gpl-7.2.4-linux2.6-i686/bin/ndb_mgmd /usr/local/mysql/bin/
cp mysql-cluster-gpl-7.2.4-linux2.6-i686/bin/ndb_mgm /usr/local/mysql/bin/
# 環境變量
echo 'PATH=$PATH:/usr/local/mysql/bin' >> ~/.bash_profile && source ~/.bash_profile
# 配置文件 config.ini
cat > /usr/local/mysql/cluster-conf/config.ini <<'EOF'
[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
[ndb_mgmd]
id=1
hostname=192.168.32.22
DataDir=/var/lib/mysql-cluster
[ndbd]
id=11
HostName=202.122.32.68
DataDir=/usr/local/mysql/ndbdata
[ndbd]
id=12
HostName=202.38.128.153
DataDir=/usr/local/mysql/ndbdata
[mysqld]
id=21
HostName=202.122.32.68
[mysqld]
id=22
HostName=202.38.128.153
[mysqld]
id=23 # 預留空節點供動態擴容
EOF
# 解壓 64 位包
tar -zxvf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz
# 目錄與二進制
mkdir -p /usr/local/mysql/bin /usr/local/mysql/ndbdata
cp mysql-cluster-gpl-7.2.4-linux2.6-x86_64/bin/ndbd /usr/local/mysql/bin/
echo 'PATH=$PATH:/usr/local/mysql/bin' >> ~/.bash_profile && source ~/.bash_profile
# 連接管理節點配置 /etc/my.cnf
cat > /etc/my.cnf <<'EOF'
[mysql_cluster]
ndb-connectstring=192.168.32.22
EOF
# 解壓 64 位包作為 MySQL Server
tar -zxvf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz
mv mysql-cluster-gpl-7.2.4-linux2.6-x86_64 /usr/local/mysql
# 用戶與權限
groupadd mysql && useradd -g mysql mysql
chown -R mysql:mysql /usr/local/mysql
# 初始化數據目錄
cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql
# 服務註冊
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld && chkconfig --level 35 mysqld on
# 環境變量
echo 'PATH=$PATH:/usr/local/mysql/bin' >> ~/.bash_profile && source ~/.bash_profile
# 配置 NDB 連接 /etc/my.cnf
cat >> /etc/my.cnf <<'EOF'
[mysqld]
ndbcluster
ndb-connectstring=192.168.32.22
port=3306
socket=/tmp/mysql.sock
EOF
# 管理節點
ndb_mgmd -f /usr/local/mysql/cluster-conf/config.ini
# 首次或配置變更需刪除舊緩存
# rm /var/lib/mysql-cluster/ndb_1_config.bin.1
# 數據節點 (兩台並行)
ndbd --initial # 首次必加 --initial
ndbd # 後續啟動
# SQL 節點 (兩台並行)
service mysqld start
# 或 /etc/rc.d/init.d/mysqld start
# 管理節點執行
ndb_mgm -e show
正常輸出:
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=11 @202.122.32.68 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master)
id=12 @202.38.128.153 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.32.22 (mysql-5.5.19 ndb-7.2.4)
[mysqld(API)] 3 node(s)
id=21 @202.122.32.68 (mysql-5.5.19 ndb-7.2.4)
id=22 @202.38.128.153 (mysql-5.5.19 ndb-7.2.4)
id=23 (not connected, accepting connect from any host)
# SQL 節點 1
mysql -uroot -p
CREATE DATABASE ndbtest;
USE ndbtest;
CREATE TABLE t1 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=ndbcluster DEFAULT CHARSET=gbk;
INSERT INTO t1 VALUES (),(),();
# SQL 節點 2
mysql -uroot -p
USE ndbtest;
SELECT * FROM t1; -- 應看到 3 行
SHOW TABLES; -- 應看到 t1
⚠️ 必須指定 ENGINE=ndbcluster,否則建立的是本地 InnoDB 表,不同步。
# 順序:SQL → 管理
service mysqld stop # 兩個 SQL 節點
ndb_mgm -e shutdown # 管理節點發送關閉指令,數據節點自動停止
# rm /var/lib/mysql-cluster/ndb_1_config.bin.1 # 配置變更時清理
| 現象 | 原因 | 對策 |
|---|---|---|
| 一台 ndbd 停,另一台也跟著停 | NoOfReplicas=2 但只有一組節點組,單點故障導致集群不可用 | 確保兩數據節點同時在線;生產建議 4 數據節點 (2 節點組) |
| 同時執行 ndbd --initial 導致數據全丟 | --initial 會清空數據目錄重做 | 滾動重啟:一台 --initial 完成同步後,再重啟另一台 |
| 修改 config.ini 後重啟不生效 | 管理節點緩存舊配置 ndb_1_config.bin.1 | 重啟管理節點前刪除該文件 |
| 建庫建表不同步 | NDB 不自動發現 DDL (舊版本) | 每個 SQL 節點手動 CREATE DATABASE ...; FLUSH TABLES; |
| 配置文件順序錯誤導致節點 ID 衝突 | [mysqld]/[ndbd] 區塊內 id 必須在 HostName 之前 | 統一模板:id → HostName → 其他參數 |
/usr/local/mysql/
├── bin/ # ndb_mgmd, ndb_mgm, ndbd, mysqld
├── ndbdata/ # 數據節點數據目錄
├── cluster-conf/ # config.ini
/var/lib/mysql-cluster/ # 管理節點日誌/緩存
/etc/my.cnf # 數據/SQL 節點連接串
MySQL Cluster 7.2.4 部署核心在於:**拓撲規劃清晰、版本架構匹配、配置文件 id/HostName 順序正確、啟動順序嚴格、首次必加 --initial、配置變更清緩存**。掌握 ndb_mgm -e show 狀態解讀,建立標準化運維手冊,可將集群部署從「玄學」變為「標準動作」。