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

MySQL 高可用架構實戰:DRBD + Heartbeat 打造雙機熱備,從原理到生產落地的完整實施指南

     編輯:MySQL 資料庫相關知識

架構總覽:為什麼選 DRBD + Heartbeat?

DRBD (Distributed Replicated Block Device):核心模組 + 用戶空間工具,實現區塊級同步鏡像 (網路 RAID-1)。寫入本地同時網路發送至對端,強一致性 (Protocol C),無共享儲存即可實現雙機共享資料。
Heartbeat (Linux-HA):叢集訊息層,負責心跳偵測、資源佔有、故障切換編排。
組合優勢:低成本 (雙機即可)、無單點儲存、切換時間 < 30 秒、支援 IP 漂移、應用透明。

環境規劃

角色主機名管理 IP (eth0)心跳/同步 IP (eth1)備註
Primarydrbd-1192.168.1.241192.168.254.4服務 IP 192.168.1.243 漂移其上
Secondarydrbd-2192.168.1.242192.168.254.5待機接管
  • OS:CentOS 7 / RHEL 7 (kernel 3.10+ 內建 DRBD 模組)
  • 專用分區:/dev/sdb1 (雙機同樣大小,不建立檔案系統,交給 DRBD 管理)
  • 服務 IP (VIP):192.168.1.243/24 綁定 eth0:0

步驟一:安裝 DRBD 與 Heartbeat

# 所有節點執行
yum install -y drbd84-utils kmod-drbd84  # EL7 包名
yum install -y heartbeat heartbeat-pils heartbeat-stonith

# 驗證模組載入
modprobe drbd
lsmod | grep drbd
# 輸出 drbd xxxxxx 0 表示成功

步驟二:配置 DRBD (/etc/drbd.d/mysql.res)

global {
    usage-count yes;
}
common {
    syncer {
        rate 100M;          # 千兆網卡建議 100M,萬兆可 1000M
        verify-alg sha1;
    }
}
resource mysql {
    protocol C;             # 強一致:收到對端寫入確認才返回應用
    startup {
        wfc-timeout 0;      # 等待對端永久 (首次啟動)
        degr-wfc-timeout 120; # 降級模式等待 120 秒
    }
    disk {
        on-io-error detach; # I/O 錯誤自動分離,防止資料損壞
        size 50G;           # 限制使用分區大小,防止分區不等大
    }
    net {
        max-buffers 2048;
        ko-count 4;
        sndbuf-size 512k;
        rcvbuf-size 512k;
    }
    syncer {
        rate 100M;
        al-extents 3389;    # 活動日誌範圍,大寫入量調大
    }
    on drbd-1 {
        device /dev/drbd0;
        disk /dev/sdb1;
        address 192.168.254.4:7789;
        meta-disk internal;
    }
    on drbd-2 {
        device /dev/drbd0;
        disk /dev/sdb1;
        address 192.168.254.5:7789;
        meta-disk internal;
    }
}

步驟三:初始化與啟動 DRBD

# 兩節點同步執行
drbdadm create-md mysql
# 提示輸入 yes 確認覆蓋元資料

# 啟動服務
systemctl start drbd
systemctl enable drbd

# 觀察同步進度
watch -n 1 cat /proc/drbd
# 關鍵狀態轉換:
# cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent
#   ↓ (drbd-1 執行下指令)
# cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent
#   ↓ (同步完成)
# cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate
# 在 drbd-1 提升為 Primary (首次需 --force)
drbdadm primary --force mysql

# 建立檔案系統 (僅 Primary 執行)
mkfs.ext4 /dev/drbd0

# 掛載驗證
mkdir /mysql-data
mount /dev/drbd0 /mysql-data
echo "test" > /mysql-data/ha-test.txt
ls /mysql-data/

步驟四:配置 Heartbeat (v1 風格,DRBD 官方建議)

/etc/ha.d/ha.cf:

logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 10
warntime 5
initdead 120
udpport 694
ucast eth1 192.168.254.5   # 對端心跳 IP
auto_failback off           # 生產建議 off,避免震盪
node drbd-1
node drbd-2
ping 192.168.1.1           # 網關偵測,防腦裂
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

/etc/ha.d/authkeys (權限 600):

auth 2
2 sha1 MySecretKey2024!

chmod 600 /etc/ha.d/authkeys

/etc/ha.d/haresources (資源啟動順序 = 左→右,停止順序 = 右→左):

drbd-1 drbddisk Filesystem::/dev/drbd0::/mysql-data::ext4 mysqld 192.168.1.243
  • drbd-1:偏好 Primary 節點
  • drbddisk:Heartbeat 內建 RA,負責 Primary/Secondary 切換
  • Filesystem:掛載/卸載 /dev/drbd0
  • mysqld:啟動/停止 MySQL 服務 (需 /etc/ha.d/resource.d/mysqld 腳本)
  • 192.168.1.243:IPaddr2 RA,VIP 漂移

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

# 在 drbd-1 (Primary) 執行
systemctl stop mysqld
mount /dev/drbd0 /mysql-data
rsync -av /var/lib/mysql/ /mysql-data/
chown -R mysql:mysql /mysql-data
# 修改 my.cnf
datadir = /mysql-data
socket = /mysql-data/mysql.sock
systemctl start mysqld
# 驗證業務正常

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

# drbd-1 執行
scp -r /etc/ha.d drbd-2:/etc/
# drbd-2 修改 ha.cf 的 ucast 指向 drbd-1
# 兩節點同時啟動
systemctl start heartbeat
# 觀察日誌
tail -f /var/log/ha-log

切換驗證與測試矩陣

測試場景操作預期結果驗證指標
手動切換Primary 執行 hb_standby30 秒內 VIP、掛載、MySQL 全部遷移至 Secondary日誌資源釋放/獲取順序、ip addr show、mount、mysql -h VIP
網路中斷拔掉 Primary eth0/eth1Heartbeat 偵測 deadtime 後切換同手動切換
主機關機Primary shutdown -h now同網路中斷同手動切換
主機斷電物理斷電同關機,DRBD 保證資料一致重啟後 cat /proc/drbd 狀態 UpToDate

生產環境加固清單

  • ☐ STONITH (Shoot The Other Node In The Head):配置 IPMI/PDU/虛擬化 API 硬體隔離,防腦裂雙 Primary 資料分叉
  • ☐ 專用心跳網路:獨立 VLAN/物理網卡/交換機,MTU 9000,綁定 ucast 而非廣播
  • ☐ DRBD 同步速率:rate 設為網卡帶寬 70-80%,避免佔滿業務流量
  • ☐ MySQL 配置:innodb_flush_log_at_trx_commit=1、sync_binlog=1、innodb_buffer_pool_size 留 20% 給 OS/DRBD
  • ☐ 監控告警:drbdadm status、crm_mon -1 (若升級 Pacemaker)、VIP 存活、MySQL 連線數、延遲、錯誤率
  • ☐ 定期演練:每季至少一次計劃內切換、一次突發故障模擬,記錄 RTO/RPO

遷移至 Pacemaker + Corosync (現代 HA 棧) 建議

Heartbeat v1 已進入維護模式,新專案建議直接採用 Pacemaker (CRM) + Corosync:

  • 資源代理 (RA) 更豐富、支援順序/共置/遷移約束
  • GUI 工具 (pcs、crmsh) 降低配置門檻
  • 多節點 (N+1)、地理分散、容器化支援更完善
  • DRBD 整合:pcs resource create ms_mysql ocf:linbit:drbd drbd_resource=mysql master notify=true
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved