keepalived原理和實踐

1 前言
VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議,最新協議在RFC3768中定義,原來的定義RFC2338被廢除,新協議相對還簡化了一些功能。
2 協議說明
2.1 協議
VRRP協議是爲消除在靜態缺省路由環境下的缺省路由器單點故障引發的網絡失效而設計的主備模式的協議,使得在發生故障而進行設備功能切換時能夠不影響內外數據通訊,不須要再修改內部網絡的網絡參數。VRRP協議須要具備IP地址備份,優先路由選擇,減小沒必要要的路由器間通訊等功能。前端

VRRP協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP(一個或多個),而在路由器組內部,若是實際擁有這個對外IP的路由器若是工做正常的話就是MASTER,或者是經過算法選舉產生,MASTER實現針對虛擬路由器IP的各類網絡功能,如ARP請求,ICMP,以及數據的轉發等;其餘設備不擁有該IP,狀態是BACKUP,除了接收MASTER的VRRP狀態通告信息外,不執行對外的網絡功能。當主機失效時,BACKUP將接管原先MASTER的網絡功能。算法

配置VRRP協議時須要配置每一個路由器的虛擬路由器ID(VRID)和優先權值,使用VRID將路由器進行分組,具備相同VRID值的路由器爲同一個組,VRID是一個0~255的正整數;同一組中的路由器經過使用優先權值來選舉MASTER,優先權大者爲MASTER,優先權也是一個0~255的正整數。vim

VRRP協議使用多播數據來傳輸VRRP數據,VRRP數據使用特殊的虛擬源MAC地址發送數據而不是自身網卡的MAC地址,VRRP運行時只有MASTER路由器定時發送VRRP通告信息,表示MASTER工做正常以及虛擬路由器IP(組),BACKUP只接收VRRP數據,不發送數據,若是必定時間內沒有接收到MASTER的通告信息,各BACKUP將宣告本身成爲MASTER,發送通告信息,從新進行MASTER選舉狀態bash

2.2 MASTER選舉
若是對外的虛擬路由器IP就是路由器自己配置的IP地址的話,該路由器始終都是MASTER;
不然若是不具有虛擬IP的話,將進行MASTER選舉,各路由器都宣告本身是MASTER,發送VRRP通告信息;
若是收到其餘機器的發來的通告信息的優先級比本身高,將轉回BACKUP狀態;
若是優先級相等的話,將比較路由器的實際IP,IP值較大的優先權高;
不過若是對外的虛擬路由器IP就是路由器自己的IP的話,該路由器始終將是MASTER,這時的優先級值爲255。
2.3 協議狀態機
VRRP協議狀態比較簡單,就三種狀態,初始化,主機,備份機。
keepalived原理和實踐
初始化:
路由器啓動時,若是路由器的優先級是255(最高優先級,路由器擁有路由器地址),要發送VRRP通告信息,併發送廣播ARP信息通告路由器IP地址對應的MAC地址爲路由虛擬MAC,設置通告信息定時器準備定時發送VRRP通告信息,轉爲MASTER狀態;不然進入BACKUP狀態,設置定時器檢查定時檢查是否收到MASTER的通告信息。
主機:
主機狀態下的路由器要完成以下功能:
設置定時通告定時器;
用VRRP虛擬MAC地址響應路由器IP地址的ARP請求;
轉發目的MAC是VRRP虛擬MAC的數據包;
若是是虛擬路由器IP的擁有者,將接受目的地址是虛擬路由器IP的數據包,不然丟棄;
當收到shutdown的事件時刪除定時通告定時器,發送優先權級爲0的通告包,轉初始化狀態;
若是定時通告定時器超時時,發送VRRP通告信息;
收到VRRP通告信息時,若是優先權爲0,發送VRRP通告信息;不然判斷數據的優先級是否高於本機,或相等並且實際IP地址大於本地實際IP,設置定時通告定時器,復位主機超時定時器,轉BACKUP狀態;不然的話,丟棄該通告包
備機:
備機狀態下的路由器要實現如下功能:
設置主機超時定時器;
不能響應針對虛擬路由器IP的ARP請求信息;
丟棄全部目的MAC地址是虛擬路由器MAC地址的數據包;
不接受目的是虛擬路由器IP的全部數據包;
當收到shutdown的事件時刪除主機超時定時器,轉初始化狀態;
主機超時定時器超時的時候,發送VRRP通告信息,廣播ARP地址信息,轉MASTER狀態;
收到VRRP通告信息時,若是優先權爲0,表示進入MASTER選舉;不然判斷數據的優先級是否高於本機,若是高的話認可MASTER有效,復位主機超時定時器;不然的話,丟棄該通告包;
2.4 ARP查詢處理
當內部主機經過ARP查詢虛擬路由器IP地址對應的MAC地址時,MASTER路由器回覆的MAC地址爲虛擬的VRRP的MAC地址,而不是實際網卡的MAC地址,這樣在路由器切換時讓內網機器覺察不到;而在路由器從新啓動時,不能主動發送本機網卡的實際MAC地址。若是虛擬路由器開啓的ARP代理(proxy_arp)功能,代理的ARP迴應也迴應VRRP虛擬MAC地址;
2.5 VRRP應用舉例
keepalived原理和實踐
這是一般VRRP使用拓撲,兩臺路由器運行VRRP互爲備份,路由器1做爲VRID組1的MASTER,IP地址A,VRID組2的BACKUP,路由器2做爲VRID組2的MASTER,IP地址B,VRID組1的BACKUP,內部網絡中一部分機器的缺省網關地址是IP地址A,一部分是IP地址B,正常狀況下以A爲網關的數據將走路由器1,以B爲網關的數據將走路由器2,若是一臺路由器發生故障,全部數據將走另外一臺路由器。
3 協議定義
3.1 以太頭
源MAC地址必須爲虛擬MAC地址:00-00-5E-00-01-{VRID},VRID爲虛擬路由器ID值,16進制格式,因此同一網段中最多有255個VRRP路由器;目的MAC爲多播類型的MAC
這裏能夠看出VRID很是重要
3.2 IP頭參數
VRRP包的源地址是本機地址,目的地址必須爲224.0.0.18,爲一多播地址;IP協議號爲112;IP包的TTL值必須爲255。
3.3 VRRP協議數據格式
keepalived原理和實踐
其中:
version:版本,4位,在RFC3768中定義爲2;
Type:類型,4位,目前只定義一種類類型:通告數據,取值爲1;
Virtual Rtr ID:虛擬路由器ID,8位
Priority:優先級,8位,具有冗餘IP地址的設備的優先級爲255;
Count IP Addrs:VRRP包中的IP地址數量,8位;
Auth Type:認證類型,8位,RFC3768中認證功能已經取消,此字段值定義0(不認證),爲1,2只做爲對老版本的兼容;
Adver Int:通告包的發送間隔時間,8位,單位是秒,缺省是1秒;
Checksum:校驗和,16位,校驗數據範圍只是VRRP數據,即從VRRP的版本字段開始的數據,不包括IP頭;
IP Address(es):和虛擬路由器相關的IP地址,數量由Count IP Addrs決定
Authentication Data:RFC3768中定義該字段只是爲了和老版本兼容,必須置0。
3.4 接受數據時的必須堅持
收到VRRP數據包時要進行如下驗證,不知足的數據包將被丟棄:服務器

  • TTL必須爲255;
  • VRRP版本號必須爲2;
  • 一個包中數據字段必須完整;
  • 校驗和必須正確;
  • 必須驗證在接收的網卡上配置了VRID值,並且本地路由器不是路由IP地址的擁有者
  • 必須驗證VVRP認證類型和配置的一致;
    4 結論
    VRRP實現了對路由器IP地址的冗餘功能,防止了單點故障形成的網絡失效,VRRP自己是熱備形式的,但能夠經過互相熱備實現路由器的均衡處理,新版的VRRP較老版簡化了認證處理,實際再也不進行數據的認證,這是由於在實際應用中常常出現認證成爲形成多個MASTER同時使用的異常狀況。

Keepalived原理與實戰精講
什麼是Keepalived呢,keepalived觀其名可知,保持存活,在網絡裏面就是保持在線了,也就是所謂的高可用或熱備,用來防止單點故障(單點故障是指一旦某一點出現故障就會致使整個系統架構的不可用)的發生,那說到keepalived時不得不說的一個協議就是VRRP協議,能夠說這個協議就是keepalived實現的基礎,那麼首先咱們來看看VRRP協議
1 VRRP協議
學過網絡的朋友都知道,網絡在設計的時候必須考慮到冗餘容災,包括線路冗餘,設備冗餘等,防止網絡存在單點故障,那在路由器或三層交換機處實現冗餘就顯得尤其重要,在網絡裏面有個協議就是來作這事的,這個協議就是VRRP協議,Keepalived就是巧用VRRP協議來實現高可用性(HA)的
keepalived徹底遵照VRRP協議,用的是paxos算法,或者近似的算法來選主的,通信走的是多播ip,包括競選機制等等
2 keepalived原理
2.1 keepalived組件
keepalived也是模塊化設計,不一樣模塊複雜不一樣的功能,下面是keepalived的組件
core check vrrp libipfwc libipvs-2.4 libipvs-2.6
core:是keepalived的核心,複雜主進程的啓動和維護,全局配置文件的加載解析等
check:負責healthchecker(健康檢查),包括了各類健康檢查方式,以及對應的配置的解析包括LVS的配置解析
vrrp:VRRPD子進程,VRRPD子進程就是來實現VRRP協議的
libipfwc:iptables(ipchains)庫,配置LVS會用到
libipvs*:配置LVS會用到
注意,keepalived和LVS徹底是兩碼事,只不過他們各負其責相互配合而已
2.2 keepalived的進程
keepalived原理和實踐
keepalived啓動後會有三個進程
父進程:內存管理,子進程管理等等
子進程:VRRP子進程
子進程:healthchecker子進程
有圖可知,兩個子進程都被系統WatchDog看管,兩個子進程各自複雜本身的事,healthchecker子進程複雜檢查各自服務器的健康程度,例如HTTP,LVS等等,若是healthchecker子進程檢查到MASTER上服務不可用了,就會通知本機上的兄弟VRRP子進程,讓他刪除通告,而且去掉虛擬IP,轉換爲BACKUP狀態網絡

Keepalived配置文件詳解架構

keepalived能夠實現輕量級的高可用,通常用於前端高可用,且不須要共享存儲,通常經常使用於兩個節點的高可用(常見的前端高可用組合有LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived)併發

1 keepalived配置詳解
keepalived有三類配置區域(姑且就叫區域吧),注意不是三種配置文件,是一個配置文件裏面三種不一樣類別的配置區域
全局配置(Global Configuration)
VRRPD配置
LVS配置
2 全局配置
全局配置又包括兩個子配置:
全局定義(global definition)
靜態路由配置(static ipaddress/routes),不經常使用
2.1 全局定義(global definition)
global_defs {
notification_email {
xxx
}
notification_email_from keepalived@domain.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
全局配置解析
global_defs全局配置標識,代表這個區域{}是全局配置dom

notification_email {
xxx
}
表示keepalived在發生諸如切換操做時須要發送email通知,已經email發送給哪些郵件地址,郵件地址能夠多個,每行一個
notification_email_from keepalived@domain.com
表示發送通知郵件時郵件源地址是誰ide

smtp_server 127.0.0.1
表示發送email時使用smtp服務器地址,這裏能夠用本地的sendmail來實現

smtp_conection_timeout 30
鏈接smtp鏈接超時時間

router_id LVS_DEVEL
機器標識
2.2 VRRP配置
VRRP配置包含三類
VRRP同步租(synchroization group),不經常使用
VRRP實例(VRRP Instance)
VRRP腳本
2.2.1 VRRP實例
vrrp_instance VI_2 {
state BACKUP
interface bond0
virtual_router_id 251
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}

track_script {
chk_http_port
}

virtual_ipaddress {
x.x.x.x dev bond0 label bond0:0
x.x.x.x dev bond0 label bond0:4
x.x.x.x dev bond0 label bond0:5
}
}
state:state指定instance(Initial)的初始狀態,就是說在配置好後,這臺服務器的初始狀態就是這裏指定的,但這裏指定的不算,仍是得要經過競選經過優先級來肯定,裏若是這裏設置爲master,但如若他的優先級不及另一臺,那麼這臺在發送通告時,會發送本身的優先級,另一臺發現優先級不如本身的高,那麼他會就回搶佔爲master
interface:實例綁定網卡,由於在配置虛擬IP的時候必須是在已有的網卡上添加
virtual router id:這裏設置VRID,這裏很是重要,相同的VRID爲一組,它決定多播的MAC地址
priority:設置本節點的優先級,優先級高的爲master
advert int:檢查間隔,默認爲1秒
virtual ipaddress:這裏設置的就是VIP,也就是虛擬ip,它隨着state的變化而增長刪除,當state爲master時候添加,當state爲backup時候刪除,這裏主要是有優先級決定的,和state設置沒有多大關係,這裏能夠設置多個ip地址
authentication:這裏設置認證
auth type:認證的方式,能夠是PASS或AH兩種認證方式
auth pass:認證密碼
track_script:引用上面定義的腳本
2.2.2 VRRP腳本
vrrp_script chk_http_port {
script "/etc/keepalived/check.sh"
interval 2
weight 2
}
首先在vrrp_script 區域定義腳本名字和腳本執行間隔、腳本的執行的優先級
script:腳本的路徑
interval:腳本的執行間隔
weight:腳本結果致使的優先級變動
而後在實例vrrp_instance裏面引用,有點相似腳本里面的函數引用同樣:先定義,後引用函數名
注意:vrrp腳本和vrrp實例,屬於同一級別
2.2.3 腳本內容
vim /etc/keepalived/check.sh
#! /usr/bin/env bash

/usr/bin/pkill -0 -f haproxy

if [ $? -ne 0 ];then
systemctl start haproxy
sleep 3
fi

/usr/bin/pkill -0 -f haproxy

if [ $? -ne 0 ];thensystemctl stop keepalivedfi注意:pkill -0 -f haproxy只是檢測haproxy進程是否存在,若是存在返回狀態0,不存在返回非0的值,不會真正的停掉haproxy的

相關文章
相關標籤/搜索