Heartbeat+Nginx實現高可用集羣實戰指南 🧩
一、整體思路概覽
通過 Heartbeat 實現虛擬IP(漂移IP)的接管,通過 Nginx 提供Web服務,當主節點故障時,VIP 自動切換到備用節點,業務幾乎無感知中斷。核心關鍵點有三個:
- 一組真實服務器(如
node1、node2) - 一個可漂移的 VIP(虛擬IP)
- 利用 Heartbeat 監控 + 接管 VIP + 啓停 Nginx
只要記住一句話:<font color="red">VIP 在哪台機器,Nginx 就在哪台機器對外提供服務</font> ✅
二、基礎環境規劃(示例)
- 主節點:
node1,IP:192.168.1.10 - 備節點:
node2,IP:192.168.1.11 - 漂移IP(VIP):
192.168.1.100 - 操作系統:同一發行版 Linux(如 CentOS / Rocky / Debian 等)
- 兩台機器時間、主機名、網絡配置保持一致、互通 🔄
三、安裝 Nginx
1. 安裝命令示例
# 以基於 RHEL 的系統為例(node1、node2 都執行)
yum install -y nginx
systemctl enable nginx
解釋:
yum install -y nginx:使用系統包管理工具安裝 Nginx,-y表示自動確認。systemctl enable nginx:設置 Nginx 開機自啓,保證機器重啓後服務自動拉起。
四、安裝 Heartbeat
1. 安裝 Heartbeat
# node1、node2 都執行
yum install -y heartbeat
systemctl enable heartbeat
解釋:
yum install -y heartbeat:安裝 Heartbeat 高可用組件,用於節點間心跳檢測與資源接管。systemctl enable heartbeat:設置開機自動啓動 Heartbeat,避免重啓後集羣失效。
不同發行版命令略有差異,用法類似,可用對應的包管理器(如 apt)進行安裝。
五、關鍵配置文件説明(Heartbeat 經典配置)
Heartbeat 經典版本主要關注三個文件(路徑示例 /etc/ha.d/):
- <font color="red">ha.cf</font>:定義心跳通信方式、日誌級別等
- <font color="red">authkeys</font>:認證配置,防止非法節點加入
- <font color="red">haresources</font>:資源接管配置(VIP、Nginx 等)
1. ha.cf 示例(兩節點都配置)
# /etc/ha.d/ha.cf
logfacility local0
keepalive 2
deadtime 10
warntime 5
initdead 20
bcast eth0
node node1
node node2
解釋:
logfacility local0:將 Heartbeat 日誌寫入指定日誌設施,便於排查問題。keepalive 2:每 2秒 發送一次心跳包。deadtime 10:10秒內收不到心跳就認為對方宕機,開始接管資源。warntime 5:5秒未收到心跳時記錄告警,但尚不接管。initdead 20:集羣啓動時等待對方上線的最長時間。bcast eth0:使用eth0網卡廣播方式發送心跳(生產可用ucast或專用心跳網絡)。node node1 / node2:顯式聲明集羣中的合法節點名稱,與系統hostname一致。
2. authkeys 示例(兩節點相同)
# /etc/ha.d/authkeys
auth 1
1 sha1 心跳共享密鑰
解釋:
auth 1:指定使用編號為 1 的認證配置。1 sha1:表示使用 SHA1 算法進行消息認證。心跳共享密鑰:兩台機器必須完全一致的密鑰字符串(建議設置為複雜隨機串)。- 最後需設置權限:
chmod 600 /etc/ha.d/authkeys
解釋:
chmod 600:限制只有文件所有者可讀寫,避免密鑰泄露,保證安全性。
3. haresources 示例(只需寫在主節點配置,通常兩邊保持一致便於管理)
# /etc/ha.d/haresources
node1 192.168.1.100 nginx
解釋:
node1:默認主節點,正常情況下 VIP 和 Nginx 都在這台機器。192.168.1.100:要漂移的虛擬IP地址。nginx:作為 Heartbeat 管理的服務資源,會自動執行service nginx start/stop。
邏輯含義:
- 當
node1正常時:VIP 綁定在node1,並啓動 Nginx。 - 當
node1故障或心跳中斷:Heartbeat 判定其失效,將 VIP 和 Nginx 切換到node2。 - 當
node1恢復:根據策略可能自動接回資源(或保持在node2,視版本與配置而定)。
六、啓動與驗證 🔍
1. 在兩台節點上啓動 Heartbeat
# node1、node2 都執行
systemctl start heartbeat
解釋:
systemctl start heartbeat:啓動 Heartbeat 守護進程,建立心跳通信和資源管理。- 啓動順序通常:先備節點,後主節點,避免資源在啓動時來回漂移。
2. 查看 VIP 歸屬
在任意一台機器執行:
ip addr | grep 192.168.1.100
解釋:
ip addr:查看當前主機所有網絡地址。grep 192.168.1.100:過濾出虛擬IP是否存在,判斷 VIP 當前在哪個節點上。- 若在
node1上看到該 IP,説明當前由主節點提供服務。
3. 訪問驗證
在瀏覽器或命令行訪問:
curl http://192.168.1.100
解釋:
curl用於通過 HTTP 請求測試訪問是否正常。- 若返回 Nginx 默認頁面內容,説明 VIP + Nginx 服務鏈路正常。
七、故障切換測試 ✅
- 在當前持有 VIP 的機器上停止 Heartbeat:
systemctl stop heartbeat
解釋:
- 主動停止 Heartbeat,模擬節點故障或集羣服務異常。
- 被動情況下也可能因為系統宕機、網絡中斷等觸發。
- 再次查看 VIP 所在節點:
ip addr | grep 192.168.1.100
- 若 VIP 出現在另一台機器上,説明 <font color="red">故障切換成功</font>。
- 再次使用
curl或瀏覽器訪問 VIP,驗證頁面是否仍能正常打開。
八、實踐中的注意事項 ⚠️
- <font color="red">保證時間同步</font>:建議配置 NTP,避免時間差影響日誌分析與超時判斷。
- <font color="red">心跳網絡可靠</font>:生產環境建議單獨心跳網卡或多路心跳,減少誤判。
- <font color="red">數據目錄一致</font>:Nginx 讀取的頁面文件應放在共享存儲或通過同步工具保持一致。
- 考慮採用更完善的資源管理框架(如 Pacemaker + Corosync)進行復雜業務的高可用設計,但 Heartbeat+Nginx 簡單直接,適合入門與中小場景。
通過以上步驟,就可以搭建一個 Heartbeat+Nginx 高可用集羣:
當一台服務器宕機時,另一台自動接管虛擬IP和 Nginx 服務,實現業務連續性 ✨
如果需要繼續擴展到多節點、加上後端應用或數據庫,再在此基礎上逐步演進即可。