http://zkchang.blog.51cto.com/10574636/1706998
一.keepalived和其工作原理:
keepalived是一個類似於Layer2,4,7交換機制的軟件。是Linux集群管理中保證集群高可用的一個服務軟件,其功能是用來防止單點故障。
keepalived的工作原理:
keepalived是基於VRRP協議實現的保證集群高可用的一個服務軟件,主要功能是實現真機的故障隔離和負載均衡器間的失敗切換,防止單點故障。在了解keepalived原理之前先了解一下VRRP協議。
VRRP協議:Virtual Route Redundancy Protocol虛擬路由冗余協議。是一種容錯協議,保證當主機的下一跳路由出現故障時,由另一台路由器來代替出現故障的路由器進行工作,從而保持網絡通信的連續性和可靠性。在介紹VRRP之前先介紹一些關於VRRP的相關術語:
虛擬路由器:由一個 Master 路由器和多個 Backup 路由器組成。主機將虛擬路由器當作默認網關。
VRID:虛擬路由器的標識。有相同 VRID 的一組路由器構成一個虛擬路由器。
Master 路由器:虛擬路由器中承擔報文轉發任務的路由器。
Backup 路由器: Master 路由器出現故障時,能夠代替 Master 路由器工作的路由器。
虛擬 IP 地址:虛擬路由器的 IP 地址。一個虛擬路由器可以擁有一個或多個IP 地址。
IP 地址擁有者:接口 IP 地址與虛擬 IP 地址相同的路由器被稱為 IP 地址擁有者。
虛擬 MAC 地址:一個虛擬路由器擁有一個虛擬 MAC 地址。虛擬 MAC 地址的格式為 00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器回應 ARP 請求使用的是虛擬 MAC 地址,只有虛擬路由器做特殊配置的時候,才回應接口的真實 MAC 地址。
優先級: VRRP 根據優先級來確定虛擬路由器中每台路由器的地位。
非搶占方式:如果 Backup 路由器工作在非搶占方式下,則只要 Master 路由器沒有出現故障,Backup 路由器即使隨后被配置了更高的優先級也不會成為Master 路由器。
搶占方式:如果 Backup 路由器工作在搶占方式下,當它收到 VRRP 報文后,會將自己的優先級與通告報文中的優先級進行比較。如果自己的優先級比當前的 Master 路由器的優先級高,就會主動搶占成為 Master 路由器;否則,將保持 Backup 狀態。
虛擬路由示意圖:

VRRP將局域網內的一組路由器划分在一起,形成一個VRRP備份組,它在功能上相當於一台路由器的功能,使用虛擬路由器號進行標識(VRID)。虛擬路由器有自己的虛擬IP地址和虛擬MAC地址,它的外在變現形式和實際的物理路由完全一樣。局域網內的主機將虛擬路由器的IP地址設置為默認網關,通過虛擬路由器與外部網絡進行通信。
虛擬路由器是工作在實際的物理路由器之上的。它由多個實際的路由器組成,包括一個Master路由器和多個Backup路由器。 Master路由器正常工作時,局域網內的主機通過Master與外界通信。當Master路由器出現故障時, Backup路由器中的一台設備將成為新的Master路由器,接替轉發報文的工作。(路由器的高可用)
VRRP的工作工程:
(1) 虛擬路由器中的路由器根據優先級選舉出 Master。 Master 路由器通過發送免費 ARP 報文,將自己的虛擬 MAC 地址通知給與它連接的設備或者主機,從而承擔報文轉發任務;
(2) Master 路由器周期性發送 VRRP 報文,以公布其配置信息(優先級等)和工作狀況;
(3) 如果 Master 路由器出現故障,虛擬路由器中的 Backup 路由器將根據優先級重新選舉新的 Master;
(4) 虛擬路由器狀態切換時, Master 路由器由一台設備切換為另外一台設備,新的 Master 路由器只是簡單地發送一個攜帶虛擬路由器的 MAC 地址和虛擬 IP地址信息的ARP 報文,這樣就可以更新與它連接的主機或設備中的ARP 相關信息。網絡中的主機感知不到 Master 路由器已經切換為另外一台設備。
(5) Backup 路由器的優先級高於 Master 路由器時,由 Backup 路由器的工作方式(搶占方式和非搶占方式)決定是否重新選舉 Master。
VRRP優先級的取值范圍為0到255(數值越大表明優先級越高)
================================================================
keepalived的工作原理就是基於VRRP實現的,keepalived的體系結構圖如下:

在這個機構圖中,處於內核的IPVS和NETLINK,其中NETLINK是提供高級路由及其他相關的網絡功能,如果在負載均衡器上啟用iptables/netfilter,將會直接影響它的性能。對於圖中不同模塊功能的介紹如下:
- VRRP Stack 負責負載均衡器之間的失敗切換FailOver;//LVS中負責DR調度器組的
- Checkers 負責檢查調度器后端的Real server 或者 Upstream Server的健康狀況; // 檢查RS的狀態,決定是否將其剔除
- WatchDog 負責監控checkers和VRRP進程的狀況;
- IPVS wrapper 用來發送設定的規則到內核IPVS;
- Netlink Reflector 用來設定VRRP的vip地址。// VIP也有‘人’管
keepalived運行時,會啟動3個進程,分別為:core(核心進程),check和vrrp
- core:負責主進程的啟動,維護和全局配置文件的加載;
- check:負責健康檢查
- vrrp:用來實現vrrp協議
總結:在vrrp協議的基礎上實現了服務器主機的負載均衡,VRRP負責調度器之間的高可用。
Keepalived 配置文件介紹:
在yum安裝好keepalived之后,keepalived會產生一個配置文件/etc/keepalived/keepalived.conf ,配置文件包含了三個段:
全局定義段、VRRP實例定義段、虛擬服務器定義段。
global_defs {
notification_email { 指定keepalived在發生切換時需要發送email到的對象。
acassen@firewall.loc
}
notification_email_from huangxin202823@163.com #指定發件人
smtp_server smtp.163.com #指定smtp服務器地址
smtp_connect_timeout 3 #指定smtp連接超時時間
router_id LVS_DEVEL #運行keepalived的一個標識
}
vrrp_sync_group VG_1{ #監控多個網段的實例
group{
inside_network #實例名
outside_network }
notify_master /path/xx.sh #指定當切換到master時,執行的腳本
netify_backup /path/xx.sh #指定當切換到backup時,執行的腳本
notify_fault "path/xx.shVG_1" #故障時執行的腳本
notify /path/xx.sh #腳本所在目錄
smtp_alert #使用global_defs中提供的郵件地址和smtp服務器發送郵件通知}
#VRRP實例定義段
vrrp_instance VI_1 {
state MASTER #指定哪個為master,哪個為backup
interface eth0 #設置實例綁定的網卡
virtual_router_id 51 #VRID標記
priority 100 #優先級,高優先級的DR會搶占為master (默認為搶占模式)
advert_int 1 #檢查間隔,1秒
authentication { #設置認證
auth_type PASS #認證方式
auth_pass 1111 #認證字符串(使用 openssl rand -hex 6生成隨機字符串)
}
virtual_ipaddress { #設置VIP
<IPADDR>/<MASK> brd <IPADDR> dev <STRING>scope <SCOPE> label <LABEL>
192.168.200.17/24 deveth1
192.168.200.100/24 deveth2 label eth2:1
}
sorry_server 127.0.0.1 80 #web服務器全部失敗,可以指定Sorry web
}
virtual_server 192.168.200.100 443 {
delay_loop 6 #健康檢查時間間隔,單位秒
lb_algo rr #負載調度算法,支持的算法:rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS的類型:有NAT|DR|TUN
nat_mask255.255.255.0 #子網掩碼
persistence_timeout50 #會話保持時間,單位秒(可以適當延長時間以保持session)
protocol TCP #轉發協議類型,有TCP和UDP兩種
weight 1#權重
#inhibit_on_failure #當服務器健康檢查失效時,將weight設置為0不是直接從ipvs中刪除
#notify_up <STRING>|<QUOTED-STRING>#Server啟動時執行的腳本
#notify_down <STRING>|<QUOTED-STRING>#Server down時執行的腳本
#后端RS服務器的檢查 (HTTP_GET 和SSL_GET):
SSL_GET {
url { #檢查url,可以指定多個,status_codeand digest
path /
digest ff20ad #或者status_code 200 ....
}
connect_timeout 3 #連接超時時間
nb_get_retry 3 #重連次數
delay_before_retry 3 #重連間隔時間
}
#也可以通過TCP_CHECK判斷RealServer的健康狀況:
}
}