在聊 Keepalived 之前器躏,我們需要先簡單了解一下 VRRP材诽。VRRP(Virtual Router Redundancy Protocol)即虛擬路由冗余協(xié)議梯投,是專門為了解決靜態(tài)路由的高可用而設(shè)計(jì)的陌僵。
簡單說下它的工作原理:虛擬路由器由多個(gè)路由器組成,每個(gè)路由器都有各自的 IP 和共同的 VRID(0-255)伊脓,其中一個(gè) VRRP 路由器通過競選成為 MASTER,就會接管 VIP(虛擬漂移IP)魁衙,對外提供路由服務(wù)报腔,其他成為 BACKUP。MASTER 以 IP 組播形式發(fā)送 VRRP 協(xié)議包剖淀,與 BACKUP 保持心跳連接纯蛾,若 MASTER 不可用,或 BACKUP 接收不到 VRRP 協(xié)議包纵隔,則 BACKUP 通過競選產(chǎn)生新的 MASTER翻诉,并繼續(xù)對外提供路由服務(wù),從而實(shí)現(xiàn)高可用捌刮。
Keepalived 簡介
Keepalived 是一款基于 VRRP 協(xié)議的高可用軟件碰煌,借助它可以讓多臺服務(wù)器能像路由器一樣做 VIP 虛擬地址的冗余轉(zhuǎn)移,從而提升后端服務(wù)器的高可靠性绅作。Keepalived 由一臺主服務(wù)器和多臺備份服務(wù)器組成集群拄查,在主服務(wù)器和備份服務(wù)器上部署相同的服務(wù)配置,并使用一個(gè)虛擬 IP 地址對外提供服務(wù)棚蓄。當(dāng)主服務(wù)器出現(xiàn)故障時(shí)堕扶,虛擬 IP 地址會自動(dòng)漂移到備份服務(wù)器碍脏。
Keepalived+bfd 配置
VRRP v2 之前的版本雖然配置簡單,但只能提供秒級以上的檢測稍算。這在十幾年前是可用的典尾,但已經(jīng)不適合現(xiàn)在的環(huán)境了。幸運(yùn)的是糊探,VRRP v2.0.5 加入了對 BFD 的支持钾埂。
雙向轉(zhuǎn)發(fā)檢測 BFD(Bidirectional Forwarding Detection)用于快速檢測系統(tǒng)之間的通信故障,并在出現(xiàn)故障時(shí)通知上層應(yīng)用科平。
BFD 提供了一個(gè)與介質(zhì)和協(xié)議無關(guān)的快速故障檢測機(jī)制褥紫,它具有以下優(yōu)點(diǎn):
對網(wǎng)絡(luò)設(shè)備間任意類型的雙向轉(zhuǎn)發(fā)路徑提供快速、輕負(fù)荷的故障檢測瞪慧。
用單一的機(jī)制對任何介質(zhì)髓考、任何協(xié)議層進(jìn)行實(shí)時(shí)檢測,并支持不同的檢測時(shí)間與開銷弃酌。
因此 VRRP v2 + BFD 得以實(shí)現(xiàn)毫秒級的檢測氨菇。我們可以選用新版本編譯測試 BFD,示例如下:
yum install -y libnl-devel
./configure --prefix=/opt/keepalived --enable-bfd --with-init=system
! Configuration File for keepalived
global_defs {
process_names keepalived_bfd
bfd_process_name bfdp
router_id LVS_UPYUN
}
bfd_instance bfdp {
neighbor_ip 10.0.2.8 # 對端的服務(wù)器心跳ip
source_ip 10.0.2.4 # 本地的服務(wù)器心跳ip
}
vrrp_instance VI_1 {
...
track_bfd{
bfdp weight 40 # 多跑一個(gè)bfd進(jìn)程來監(jiān)控心跳
}
}
Keepalived+VRRP v3配置
隨著時(shí)間的推移妓湘,Keepalived 也支持了 VRRP v3 的協(xié)議查蓉。相較于之前版本的協(xié)議,VRRP v3 版本有以下改進(jìn):
支持的網(wǎng)絡(luò)類型不同榜贴。VRRP v3 適用于 IPv4 和 IPv6 兩種網(wǎng)絡(luò)豌研,而 VRRP v2 僅適用于 IPv4 網(wǎng)絡(luò)。
認(rèn)證功能不同唬党。VRRP v3 不支持認(rèn)證功能聂沙,而 VRRP v2 支持認(rèn)證功能。VRRP v2 版本保留報(bào)文的認(rèn)證字段初嘹,是為了兼容早期版本及汉,因?yàn)?VRRP 認(rèn)證并不能提高安全性。
發(fā)送通告報(bào)文的時(shí)間間隔的單位不同屯烦。VRRP v2 中缺省單位為 1 秒坷随,VRRP v3 缺省單位為 100 厘秒。
由于 VRRP v3 協(xié)議的改進(jìn)驻龟,其不需要 BFD 也能實(shí)現(xiàn) 30ms 內(nèi)的心跳檢測和故障轉(zhuǎn)移温眉。那實(shí)踐中具體是如何配置的,我們重點(diǎn)來看一下翁狐。
! Configuration File for keepalived
global_defs {
router_id SLB-SAD
script_user root
enable_script_security
# 檢查vrrp報(bào)文中的所有地址比較耗時(shí)类溢。默認(rèn)是跳過檢查
vrrp_skip_check_adv_addr
# 重點(diǎn)是啟用vrrp3
vrrp_version 3
}
vrrp_script chk_upyun {
# 除了心跳檢測外,還可以調(diào)用腳本做業(yè)務(wù)上的健康檢測
script "/etc/keepalived/bin/check_vip.sh"
interval 1 # check every 1 seconds
fall 1 # require 2 failures for failures
rise 1 # require 1 sucesses for ok
# weight 值為負(fù)數(shù)時(shí),當(dāng)腳本檢測失敗時(shí)闯冷,Master節(jié)點(diǎn)的權(quán)值將是“priority“值與“weight”值之差
weight -30
}
vrrp_instance upyun_lb {
strict_mode off
advert_int 0.03
state BACKUP
interface eth3
virtual_router_id 19
priority 100
# 當(dāng)master和backup角色轉(zhuǎn)換時(shí)砂心,觸發(fā)腳本做業(yè)務(wù)上的切換
notify "/etc/keepalived/bin/change_state.sh"
track_script {
chk_upyun
}
virtual_ipaddress {
192.168.147.19 label eth3:9
}
}
# 這一段是可選的,如果和lvs規(guī)則就可以調(diào)用ipvsadm的轉(zhuǎn)發(fā)規(guī)則
include /etc/keepalived/virserver.conf
配置中用到了“check_vip.sh”和“change_state.sh”的兩個(gè)腳本蛇耀,我們也來簡單看下辩诞。
check_vip.sh
上面配置中只是舉例說明,當(dāng) ping 丟包嚴(yán)重超過 80% 時(shí)纺涤,就認(rèn)為要切換主備關(guān)系了译暂。大家也可以根據(jù)具體的業(yè)務(wù)場景做一些邏輯判斷,來實(shí)現(xiàn)主備切換撩炊,以達(dá)到高可用的目的外永。
#!/bin/sh
TMP="/tmp/bad"
GATEWAY=$(ip ro|awk '/default/{print $3}')
LOSS=$(ping -fc10 -s1 $GATEWAY | sed -r -n '/loss/s@.* (.*)%.*@\1@p')
if [ $LOSS -ge 80 ];then
echo "${LOSS}% lost #`date`" >> $TMP
fi
if [ -e $TMP ] ;then
exit 1
fi
change_state.sh
當(dāng)檢測到服務(wù)器的角色轉(zhuǎn)換時(shí),這個(gè)腳本就會調(diào)用釘釘報(bào)警拧咳,并且調(diào)整業(yè)務(wù)上的一些操作伯顶。如 sysctl.conf 配置或者 iptables 上的規(guī)則,甚至可以配合 LVS 做一些負(fù)載均衡的部署呛踊。
#!/bin/bash
HOME="/etc/keepalived/"
LIP=`/sbin/ip addr | awk '/192.168./{gsub("/.*","");if($2!=""){print $2}}'|sort -u|head -n1`
VIP=$(awk '/virtual_ipaddress/{getline; print $1}' $HOME/keepalived.conf)
URL="https://oapi.dingtalk.com/robot/send?access_token=07xxxxxxxxxxxxx"
[ -z $LIP ] && LIP=$VIP
############################################################################
dingding(){
curl $URL --connect-timeout 10 -H 'Content-Type: application/json' \
-d '{"msgtype": "markdown",
"markdown": {
"title": "數(shù)據(jù)中心報(bào)警",
"text": "* 報(bào)警類別: '"$1"'\n* 報(bào)警機(jī)器: '"$2"'\n* 報(bào)警服務(wù): '"$3"'\n* 報(bào)警內(nèi)容: '"$4"'\n* 報(bào)警時(shí)間: '"$(date "+%Y-%m-%d %T")"'\n"
}
}'
}
ENDSTATE=$3
NAME=$2
TYPE=$1
dingding Keepalived $LIP Change_state "$ENDSTATE"
case $ENDSTATE in
"BACKUP") # Perform action for transition to BACKUP state
echo "--- I am $ENDSTATE #`date`" >> /tmp/keepalived.log
sed -r -i '/state/s#MASTER#BACKUP#g' $HOME/keepalived.conf
sysctl -w \
net.ipv4.conf.all.arp_accept=1 \
net.ipv4.conf.all.arp_ignore=0 \
net.ipv4.conf.all.arp_announce=0 \
net.ipv4.ip_nonlocal_bind=1
#$HOME/tunl start
exit 0
;;
"FAULT") # Perform action for transition to FAULT state
exit 0
;;
"MASTER") # Perform action for transition to MASTER state
echo "+++ I am $ENDSTATE #`date`" >> /tmp/keepalived.log
sed -r -i '/state/s#BACKUP#MASTER#g' $HOME/keepalived.conf
sysctl -w \
net.ipv4.conf.all.arp_ignore=1 \
net.ipv4.conf.all.arp_accept=1 \
net.ipv4.conf.all.arp_announce=1 \
net.ipv4.ip_nonlocal_bind=1
iptables -L -vn | grep -iqE "vrrp|112"
[ $? = 0 ] || iptables -I INPUT -p vrrp -j ACCEPT
iptables -L -vn | grep -iq "accept .*$VIP"
[ $? = 0 ] || iptables -I INPUT -d $VIP -j ACCEPT
exit 0
;;
*)
echo "Unknown state ${ENDSTATE} for VRRP ${TYPE} ${NAME}"
exit 1
;;
esac
今天的分享就到這了,大家可以掃描下方二維碼加又小拍好友啦撮,期望與你有更多交流谭网。