本文詳細介紹如何在兩台服務器上部署 MySQL 叢集,並實現任意單節點故障時服務不中斷。雖然核心數據節點僅需兩台,但架構強制要求第三台獨立的管理節點。管理節點負責叢集配置分發、仲裁決策,啟動後理論上可關閉,但生產環境強烈建議保持運行——若僅兩台數據節點且無管理節點,任一宕機將導致整個叢集不可用,失去高可用意義。
實驗環境採用三台虛擬機:
Server1 和 Server2 均需執行以下步驟(必須使用 mysql-max 版本,Standard 版不支援叢集):
# mv mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/
# cd /usr/local/
# groupadd mysql
# useradd -g mysql mysql
# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# rm -f mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# mv mysql-max-4.1.9-pc-linux-gnu-i686 mysql
# cd mysql
# scripts/mysql_install_db --user=mysql
# chown -R root .
# chown -R mysql data
# chgrp -R mysql .
# cp support-files/my-medium.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod +x /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
注意:此時切勿啟動 MySQL!
Server3 僅需提取 ndb_mgm 和 ndb_mgmd 兩個二進制文件:
# mkdir /usr/src/mysql-mgm && cd /usr/src/mysql-mgm
# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# cd mysql-max-4.1.9-pc-linux-gnu-i686
# mv bin/ndb_mgm bin/ndb_mgmd .
# chmod +x ndb_mg*
# mv ndb_mg* /usr/bin/
# cd && rm -rf /usr/src/mysql-mgm
建立配置目錄並編寫 config.ini:
# mkdir -p /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini
配置文件核心內容:
[NDBD DEFAULT]
NoOfReplicas=2
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Management Server
[NDB_MGMD]
HostName=192.168.0.3
# Storage Engines (Data Nodes)
[NDBD]
HostName=192.168.0.1
DataDir=/var/lib/mysql-cluster
[NDBD]
HostName=192.168.0.2
DataDir=/var/lib/mysql-cluster
# SQL Nodes (留空便於後續擴容/替換節點)
[MYSQLD]
[MYSQLD]
啟動管理服務:ndb_mgmd(無輸出屬正常)。
在 Server1、Server2 修改 /etc/my.cnf:
[mysqld]
ndbcluster
ndb-connectstring=192.168.0.3
[mysql_cluster]
ndb-connectstring=192.168.0.3
建立數據目錄並初始化啟動:
# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# /usr/local/mysql/bin/ndbd --initial # 僅首次或配置變更時使用 --initial
# /etc/rc.d/init.d/mysqld start
將 /usr/local/mysql/bin/ndbd 加入 /etc/rc.local 實現開機自啟。
在 Server3 執行 /usr/bin/ndb_mgm 進入管理終端,輸入 show:
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
-------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.1 (Version: 4.1.9, Nodegroup: 0, Master)
id=3 @192.168.0.2 (Version: 4.1.9, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.3 (Version: 4.1.9)
[mysqld(API)] 2 node(s)
id=4 (Version: 4.1.9)
id=5 (Version: 4.1.9)
在 Server1 建表測試:
mysql> USE test;
mysql> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
mysql> INSERT INTO ctest () VALUES (1);
mysql> SELECT * FROM ctest;
切換到 Server2 驗證數據同步,雙向寫入測試無誤即部署成功。
破壞性測試:拔除任一數據節點網線,或殺掉 ndbd 進程(kill -9 ),觀察另一節點查詢是否正常。恢復時僅需重啟 ndbd(無需 --initial)。