首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

高可用 MySQL 叢集架構實戰:三節點 NDB Cluster + Ultra Monkey 雙機熱備負載均衡完整部署指南

     編輯:MySQL 資料庫相關知識

架構總覽

本方案部署 **3 節點 MySQL NDB Cluster(2 資料節點 + 1 管理節點)** + **2 節點 Ultra Monkey 負載均衡(Heartbeat + ldirectord)**,實現:

  • 資料層:NDB Cluster 同步複寫、自動故障轉移、無單點
  • 存取層:虛擬 IP (VIP) 統一入口、ldirectord 健康檢查、Heartbeat 雙機熱備

節點規劃(範例 IP)

角色主機名IP備註
資料節點 1sql1192.168.0.101ndbd
資料節點 2sql2192.168.0.102ndbd
管理/負載 1loadb1192.168.0.103ndb_mgmd + ldirectord (Active)
負載 2loadb2192.168.0.104ldirectord (Standby)
虛擬 IP—192.168.0.105應用統一連線入口

一、NDB Cluster 部署

1. 管理節點

# loadb1
mkdir -p /var/lib/mysql-cluster
cat > /var/lib/mysql-cluster/config.ini <<'EOF'
[NDBD DEFAULT]
NoOfReplicas=2

[NDB_MGMD]
HostName=192.168.0.103

[NDBD]
HostName=192.168.0.101
DataDir=/var/lib/mysql-cluster

[NDBD]
HostName=192.168.0.102
DataDir=/var/lib/mysql-cluster

[MYSQLD]
[MYSQLD]
EOF

ndb_mgmd -f /var/lib/mysql-cluster/config.ini
# 開機自啟
echo "ndb_mgmd -f /var/lib/mysql-cluster/config.ini" > /etc/init.d/ndb_mgmd
chmod +x /etc/init.d/ndb_mgmd
update-rc.d ndb_mgmd defaults

2. 資料節點(sql1、sql2 同步執行)

# 安裝 MySQL Cluster 版本
groupadd mysql; useradd -r -g mysql mysql
cd /usr/local
tar -zxvf mysql-max-5.0.xx-linux-i686-glibc23.tar.gz
ln -s mysql-max-5.0.xx-linux-i686-glibc23 mysql
cd mysql
scripts/mysql_install_db --user=mysql
chown -R root:mysql .; chown -R mysql data
cp support-files/mysql.server /etc/init.d/
chmod +x /etc/init.d/mysql.server
update-rc.d mysql.server defaults

# my.cnf
cat > /etc/my.cnf <<'EOF'
[mysqld]
ndbcluster
ndb-connectstring=192.168.0.103

[mysql_cluster]
ndb-connectstring=192.168.0.103
EOF

mkdir -p /var/lib/mysql-cluster
ndbd --initial  # 首次或配置變更時
/etc/init.d/mysql.server start

mysqladmin -u root password 'RootPass!23'

# 開機自啟 ndbd
echo "ndbd" > /etc/init.d/ndbd
chmod +x /etc/init.d/ndbd
update-rc.d ndbd defaults

3. 驗證叢集

# loadb1
ndb_mgm
ndb_mgm> SHOW;
-- 應見 2 ndbd (connected)、1 ndb_mgmd、2 mysqld (API)

4. 測試資料同步

# sql1
mysql -u root -p
CREATE DATABASE clustertest;
USE clustertest;
CREATE TABLE t (i INT) ENGINE=NDBCLUSTER;  -- 必須指定 ENGINE=NDBCLUSTER
INSERT INTO t VALUES (1);

# sql2
mysql -u root -p
CREATE DATABASE clustertest;
USE clustertest;
SELECT * FROM t;  -- 應見 1

# sql2 插入
INSERT INTO t VALUES (2);

# sql1 查詢
SELECT * FROM t;  -- 應見 1,2

二、Ultra Monkey 負載均衡部署

1. 核心模組載入

# loadb1、loadb2
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
# 寫入 /etc/modules 持久化

2. 安裝套件

echo "deb https://www.ultramonkey.org/download/3/ sarge main" >> /etc/apt/sources.list
apt-get update
apt-get install ultramonkey libdbi-perl libdbd-mysql-perl
# 升級 DBD::MySQL 支援 MySQL 5.x
cpan DBD::mysql

3. 啟用封包轉發

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

4. Heartbeat 配置(三檔案雙節點完全一致)

# /etc/ha.d/ha.cf
logfacility local0
bcast eth0
mcast eth0 225.0.0.1 694 1 0
auto_failback off
node loadb1
node loadb2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

# /etc/ha.d/haresources
loadb1
ldirectord::ldirectord.cf
LVSSyncDaemonSwap::master
IPaddr2::192.168.0.105/24/eth0/192.168.0.255

# /etc/ha.d/authkeys
auth 3
3 md5 YourSecretStringHere
chmod 600 /etc/ha.d/authkeys

5. ldirectord 配置

# /etc/ha.d/ldirectord.cf
checktimeout=10
checkinterval=2
autoreload=no
logfile="local0"
quiescent=yes
virtual=192.168.0.105:3306
service=MySQL
real=192.168.0.101:3306 gate
real=192.168.0.102:3306 gate
checktype=negotiate
login="ldirector"
passwd="LdirectorPass!"
database="ldirectordb"
request="SELECT * FROM connectioncheck"
scheduler=wrr

6. 叢集節點建立健康檢查庫

# sql1、sql2
mysql -u root -p
GRANT ALL ON ldirectordb.* TO 'ldirector'@'%' IDENTIFIED BY 'LdirectorPass!';
FLUSH PRIVILEGES;
CREATE DATABASE ldirectordb;
USE ldirectordb;
CREATE TABLE connectioncheck (i INT) ENGINE=NDBCLUSTER;
INSERT INTO connectioncheck VALUES (1);

7. 叢集節點配置 VIP 接收(ARP 抑制)

# sql1、sql2
apt-get install iproute
cat >> /etc/sysctl.conf <<'EOF'
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.eth0.arp_announce=2
EOF
sysctl -p

cat >> /etc/network/interfaces <<'EOF'
auto lo:0
iface lo:0 inet static
address 192.168.0.105
netmask 255.255.255.255
pre-up sysctl -p >/dev/null
EOF
ifup lo:0

8. 啟動與驗證

# loadb1、loadb2
/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start
# 重啟機器確保開機自啟
reboot

# 驗證
ip addr show eth0          # Active 節點顯示 192.168.0.105
ldirectord ldirectord.cf status
ipvsadm -L -n              # 顯示 VIP:3306 → 兩個 Real Server
/etc/ha.d/resource.d/LVSSyncDaemonSwap master status

三、應用連線驗證

mysql -h 192.168.0.105 -u ldirector -p
# 任意關閉 sql1 或 sql2,連線應自動切換至存活節點

四、關鍵運維提醒

項目建議
記憶體規劃NDB 全記憶體存儲,公式:(資料大小 × 副本數 × 1.1) / 資料節點數。1GB 資料需每節點 1.1GB RAM
管理節點安全1186 埠僅內網開放,建議獨立管理網段
分裂腦防護管理節點必須常駐,否則雙資料節點網路分區時會產生 Split-Brain
備份策略ndb_mgm → START BACKUP 線上熱備,配合 mysqldump 邏輯備份
版本升級滾動升級:依次重啟 ndbd、mysqld,管理節點最後

結語

此架構以 **NDB Cluster 解決資料層高可用**,以 **Ultra Monkey (Heartbeat + ldirectord) 解決存取層高可用**,形成完整的「無單點、自動故障轉移、統一 VIP」MySQL 叢集。部署雖繁,但每個組件均為成熟開源專案,經過大規模生產驗證。關鍵在於:**記憶體充足、網路低延遲、管理節點高可用、定期演練故障切換**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved