DRBD (Distributed Replicated Block Device):核心模組 + 用戶空間工具,實現區塊級同步鏡像 (網路 RAID-1)。寫入本地同時網路發送至對端,強一致性 (Protocol C),無共享儲存即可實現雙機共享資料。
Heartbeat (Linux-HA):叢集訊息層,負責心跳偵測、資源佔有、故障切換編排。
組合優勢:低成本 (雙機即可)、無單點儲存、切換時間 < 30 秒、支援 IP 漂移、應用透明。
| 角色 | 主機名 | 管理 IP (eth0) | 心跳/同步 IP (eth1) | 備註 |
|---|---|---|---|---|
| Primary | drbd-1 | 192.168.1.241 | 192.168.254.4 | 服務 IP 192.168.1.243 漂移其上 |
| Secondary | drbd-2 | 192.168.1.242 | 192.168.254.5 | 待機接管 |
/dev/sdb1 (雙機同樣大小,不建立檔案系統,交給 DRBD 管理)192.168.1.243/24 綁定 eth0:0# 所有節點執行
yum install -y drbd84-utils kmod-drbd84 # EL7 包名
yum install -y heartbeat heartbeat-pils heartbeat-stonith
# 驗證模組載入
modprobe drbd
lsmod | grep drbd
# 輸出 drbd xxxxxx 0 表示成功
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;
}
}
# 兩節點同步執行
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/
/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/drbd0mysqld:啟動/停止 MySQL 服務 (需 /etc/ha.d/resource.d/mysqld 腳本)192.168.1.243:IPaddr2 RA,VIP 漂移# 在 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
# 驗證業務正常
# 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_standby | 30 秒內 VIP、掛載、MySQL 全部遷移至 Secondary | 日誌資源釋放/獲取順序、ip addr show、mount、mysql -h VIP |
| 網路中斷 | 拔掉 Primary eth0/eth1 | Heartbeat 偵測 deadtime 後切換 | 同手動切換 |
| 主機關機 | Primary shutdown -h now | 同網路中斷 | 同手動切換 |
| 主機斷電 | 物理斷電 | 同關機,DRBD 保證資料一致 | 重啟後 cat /proc/drbd 狀態 UpToDate |
ucast 而非廣播rate 設為網卡帶寬 70-80%,避免佔滿業務流量innodb_flush_log_at_trx_commit=1、sync_binlog=1、innodb_buffer_pool_size 留 20% 給 OS/DRBDdrbdadm status、crm_mon -1 (若升級 Pacemaker)、VIP 存活、MySQL 連線數、延遲、錯誤率Heartbeat v1 已進入維護模式,新專案建議直接採用 Pacemaker (CRM) + Corosync:
pcs resource create ms_mysql ocf:linbit:drbd drbd_resource=mysql master notify=true