keepalived?nopreempt的應(yīng)用場景及說明
背景
keepalived 高可用模式下 “nopreempt(非搶占模式)” 的應(yīng)用場景。
配置
環(huán)境
主節(jié)點(diǎn):
- VIP:192.168.11.235
- 主節(jié)點(diǎn)IP:192.168.11.201
- 主節(jié)點(diǎn)心跳IP:172.16.11.11
備節(jié)點(diǎn):
- 備節(jié)點(diǎn)IP:192.168.11.202
- 備節(jié)點(diǎn)心跳IP:172.16.11.12
配置
主節(jié)點(diǎn):
! Configuration File for keepalived
global_defs {
router_id arsen-master # 主備須唯一
}
vrrp_script chk_net {
script "/data/keepalived/check/chk_net.sh"
interval 15
# weight 15 # 權(quán)重是否需要配置請看“實(shí)測”部分看你是屬于哪種場景
fall 2
rise 2
}
vrrp_script chk_acgw {
script "/data/keepalived/check/chk_nginx.sh"
interval 15
# weight 15 # 權(quán)重是否需要配置請看“實(shí)測”部分看你是屬于哪種場景
fall 2
rise 2
}
vrrp_instance VI_1 { # vrrp實(shí)例名稱,可自定義
state BACKUP # 狀態(tài)(非搶占模式下主備保持一致,均為BACKUP)
interface enp125s0f2 # 心跳網(wǎng)卡,VRRP探測網(wǎng)卡
virtual_router_id 91 # 虛擬路由,主備保持一致
priority 50 # 節(jié)點(diǎn)權(quán)重
advert_int 1 # VRRP報文探測間隔(1秒)
nopreempt # 配置非搶占
unicast_src_ip 172.16.11.11 # 當(dāng)前節(jié)點(diǎn)心跳IP(即心跳網(wǎng)卡enp125s0f2的IP)
unicast_peer {
172.16.11.12 # 對端節(jié)點(diǎn)心跳IP
}
authentication { # VRRP報文認(rèn)證
auth_type PASS # 認(rèn)證類型:密碼認(rèn)證
auth_pass HelloArsen # 認(rèn)證密碼:HelloArsen
}
virtual_ipaddress { # 虛擬IP綁定
192.168.11.235/24 dev enp125s0f0 # 指定VIP及綁定的物理網(wǎng)卡
}
track_script { # 腳本檢測(用于觸發(fā)故障轉(zhuǎn)移)
chk_net # 網(wǎng)絡(luò)連通性檢測腳本
chk_nginx # nginx服務(wù)健康狀態(tài)檢測腳本
}
notify /data/keepalived/notify/notify.sh # 看 notify 應(yīng)用部分
}
備節(jié)點(diǎn):
! Configuration File for keepalived
global_defs {
router_id arsen-slave # 主備須唯一
}
vrrp_script chk_net {
script "/data/keepalived/check/chk_net.sh"
interval 15
# weight 15 # 權(quán)重是否需要配置請看“實(shí)測”部分看你是屬于哪種場景
fall 2
rise 2
}
vrrp_script chk_acgw {
script "/data/keepalived/check/chk_nginx.sh"
interval 15
# weight 15 # 權(quán)重是否需要配置請看“實(shí)測”部分看你是屬于哪種場景
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP # 狀態(tài)(非搶占模式下主備保持一致,均為BACKUP)
interface enp125s0f2 # 心跳網(wǎng)卡,VRRP探測網(wǎng)卡
virtual_router_id 91 # 虛擬路由,主備保持一致
priority 50 # 節(jié)點(diǎn)權(quán)重
advert_int 1 # VRRP報文探測間隔(1秒)
nopreempt # 配置非搶占
unicast_src_ip 172.16.11.12 # 當(dāng)前節(jié)點(diǎn)心跳IP(即心跳網(wǎng)卡enp125s0f2的IP)
unicast_peer {
172.16.11.11 # 對端節(jié)點(diǎn)心跳IP
}
authentication { # VRRP報文認(rèn)證
auth_type PASS # 認(rèn)證類型:密碼認(rèn)證
auth_pass HelloArsen # 認(rèn)證密碼:HelloArsen
}
virtual_ipaddress { # 虛擬IP綁定
192.168.11.235/24 dev enp125s0f0 # 指定VIP及綁定的物理網(wǎng)卡
}
track_script { # 腳本檢測(用于觸發(fā)故障轉(zhuǎn)移)
chk_net # 網(wǎng)絡(luò)連通性檢測腳本
chk_nginx # nginx服務(wù)健康狀態(tài)檢測腳本
}
notify /data/keepalived/notify/notify.sh # 看 notify 應(yīng)用部分
}
實(shí)測
場景1
主備都設(shè)置 nopreempt,state 主為 MASTER 備為 BACKUP,且啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場景下,即便是主的權(quán)重小于備的權(quán)重也是無法進(jìn)行 VIP 故障轉(zhuǎn)移,因?yàn)榇藭r nopreempt 和權(quán)重產(chǎn)生了沖突。
場景2
主備都設(shè)置 nopreempt,state 主為 MASTER 備為 BACKUP,且沒啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場景下,會進(jìn)行 VIP 故障轉(zhuǎn)移,與權(quán)重?zé)o關(guān),主中 track_script 的服務(wù)恢復(fù)后(注意是監(jiān)測的所有服務(wù)都恢復(fù))VIP 自動轉(zhuǎn)移回來。
場景3
主備都設(shè)置 nopreempt,state 主備均為 BACKUP,且啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場景下,即便是主的權(quán)重小于備的權(quán)重也是無法進(jìn)行 VIP 故障轉(zhuǎn)移,因?yàn)榇藭r nopreempt 和權(quán)重產(chǎn)生了沖突。
場景4
主備都設(shè)置 nopreempt,state 主備均為 BACKUP,且沒啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場景下,會進(jìn)行 VIP 故障轉(zhuǎn)移,與權(quán)重?zé)o關(guān),主中 track_script 的服務(wù)恢復(fù)后(注意是監(jiān)測的所有服務(wù)都恢復(fù)),VIP 不會自動轉(zhuǎn)移回來,只有備中的服務(wù)異常后VIP才會自動轉(zhuǎn)移回來。但是要注意,比如主的 nginx 異常,備的 nginx 正常,VIP 會漂移至備,如果過段時間備的 nginx 異常,而主的 nginx 仍然沒有恢復(fù)正常,則主備都無法持有 VIP,整個業(yè)務(wù)將異常。
場景5
主備都沒設(shè)置 nopreempt,state 主為 MASTER 備為 BACKUP,且啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場景下,會根據(jù)權(quán)重進(jìn)行 VIP 故障轉(zhuǎn)移,主中 track_script 的服務(wù)恢復(fù)后且權(quán)重高于備,則 VIP 自動轉(zhuǎn)移回來。
場景6
主備都沒設(shè)置 nopreempt,state 主為 MASTER 備為 BACKUP,且沒啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場景下,會進(jìn)行 VIP 故障轉(zhuǎn)移,與權(quán)重?zé)o關(guān),主中 track_script 的服務(wù)恢復(fù)后(注意是監(jiān)測的所有服務(wù)都恢復(fù))VIP自動轉(zhuǎn)移回來。
notify 應(yīng)用
notify 有什么用?notify 會根據(jù) keepalived 的狀態(tài)變化去執(zhí)行相關(guān)動作(如執(zhí)行某個腳本),notify 共有三種狀態(tài),分別為 MASTER、BACKUP、FAULT,除了案例中配置的 notify_master 外,還有如下幾項(xiàng)配置。
notify_master
notify_master /data/keepalived/notify/notify_master.sh
觸發(fā)時機(jī):當(dāng)節(jié)點(diǎn)轉(zhuǎn)換到 MASTER 狀態(tài)時
典型用途:
- 重啟服務(wù)(如 Nginx、Java)
- 節(jié)點(diǎn)狀態(tài)切換通知
notify_backup
notify_backup /data/keepalived/notify/notify_master.sh
觸發(fā)時機(jī):當(dāng)節(jié)點(diǎn)轉(zhuǎn)換到 BACKUP 狀態(tài)時
典型用途:
- 節(jié)點(diǎn)狀態(tài)切換通知
notify_fault
/data/keepalived/notify/notify_fault.sh
觸發(fā)時機(jī):當(dāng)節(jié)點(diǎn)轉(zhuǎn)換到 FAULT 狀態(tài)時(即檢測到故障)
典型用途:
- 發(fā)送故障告警
- 執(zhí)行緊急恢復(fù)操作
notify_stop
notify_stop /data/keepalived/notify/notify_stop.sh
觸發(fā)時機(jī):當(dāng) Keepalived進(jìn)程停止時(如服務(wù)關(guān)閉、重啟)
典型用途:
- 停止相關(guān)服務(wù)
- 發(fā)送維護(hù)通知
notify
notify_stop /data/keepalived/notify/notify.sh
觸發(fā)時機(jī):任何狀態(tài)變化時都會調(diào)用
參數(shù)傳遞:
典型用途:
- 腳本會收到狀態(tài)參數(shù):
$1 = "MASTER"|"BACKUP"|"FAULT" - VRRP 實(shí)例名稱:$2
- 狀態(tài)名稱:$3
- 統(tǒng)一的日志記錄
- 通用處理邏輯(如下案例)
實(shí)際上,我們只需配置 notify 即可,然后在腳本中捕獲 keepalived 實(shí)例狀態(tài)后執(zhí)行對應(yīng)的邏輯即可,如:
#!/bin/bash
TYPE=$1
NAME=$2
STATE=$3
case $STATE in
"MASTER")
# 成為 Master 時的操作
echo "$(date): $NAME 切換為 MASTER 狀態(tài)" >> /var/log/keepalived-notify.log
echo "$(date): $NAME 開始重啟 nginx 服務(wù)..." >> /var/log/keepalived-notify.log
systemctl restart nginx
;;
"BACKUP")
# 成為 Backup 時的操作
echo "$(date): $NAME 切換為 BACKUP 狀態(tài)" >> /var/log/keepalived-notify.log
;;
"FAULT")
# 故障時的操作
echo "$(date): $NAME 切換為 FAULT 狀態(tài)" >> /var/log/keepalived-notify.log
# 發(fā)送告警郵件或通知
;;
"STOP")
# Keepalived 停止時的操作
echo "$(date): $NAME Keepalived 服務(wù)停止" >> /var/log/keepalived-notify.log
;;
esac
exit 0
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
2022最新青龍面板對接機(jī)器人的詳細(xì)過程(傻妞對接onebot(oicq)協(xié)議實(shí)現(xiàn)機(jī)器人功能)
這篇文章主要介紹了2022最新青龍面板對接機(jī)器人的詳細(xì)過程(傻妞對接onebot(oicq)協(xié)議實(shí)現(xiàn)機(jī)器人功能),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
k8s中如何實(shí)現(xiàn)pod自動擴(kuò)縮容詳解
在實(shí)際生產(chǎn)系統(tǒng)中,經(jīng)常會遇到某個服務(wù)需要擴(kuò)容的場景,可能會遇到由于資源緊張或者工作負(fù)載降低而需要減少服務(wù)實(shí)例數(shù)量的場景,下面這篇文章主要給大家介紹了關(guān)于k8s中如何實(shí)現(xiàn)pod自動擴(kuò)縮容的相關(guān)資料,需要的朋友可以參考下2022-08-08
kubernetes調(diào)度之NodeSelector使用解讀
本文介紹Kubernetes中兩種簡單調(diào)度策略:NodeName通過指定節(jié)點(diǎn)名稱強(qiáng)制調(diào)度,跳過調(diào)度器;NodeSelector基于節(jié)點(diǎn)標(biāo)簽匹配,需為節(jié)點(diǎn)打標(biāo)簽并在Pod定義中配置,兩者均為強(qiáng)制約束機(jī)制2025-08-08

