Heartbeat 是 Linux-HA 經典雙機熱備組件,配合 MySQL 複製與共享存儲 (NAS/DRBD/SAN),可構建主備切換、VIP 漂移、資源監控、自動故障轉移的高可用架構。本文基於 RedHat Linux 9 + MySQL 5.0.18 + Heartbeat 2.0.3,給出生產級部署全流程。
| 節點 | Hostname | Heartbeat IP (eth0) | Service IP (eth1) | 角色 |
|---|---|---|---|---|
| Node1 | mysql5 | 192.168.0.50 | 10.4.66.35 | Primary |
| Node2 | mysql6 | 192.168.0.60 | 10.4.66.36 | Standby |
# 1. 移除系統自帶 MySQL
rpm -e mysql-server
userdel mysql
mv /etc/my.cnf /etc/my.cnf.bak
# 2. 建立用戶、解壓、權限
useradd mysql
tar xzf mysql-max-5.0.18-linux-i686-glibc23.tar.gz
mv mysql-max-5.0.18-linux-i686-glibc23 /usr/local/mysql
cd /usr/local/mysql
chown -R root .
chown -R mysql ./data
chgrp -R mysql .
# 3. 掛載共享存儲並初始化數據目錄 (僅 Node1 執行)
mount 10.4.66.251:/data /data
mkdir /data/mysqldata
./scripts/mysql_install_db --user=mysql
chown -R mysql:mysql /data/mysqldata
[mysqld]
# 數據目錄指向共享存儲
datadir = /data/mysqldata
# InnoDB 文件放本地磁盤 (避免 NFS 鎖衝突、性能差)
innodb_data_home_dir = /usr/local/mysql/data
innodb_log_group_home_dir = /usr/local/mysql/data
innodb_data_file_path = ibdata1:50M;ibdata2:50M:autoextend
# 複製配置 (主從雙向,見下文)
server-id = 1 # Node2 改為 2
log-bin = mysql-bin
binlog-format = ROW
sync_binlog = 1
expire_logs_days = 7
# PID 文件放本地 (啟停腳本依賴)
pid-file = /usr/local/mysql/data/mysql.pid
cp support-files/mysql.server /etc/rc.d/init.d/mysql
vi /etc/rc.d/init.d/mysql
# 修改第 222 行左右
pid_file=/usr/local/mysql/data/mysql.pid
server_pid_file=/usr/local/mysql/data/mysql.pid
tar xzf heartbeat-2.0.3.tar.gz
cd heartbeat-2.0.3
./configure --prefix=/usr/local/heartbeat
make && make install
# ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast eth0 # 心跳廣播介面
auto_failback on # 故障恢復後自動切回主節點
node mysql5
node mysql6
# haresources
mysql5 10.4.66.88/24/eth1::10.4.66.2 mysql
# authkeys
auth 1
1 sha1 HeartbeatSecretKey123!
# chmod 600 authkeys
master-host = 192.168.0.60
master-user = repl
master-password = ReplPass123!
master-connect-retry = 10
replicate-do-db = business_db
auto-increment-increment = 2
auto-increment-offset = 1
log-bin = mysql-bin
binlog-do-db = business_db
auto-increment-increment = 2
auto-increment-offset = 2
重啟雙節點 MySQL,驗證 SHOW SLAVE STATUS\G 雙向 Running=Yes。
#!/bin/bash
# /etc/ha.d/resource.d/mysql
# 參數: start | stop | status
MYSQLD="/usr/local/mysql/bin/mysqld_safe"
MYSQLADMIN="/usr/local/mysql/bin/mysqladmin"
DATADIR="/data/mysqldata"
PIDFILE="/usr/local/mysql/data/mysql.pid"
SOCKET="/tmp/mysql.sock"
case $1 in
start)
# 確保共享存儲已掛載
mountpoint -q /data || mount 10.4.66.251:/data /data
# 啟動 MySQL
$MYSQLD --user=mysql --datadir=$DATADIR --pid-file=$PIDFILE --socket=$SOCKET &
# 等待就緒
for i in {1..30}; do
$MYSQLADMIN -S $SOCKET ping && break
sleep 1
done
;;
stop)
$MYSQLADMIN -S $SOCKET shutdown
# 等待進程結束
while kill -0 $(cat $PIDFILE 2>/dev/null) 2>/dev/null; do sleep 1; done
;;
status)
$MYSQLADMIN -S $SOCKET ping >/dev/null 2>&1
;;
esac
chmod +x /etc/ha.d/resource.d/mysql
service heartbeat start (雙節點)ip addr show eth1 確認 VIP 漂移到 Primary。mysql -h 10.4.66.88 -u root -p 連接 VIP 測試。mysqld_exporter + heartbeat_exporter + Grafana 告警。Heartbeat + MySQL + NAS 架構雖屬經典,但單點風險 (NAS)、腦裂風險 (無 STONITH)、版本老舊 (MySQL 5.0/Heartbeat 2.0)在生產環境已難以接受。現代高可用首選:MySQL InnoDB Cluster (MGR) + Router + Orchestrator 或 Galera Cluster + ProxySQL + Keepalived,純資料庫層解決高可用,運維更簡、效能更強、生態更新。