本文實現雙節點 MySQL 高可用集群:
環境:CentOS 6.x,雙節點 test1.local (192.168.10.55) / test2.local (192.168.10.56),共享存儲掛載點 /mydrbd,VIP 192.168.10.3/24。
# /etc/hosts 兩節點一致
192.168.10.55 test1.local
192.168.10.56 test2.local
驗證:ping test1.local、ping test2.local 雙向通畅。
ssh-keygen -t rsa -P ''
ssh-copy-id test1.local
ssh-copy-id test2.local
# 兩節點 crontab
*/5 * * * * /usr/sbin/ntpdate 192.168.10.1 >/dev/null 2>&1
wget https://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
tar zxf drbd-8.4.3.tar.gz && cd drbd-8.4.3
./configure --prefix=/usr/local/drbd --with-km
make KDIR=/usr/src/kernels/$(uname -r)
make install
mkdir -p /usr/local/drbd/var/run/drbd
cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
# 編譯內核模塊
make clean
make KDIR=/usr/src/kernels/$(uname -r)
cp drbd.ko /lib/modules/$(uname -r)/kernel/lib/
modprobe drbd
lsmod | grep drbd
fdisk /dev/sdb # 新建 9G 主分區 /dev/sdb1
partprobe /dev/sdb
/usr/local/drbd/etc/drbd.d/global_common.confglobal {
usage-count no;
}
common {
protocol C; # 同步模式:數據寫入本地並發送遠端、遠端落盤後才返回成功
handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger; halt -f";
}
startup { wfc-timeout 30; degr-wfc-timeout 30; }
disk { on-io-error detach; }
net {
cram-hmac-alg "sha1";
shared-secret "mydrbd1fa2jg8";
}
syncer { rate 200M; }
}
/usr/local/drbd/etc/drbd.d/mydrbd.resresource mydrbd {
on test1.local {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.10.55:7789;
meta-disk internal;
}
on test2.local {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.10.56:7789;
meta-disk internal;
}
}
# 兩節點同步配置
scp -r /usr/local/drbd/etc/drbd.* test2.local:/usr/local/drbd/etc/
# 初始化元數據
drbdadm create-md mydrbd
# 啟動服務
service drbd start
# 查看狀態:雙 Secondary,Inconsistent
cat /proc/drbd
# test1.local 執行
drbdadm -- --overwrite-data-of-peer primary mydrbd
# 觀察同步進度
watch -n1 cat /proc/drbd
# 直到 ds:UpToDate/UpToDate
# 主節點格式化、掛載、寫入測試
mkfs.ext3 /dev/drbd0
mkdir /mydrbd && mount /dev/drbd0 /mydrbd
touch /mydrbd/test_file
# 降級為 Secondary,另一節點提升 Primary 驗證數據同步
umount /mydrbd
drbdadm secondary mydrbd
# test2.local: drbdadm primary mydrbd && mount /dev/drbd0 /mydrbd && ls /mydrbd
wget -P /etc/yum.repos.d/ https://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/network:ha-clustering:Stable.repo
yum install corosync pacemaker crmsh -y
mkdir /var/log/cluster
/etc/corosync/corosync.conftotem {
version: 2
secauth: on
threads: 2
interface {
ringnumber: 0
bindnetaddr: 192.168.10.0
mcastaddr: 239.212.16.19
mcastport: 5405
ttl: 1
}
}
logging {
to_logfile: yes
logfile: /var/log/cluster/corosync.log
to_syslog: no
timestamp: on
}
service {
ver: 0
name: pacemaker
}
aisexec {
user: root
group: root
}
corosync-keygen
scp -p /etc/corosync/authkey /etc/corosync/corosync.conf test2.local:/etc/corosync/
service corosync start
ssh test2.local 'service corosync start'
# 檢查集群狀態
crm status
# 預期:2 nodes configured, online: [test1.local test2.local]
進入 CRM 交互模式:crm configure
property stonith-enabled=false
property no-quorum-policy=ignore
rsc_defaults resource-stickiness=100
commit
primitive mysqldrbd ocf:linbit:drbd \
params drbd_resource=mydrbd \
op start timeout=240 \
op stop timeout=100 \
op monitor role=Master interval=10 timeout=20 \
op monitor role=Slave interval=20 timeout=20
ms ms_mysqldrbd mysqldrbd \
meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
commit
關鍵點:資源名 mysqldrbd、主從組名 ms_mysqldrbd 必須不同;notify=true 確保角色變更通知文件系統資源。
primitive mystore ocf:heartbeat:Filesystem \
params device=/dev/drbd0 directory=/mydrbd fstype=ext3 \
op start timeout=60 op stop timeout=60
# 文件系統必須跟隨 DRBD Master
colocation mystore_with_ms_mysqldrbd inf: mystore ms_mysqldrbd:Master
# 順序:先提升 DRBD Master,再掛載文件系統
order mystore_after_ms_mysqldrbd mandatory: ms_mysqldrbd:promote mystore:start
commit
# 禁用開機自啟
chkconfig mysqld off # 兩節點均執行
primitive mysqld lsb:mysqld
# MySQL 必須與文件系統同節點
colocation mysqld_with_mystore inf: mysqld mystore
# 順序:文件系統掛載後啟動 MySQL
order mysqld_after_mystore mandatory: mystore:start mysqld:start
commit
primitive myip ocf:heartbeat:IPaddr2 \
params ip=192.168.10.3 nic=eth0 cidr_netmask=24
# VIP 綁定在 DRBD Master 節點
colocation myip_with_ms_mysqldrbd inf: myip ms_mysqldrbd:Master
commit
# 確保 DRBD 掛載於 /mydrbd
mkdir -p /mydrbd/data
chown -R mysql:mysql /mydrbd/data
# 初始化數據庫
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydrbd/data --basedir=/usr/local/mysql
# 修改 my.cnf
datadir=/mydrbd/data
# 手動啟動驗證
service mysqld start
mysql -uroot -e "CREATE DATABASE drbd_mysql;"
service mysqld stop
# 切換 DRBD Master 到 test2.local
crm node standby test1.local
crm node online test1.local
# 驗證 test2.local 為 Master 且文件系統已掛載
# 配置 my.cnf 指向共享數據目錄
echo "datadir=/mydrbd/data" >> /etc/my.cnf
service mysqld start
mysql -uroot -e "SHOW DATABASES;" # 可見 drbd_mysql
service mysqld stop
crm status
# Master/SlaveSet: ms_mysqldrbd [mysqldrbd]
# Masters: [test1.local]
# Slaves: [test2.local]
# mystore: Started test1.local
# mysqld: Started test1.local
# myip: Started test1.local
crm node standby test1.local
crm status
# Masters: [test2.local]
# 所有資源自動遷移至 test2.local
# 任意時刻連接 VIP
mysql -uroot -h 192.168.10.3 -p
# 故障切換期間最多丟失未提交事務,連接短暫中斷後自動恢復
crm node online test1.local
# test1.local 變為 Slave,資源保持在 test2.local (stickiness=100)
# 如需手動切回:crm resource move ms_mysqldrbd test1.local
crm status、/proc/drbd 狀態、VIP 存活、MySQL 連通性本架構通過 Corosync 提供集群心跳、Pacemaker 管理資源生命周期、DRBD 保障存儲級數據同步、VIP 實現訪問入口高可用,構建了企業級 MySQL 雙節點高可用集群。生產環境建議補全 STONITH 隔離、引入備份節點、部署監控體系,並定期演練故障切換流程。