又拍云之 Keepalived 高可用部署

在聊 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

今天的分享就到這了,大家可以掃描下方二維碼加又小拍好友啦撮,期望與你有更多交流谭网。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赃春,隨后出現(xiàn)的幾起案子愉择,更是在濱河造成了極大的恐慌,老刑警劉巖织中,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锥涕,死亡現(xiàn)場離奇詭異,居然都是意外死亡狭吼,警方通過查閱死者的電腦和手機(jī)层坠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刁笙,“玉大人破花,你說我怎么就攤上這事∑N” “怎么了座每?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摘悴。 經(jīng)常有香客問我峭梳,道長,這世上最難降的妖魔是什么蹂喻? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任葱椭,我火速辦了婚禮捂寿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挫以。我一直安慰自己者蠕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布掐松。 她就那樣靜靜地躺著踱侣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪大磺。 梳的紋絲不亂的頭發(fā)上抡句,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音杠愧,去河邊找鬼待榔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛流济,可吹牛的內(nèi)容都是我干的锐锣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼绳瘟,長吁一口氣:“原來是場噩夢啊……” “哼雕憔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糖声,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤斤彼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蘸泻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琉苇,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年悦施,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了并扇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抡诞,死狀恐怖拜马,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沐绒,我是刑警寧澤俩莽,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站乔遮,受9級特大地震影響扮超,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一出刷、第九天 我趴在偏房一處隱蔽的房頂上張望璧疗。 院中可真熱鬧艺晴,春花似錦屎暇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽却音。三九已至,卻和暖如春矢炼,著一層夾襖步出監(jiān)牢的瞬間系瓢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工句灌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夷陋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓胰锌,卻偏偏與公主長得像骗绕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子资昧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容