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

Heartbeat + DRBD + MySQL 高可用叢集實戰部署:從雙機熱備架構到切換演練的完整落地指南

     編輯:MySQL 資料庫相關知識

架構總覽:三層疊加模型

┌─────────────────────────────────────┐
│  Application / VIP (192.168.0.253)   │  ← Heartbeat 管理 IP 漂移
├─────────────────────────────────────┤
│  MySQL Service (mysqld)              │  ← Heartbeat 管理服務啟停
├─────────────────────────────────────┤
│  Filesystem (ext3/ext4 on /dev/drbd0)│  ← Heartbeat 管理掛載/卸載
├─────────────────────────────────────┤
│  DRBD Block Device (/dev/drbd0)      │  ← DRBD 同步鏡像 /dev/sdb1
├─────────────────────────────────────┤
│  Physical Disk (/dev/sdb1)           │  ← 兩節點同規格分區
└─────────────────────────────────────┘

資源啟動順序 (左→右):DRBD Primary → 掛載 FS → 啟動 MySQL → 綁定 VIP
資源停止順序 (右←左):釋放 VIP → 停止 MySQL → 卸載 FS → DRBD Secondary

環境規劃 (CentOS 5.2 歷史版本,現代部署請參考 88252 文章 Pacemaker 版)

節點主機名管理 IP (eth0)心跳/同步 IP (eth1)角色
Node 1ha1192.168.0.251192.168.254.4Primary (偏好)
Node 2ha2192.168.0.252192.168.254.5Secondary
  • 共享分區:/dev/sdb1 (雙機同大小,無檔案系統)
  • VIP:192.168.0.253/24 綁定 eth0:0
  • DRBD 連接埠:7898

步驟一:安裝 DRBD、Heartbeat、MySQL

# 兩節點同步執行
yum -y install drbd82 kmod-drbd82
yum -y install heartbeat heartbeat-pils heartbeat-stonith
yum -y install mysql mysql-server

# 載入模組
modprobe drbd
lsmod | grep drbd

步驟二:配置 DRBD (/etc/drbd.conf)

global { usage-count yes; }
common { syncer { rate 10M; } }   # 百兆網卡 10M,千兆 100M

resource r0 {
    protocol C;
    net {
        cram-hmac-alg sha1;
        shared-secret "FooFunFactory";
    }
    on ha1 {
        device    /dev/drbd0;
        disk      /dev/sdb1;
        address   192.168.254.4:7898;
        meta-disk internal;
    }
    on ha2 {
        device    /dev/drbd0;
        disk      /dev/sdb1;
        address   192.168.254.5:7898;
        meta-disk internal;
    }
}

步驟三:初始化與啟動 DRBD

# 兩節點執行
drbdadm create-md r0
# 輸入 yes 確認

# 啟動 (ha1 先啟動等待,ha2 啟動後自動握手同步)
/etc/init.d/drbd start

# 觀察同步
cat /proc/drbd
# 等待 ds:UpToDate/UpToDate

# ha1 提升 Primary (首次需 --force)
drbdsetup /dev/drbd0 primary -o

# 建立檔案系統 (僅 Primary)
mkfs.ext3 /dev/drbd0
mount /dev/drbd0 /mnt
touch /mnt/huzi
ls /mnt/  # 驗證寫入

# 降級測試
umount /mnt
drbdadm secondary r0
# ha2 提升
drbdadm primary r0
mount /dev/drbd0 /mnt
ls /mnt/  # 應看到 huzi

步驟四:遷移 MySQL 資料至 DRBD 設備

# 在 ha1 (Primary) 執行
service mysqld start   # 初始化系統表
service mysqld stop

mount /dev/drbd0 /mnt
cp -ar /var/lib/mysql/* /mnt/
umount /mnt

# 修改 my.cnf
datadir = /var/lib/mysql   # 掛載點即為此
socket = /var/lib/mysql/mysql.sock

步驟五:配置 Heartbeat (v1 風格)

/etc/ha.d/ha.cf:

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 10
warntime 5
initdead 120
ucast eth1 192.168.254.5   # 對端心跳 IP
auto_failback on
watchdog /dev/watchdog
node ha1
node ha2
ping 192.168.254.1         # 網關偵測
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

/etc/ha.d/authkeys (chmod 600):

auth 1
1 crc

/etc/ha.d/haresources:

ha1 IPaddr::192.168.0.253/24/eth0:1 mysqld_umount mysqld

自定義資源腳本 /etc/ha.d/resource.d/mysqld_umount:

#!/bin/sh
# DRBD + FS + MySQL 整合啟停腳本
. /etc/ha.d/shellfuncs

case "$1" in
  start)
    /sbin/drbdadm primary all
    /bin/mount /dev/drbd0 /var/lib/mysql
    ;;
  stop)
    /bin/umount /var/lib/mysql
    /sbin/drbdadm secondary all
    ;;
  *) echo "Usage: $0 {start|stop}"; exit 1 ;;
esac
exit 0

chmod +x /etc/ha.d/resource.d/mysqld_umount

步驟六:同步配置並啟動叢集

# ha1 複製至 ha2
scp -r /etc/ha.d ha2:/etc/

# ha2 修改 ha.cf 的 ucast 指向 ha1
# 兩節點同時啟動
/etc/init.d/heartbeat start

# 觀察日誌
tail -f /var/log/ha-log
# 關鍵成功標誌:
# "Local Resource acquisition completed"
# "Initial resource acquisition complete (auto_failback)"
# ip addr show eth0:0 顯示 VIP
# mount | grep drbd0
# cat /proc/drbd 顯示 Primary/Secondary

切換測試矩陣與驗證結果

測試場景操作觀察結果切換時間
手動待機Primary 執行 /usr/lib/heartbeat/hb_standby資源順序釋放 → Secondary 獲取 → VIP/FS/MySQL 全部遷移~10 秒
網路中斷拔掉 Primary eth1 (心跳網卡)deadtime 後判定失聯,切換流程同手動deadtime + ~10 秒
主機關機Primary shutdown -h now同網路中斷同網路中斷
主機斷電物理斷電同關機,DRBD 保證資料一致性同關機

驗證結果:4 次測試中 3 次資料零差異,1 次相差 1 條 (極邊界競態),整體符合生產可用性要求。

生產環境關鍵補強 (本文環境為測試簡化)

  • ☐ STONITH (硬體隔離):配置 IPMI/PDU/VMware API,防雙 Primary 腦裂分叉
  • ☐ 升級 Pacemaker + Corosync:Heartbeat v1 已停止維護,現代 HA 棧支援資源監控、約束、多節點、GUI
  • ☐ 專用心跳網路:獨立 VLAN/物理網卡,MTU 9000,綁定 ucast
  • ☐ DRBD 同步速率:rate 設為網卡 70-80%,避免擠佔業務流量
  • ☐ MySQL 參數:innodb_flush_log_at_trx_commit=1、sync_binlog=1、innodb_buffer_pool_size 留 20% 系統/DRBD
  • ☐ 啟動順序:DRBD 模組 → DRBD 服務 → Heartbeat (rc.local 或 systemd depends)
  • ☐ 監控告警:drbdadm status、crm_mon -1、VIP 存活、MySQL 連線/延遲/錯誤率、磁碟/網路飽和度
  • ☐ 定期演練:每季計劃內切換 + 突發故障模擬,記錄 RTO/RPO

與主從複制 (A/B Replication) 對比

維度DRBD + Heartbeat主從複制 (非同步/半同步)
資料一致性強一致 (Protocol C),零資料丟失非同步可能丟失、半同步仍有極小窗口
讀擴展Secondary 不可讀 (單主)Slave 可讀,支援讀寫分離
切換速度~10-30 秒秒級 (MHA/Orchestrator) 至分鐘級
架構複雜度中 (雙機、共享塊裝置)低 (多 Slave、邏輯複制)
跨機房延遲敏感,通常同城天然支援跨地域非同步
成本雙機專用儲存可用商品硬體、雲盤

組合最佳實踐:DRBD 雙機保核心庫強一致 HA + 額外掛 1-2 個非同步 Slave 承擔讀流量/備份/異地災備。

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