Nginx Keepalived (HA) 設定
Contents
本篇筆記參考:
- NGINX Document-High Availability Support Based on keepalived
- [sysctl]CentLinux-keepalived: Configure Floating IP in CentOS 7 Servers
- nixCraft-Verify: Keepalived IP Failover Working Or Not With tcpdump Command
- man keepalived.conf
Keepalived 是一套由 C 語言撰寫的路由軟體 (Routing software),主要目的是提供 Linux 設施簡單的高可用 (High-Availability) 以及平衡負載 (Loadbalancing) 方案。
HA 的部分使用 VRRP (Virtual Router Redundancy Protocol) 協議進行偵測/票選 (election) 由哪台 Linux 設施成為 Master/Primary node (主節點)
LB (平衡負載) 的部分是基於 Linux 核心模組 Linux Virtual Server (IPVS) 提供 Layer 4 Load Balance 解決辦法
不過本篇筆記只會使用到 keepalived 高可用的部分,負載平衡會交由 Nginx 負責
2022.12.26 整理更新:
關於 L4, L7 load blancer 差異可以參考 eBPF 相關文章:
- 初探 Linux Kernel 中的 BPF 與 XDP 技術:以 Tiny Load Balancer 為例
- Linux 網路系統概觀
- 你知道 Linux 如何處理網路封包嗎? - 以 socket programming 為例
安裝 keepalived 與 Nginx
|
|
Nginx 網頁特徵化
此次實驗總共有兩台 VM 分別是:
- Eric_Keepalived_1 192.168.207.111
- Eric_Keepalived_2 192.168.207.112
- Eric_Keepalived_VIP 192.168.207.120
特徵化主要目的是要辨識連到哪台 nginx server。預設情況下 nginx 網頁根目錄放在 /usr/share/nginx/html
下面
|
|
sysctl 設定
這個設定允許 Linux 綁定本機不存在的 IP
|
|
keepalived.conf
先行備份原本的設定檔
|
|
Primary Node keepalived.conf
|
|
Secondary/BACKUP Node
|
|
vrrp_script <SCRIPT_NAME>
定義要被 vrrp_instance
執行的腳本內容,通常是檢測服務健康 (service health)。
script
後面可以直接接 <STRING>
或者 <QUOTED-STRING>
,都用來表示腳本路徑 (path of script to execute)
以上面的範例就是去執行 /usr/sbin/pidof nginx
。當 nginx
執行中的話 pidof
會 echo 出所有 pid (process id) 並且回傳值為 0
確認命令執行是否有錯誤都可以用回傳值判斷。當命令成功執行 return code=0
,若失敗則為其它值
|
|
interval
定義幾秒執行腳本一次,預設是一秒鐘 (default: 1 second)
weight
定義腳本權重。範圍從 -253 ~ 253
當 weight 為 “正” 數:
(1) return code=0
,則增加 instance 當中的優先權 (priority)。 priority = priority + weight
(2) return code !=0
,則 優先權 (priority) 保持不變
當 weight 為 “負” 數:
(1) return code=0
,則優先權 (priority) 保持不變
(2) ``return code !=0`,則 減少 instance 當中的優先權 (priority)。 priority = priority + weight (註: weight 為負數)
另外還有其它比較常用的參數:
rise <INTEGER>
腳本回傳 成功 (return code=0) 達到 <INTEGER>
次才將狀態轉成 OK。(required number of successes for OK transition)
fall <INTEGER>
腳本回傳 失敗 (return code!=0) 達到 <INTEGER>
次才將狀態轉成 KO。(required number of successes for KO transition)
user
以哪個使用者/群組 執行該腳本。其中群組為非必要選項 (user USERNAME [GROUPNAME])
timeout <INTEGER>
設定腳本執行 <INTEGER>
秒後沒有結束,直接判定失敗。
init_fail
預設腳本是失敗狀態。
好像把所有參數說完了 XD
vrrp_instance
state
可以是 MASTER
or BACKUP
。也可以選擇不設定,因為當其他候選人 (在同個廣播域、設定相同 virtual_router_id
) 上線後,就會舉辦選舉優先權最高者勝出成為 Master 拿到 VIP 使用權
interface
設定已取得內部 IP 的網卡,也是 VIP 綁定的目標網卡 (除非有另外設定)。
這張網卡同時也是 vrrp 綁定的對象。如果省略此設定,所有的 VIPs 與 eVIPs 就必須被指派使用哪張網卡。
virtual_router_id
同一個廣播域中用來辨識 (封包 vrid)。同一個 HA Cluster 內設定的值必須相同,設定的範圍從 1~255
priority
優先權。
advert_int
VRRP 廣播間隔,單位是秒
authentication (區塊)
auth_pass 使用密碼驗證 vrrp 封包真偽,keepalive 取前八位字元使用。
感覺沒什麼路用… 因為如果 auth_type PASS
的情況下,密碼是明文…
Louwrentius-Configuring, Attacking and Securing VRRP on Linux
track_script (區塊)
SCRIPT_NAME 後面一樣可以設定權重 -253~253。預設值是 0
virtual_ipaddress (區塊)
設定 VIP 為何。
nopreempt
當 Master Node 恢復後不接受剝奪 VIP 使用權。若要使用 state 必須設定成 MASTER
其他參數:
track_interface (區塊)
可以對每個 interface 設定不同權重。當偵測到 interface down 就會由其他 interface 接手。
version <2 or 3>
使用的 VRRP 版本,預設值 ver.2。 IPv6 必定使用 ver.3
觀察 VRRP 封包 (可看優先權)
RFC 3768 - Virtual Router Redundancy Protocol (VRRP)
nixCraft-Verify: Keepalived IP Failover Working Or Not With tcpdump Command
VRRP 預設使用 224.0.0.18
做為群播地址。透過 tcpdump
可以觀察
|
|
Author
LastMod 2022-12-26 (392789a)