keepalived?nopreempt的應(yīng)用場(chǎng)景及說(shuō)明
背景
keepalived 高可用模式下 “nopreempt(非搶占模式)” 的應(yīng)用場(chǎ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)重是否需要配置請(qǐng)看“實(shí)測(cè)”部分看你是屬于哪種場(chǎng)景
fall 2
rise 2
}
vrrp_script chk_acgw {
script "/data/keepalived/check/chk_nginx.sh"
interval 15
# weight 15 # 權(quán)重是否需要配置請(qǐng)看“實(shí)測(cè)”部分看你是屬于哪種場(chǎng)景
fall 2
rise 2
}
vrrp_instance VI_1 { # vrrp實(shí)例名稱(chēng),可自定義
state BACKUP # 狀態(tài)(非搶占模式下主備保持一致,均為BACKUP)
interface enp125s0f2 # 心跳網(wǎng)卡,VRRP探測(cè)網(wǎng)卡
virtual_router_id 91 # 虛擬路由,主備保持一致
priority 50 # 節(jié)點(diǎn)權(quán)重
advert_int 1 # VRRP報(bào)文探測(cè)間隔(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 # 對(duì)端節(jié)點(diǎn)心跳IP
}
authentication { # VRRP報(bào)文認(rèn)證
auth_type PASS # 認(rèn)證類(lèi)型:密碼認(rèn)證
auth_pass HelloArsen # 認(rèn)證密碼:HelloArsen
}
virtual_ipaddress { # 虛擬IP綁定
192.168.11.235/24 dev enp125s0f0 # 指定VIP及綁定的物理網(wǎng)卡
}
track_script { # 腳本檢測(cè)(用于觸發(fā)故障轉(zhuǎn)移)
chk_net # 網(wǎng)絡(luò)連通性檢測(cè)腳本
chk_nginx # nginx服務(wù)健康狀態(tài)檢測(cè)腳本
}
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)重是否需要配置請(qǐng)看“實(shí)測(cè)”部分看你是屬于哪種場(chǎng)景
fall 2
rise 2
}
vrrp_script chk_acgw {
script "/data/keepalived/check/chk_nginx.sh"
interval 15
# weight 15 # 權(quán)重是否需要配置請(qǐng)看“實(shí)測(cè)”部分看你是屬于哪種場(chǎng)景
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP # 狀態(tài)(非搶占模式下主備保持一致,均為BACKUP)
interface enp125s0f2 # 心跳網(wǎng)卡,VRRP探測(cè)網(wǎng)卡
virtual_router_id 91 # 虛擬路由,主備保持一致
priority 50 # 節(jié)點(diǎn)權(quán)重
advert_int 1 # VRRP報(bào)文探測(cè)間隔(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 # 對(duì)端節(jié)點(diǎn)心跳IP
}
authentication { # VRRP報(bào)文認(rèn)證
auth_type PASS # 認(rèn)證類(lèi)型:密碼認(rèn)證
auth_pass HelloArsen # 認(rèn)證密碼:HelloArsen
}
virtual_ipaddress { # 虛擬IP綁定
192.168.11.235/24 dev enp125s0f0 # 指定VIP及綁定的物理網(wǎng)卡
}
track_script { # 腳本檢測(cè)(用于觸發(fā)故障轉(zhuǎn)移)
chk_net # 網(wǎng)絡(luò)連通性檢測(cè)腳本
chk_nginx # nginx服務(wù)健康狀態(tài)檢測(cè)腳本
}
notify /data/keepalived/notify/notify.sh # 看 notify 應(yīng)用部分
}
實(shí)測(cè)
場(chǎng)景1
主備都設(shè)置 nopreempt,state 主為 MASTER 備為 BACKUP,且啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場(chǎng)景下,即便是主的權(quán)重小于備的權(quán)重也是無(wú)法進(jìn)行 VIP 故障轉(zhuǎn)移,因?yàn)榇藭r(shí) nopreempt 和權(quán)重產(chǎn)生了沖突。
場(chǎng)景2
主備都設(shè)置 nopreempt,state 主為 MASTER 備為 BACKUP,且沒(méi)啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場(chǎng)景下,會(huì)進(jìn)行 VIP 故障轉(zhuǎn)移,與權(quán)重?zé)o關(guān),主中 track_script 的服務(wù)恢復(fù)后(注意是監(jiān)測(cè)的所有服務(wù)都恢復(fù))VIP 自動(dòng)轉(zhuǎn)移回來(lái)。
場(chǎng)景3
主備都設(shè)置 nopreempt,state 主備均為 BACKUP,且啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場(chǎng)景下,即便是主的權(quán)重小于備的權(quán)重也是無(wú)法進(jìn)行 VIP 故障轉(zhuǎn)移,因?yàn)榇藭r(shí) nopreempt 和權(quán)重產(chǎn)生了沖突。
場(chǎng)景4
主備都設(shè)置 nopreempt,state 主備均為 BACKUP,且沒(méi)啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場(chǎng)景下,會(huì)進(jìn)行 VIP 故障轉(zhuǎn)移,與權(quán)重?zé)o關(guān),主中 track_script 的服務(wù)恢復(fù)后(注意是監(jiān)測(cè)的所有服務(wù)都恢復(fù)),VIP 不會(huì)自動(dòng)轉(zhuǎn)移回來(lái),只有備中的服務(wù)異常后VIP才會(huì)自動(dòng)轉(zhuǎn)移回來(lái)。但是要注意,比如主的 nginx 異常,備的 nginx 正常,VIP 會(huì)漂移至備,如果過(guò)段時(shí)間備的 nginx 異常,而主的 nginx 仍然沒(méi)有恢復(fù)正常,則主備都無(wú)法持有 VIP,整個(gè)業(yè)務(wù)將異常。
場(chǎng)景5
主備都沒(méi)設(shè)置 nopreempt,state 主為 MASTER 備為 BACKUP,且啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場(chǎng)景下,會(huì)根據(jù)權(quán)重進(jìn)行 VIP 故障轉(zhuǎn)移,主中 track_script 的服務(wù)恢復(fù)后且權(quán)重高于備,則 VIP 自動(dòng)轉(zhuǎn)移回來(lái)。
場(chǎng)景6
主備都沒(méi)設(shè)置 nopreempt,state 主為 MASTER 備為 BACKUP,且沒(méi)啟用 track_script 權(quán)重(正/負(fù)權(quán)重)。
這種場(chǎng)景下,會(huì)進(jìn)行 VIP 故障轉(zhuǎn)移,與權(quán)重?zé)o關(guān),主中 track_script 的服務(wù)恢復(fù)后(注意是監(jiān)測(cè)的所有服務(wù)都恢復(fù))VIP自動(dòng)轉(zhuǎn)移回來(lái)。
notify 應(yīng)用
notify 有什么用?notify 會(huì)根據(jù) keepalived 的狀態(tài)變化去執(zhí)行相關(guān)動(dòng)作(如執(zhí)行某個(gè)腳本),notify 共有三種狀態(tài),分別為 MASTER、BACKUP、FAULT,除了案例中配置的 notify_master 外,還有如下幾項(xiàng)配置。
notify_master
notify_master /data/keepalived/notify/notify_master.sh
觸發(fā)時(shí)機(jī):當(dāng)節(jié)點(diǎn)轉(zhuǎn)換到 MASTER 狀態(tài)時(shí)
典型用途:
- 重啟服務(wù)(如 Nginx、Java)
- 節(jié)點(diǎn)狀態(tài)切換通知
notify_backup
notify_backup /data/keepalived/notify/notify_master.sh
觸發(fā)時(shí)機(jī):當(dāng)節(jié)點(diǎn)轉(zhuǎn)換到 BACKUP 狀態(tài)時(shí)
典型用途:
- 節(jié)點(diǎn)狀態(tài)切換通知
notify_fault
/data/keepalived/notify/notify_fault.sh
觸發(fā)時(shí)機(jī):當(dāng)節(jié)點(diǎn)轉(zhuǎn)換到 FAULT 狀態(tài)時(shí)(即檢測(cè)到故障)
典型用途:
- 發(fā)送故障告警
- 執(zhí)行緊急恢復(fù)操作
notify_stop
notify_stop /data/keepalived/notify/notify_stop.sh
觸發(fā)時(shí)機(jī):當(dāng) Keepalived進(jìn)程停止時(shí)(如服務(wù)關(guān)閉、重啟)
典型用途:
- 停止相關(guān)服務(wù)
- 發(fā)送維護(hù)通知
notify
notify_stop /data/keepalived/notify/notify.sh
觸發(fā)時(shí)機(jī):任何狀態(tài)變化時(shí)都會(huì)調(diào)用
參數(shù)傳遞:
典型用途:
- 腳本會(huì)收到狀態(tài)參數(shù):
$1 = "MASTER"|"BACKUP"|"FAULT" - VRRP 實(shí)例名稱(chēng):$2
- 狀態(tài)名稱(chēng):$3
- 統(tǒng)一的日志記錄
- 通用處理邏輯(如下案例)
實(shí)際上,我們只需配置 notify 即可,然后在腳本中捕獲 keepalived 實(shí)例狀態(tài)后執(zhí)行對(duì)應(yīng)的邏輯即可,如:
#!/bin/bash
TYPE=$1
NAME=$2
STATE=$3
case $STATE in
"MASTER")
# 成為 Master 時(shí)的操作
echo "$(date): $NAME 切換為 MASTER 狀態(tài)" >> /var/log/keepalived-notify.log
echo "$(date): $NAME 開(kāi)始重啟 nginx 服務(wù)..." >> /var/log/keepalived-notify.log
systemctl restart nginx
;;
"BACKUP")
# 成為 Backup 時(shí)的操作
echo "$(date): $NAME 切換為 BACKUP 狀態(tài)" >> /var/log/keepalived-notify.log
;;
"FAULT")
# 故障時(shí)的操作
echo "$(date): $NAME 切換為 FAULT 狀態(tài)" >> /var/log/keepalived-notify.log
# 發(fā)送告警郵件或通知
;;
"STOP")
# Keepalived 停止時(shí)的操作
echo "$(date): $NAME Keepalived 服務(wù)停止" >> /var/log/keepalived-notify.log
;;
esac
exit 0
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
教你在k8s上部署HADOOP-3.2.2(HDFS)的方法
這篇文章主要介紹了k8s-部署HADOOP-3.2.2(HDFS)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
Kubernetes中crictl的詳細(xì)用法教程與應(yīng)用實(shí)戰(zhàn)記錄
crictl作為Kubernetes的容器運(yùn)行時(shí)接口(CRI)的命令行工具,為Kubernetes的調(diào)試和管理提供了強(qiáng)大的支持,通過(guò)本文的詳細(xì)介紹,你應(yīng)該已經(jīng)掌握了crictl的基本安裝、配置、常用命令以及高級(jí)用法,需要的朋友可以參考下2024-07-07
Kubernetes(k8s?1.23))安裝與卸載詳細(xì)教程
這篇文章主要介紹了Kubernetes(k8s?1.23))安裝與卸載,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
解決k8s namespace 一直處于 Terminating 狀態(tài)的問(wèn)題
這篇文章主要介紹了k8s namespace 一直處于 Terminating 狀態(tài)的解決方法,以下的 tool 為 Terminating 狀態(tài)的 namespace,下面相關(guān)的一些操作記得將 tool 修改成自己的 namespace 名稱(chēng),需要的朋友可以參考下2022-10-10
再分享6個(gè)可無(wú)限激活阿里云盤(pán)邀請(qǐng)碼,不信你不能激活阿里云盤(pán)
這篇文章主要分享6個(gè)可無(wú)限激活的阿里云盤(pán)邀請(qǐng)碼,不信你不能激活阿里云盤(pán),需要的朋友可以參考下2020-11-11
k8s容器狀態(tài)Terminating無(wú)法刪除的問(wèn)題及解決
這篇文章主要介紹了k8s容器狀態(tài)Terminating無(wú)法刪除的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
Kubernetes中創(chuàng)建命名空間實(shí)現(xiàn)方法
這篇文章主要為大家介紹了Kubernetes中創(chuàng)建命名空間實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

