keepalived介紹
keepalived觀察其名可知,保持存活,在網絡裡面就是保持線上了,也就是所謂的高可用或熱備,它叢集管理中保證叢集高可用的一個服務軟體,其功能類似于heartbeat,用來防止單點故障(單點故障是指一旦某一點出現故障就會導緻整個系統架構的不可用)的發生。說到keepalived就不得不說VRRP協定,可以說這個協定就是keepalived實作的基礎,那麼首先我們來看看VRRP協定。
VRRP協定介紹
學過網絡的朋友都知道,網絡在設計的時候必須考慮到備援容災,包括線路備援,裝置備援等,防止網絡存在單點故障,那在路由器或三層交換機處實作備援就顯得尤為重要。
在網絡裡面有個協定就是來做這事的,這個協定就是VRRP協定,Keepalived就是巧用VRRP協定來實作高可用性(HA)的發生。
VRRP全稱Virtual Router Redundancy Protocol,即虛拟路由備援協定。對于VRRP,需要清楚知道的是:
1)VRRP是用來實作路由器備援的協定。
2)VRRP協定是為了消除在靜态預設路由環境下路由器單點故障引起的網絡失效而設計的主備模式的協定,使得發生故障而進行設計裝置功能切換時可以不影響内外資料通信,不需要再修改内部網絡的網絡參數。
3)VRRP協定需要具有IP備份,優先路由選擇,減少不必要的路由器通信等功能。
4)VRRP協定将兩台或多台路由器裝置虛拟成一個裝置,對外提供虛拟路由器IP(一個或多個)。然而,在路由器組内部,如果實際擁有這個對外IP的路由器如果工作正常的話,就是master,或者是通過算法選舉産生的,MASTER實作針對虛拟路由器IP的各種網絡功能,如ARP請求,ICMP,以及資料的轉發等,其他裝置不具有該IP,狀态是BACKUP。除了接收MASTER的VRRP狀态通告資訊外,不執行對外的網絡功能,當主級失效時,BACKUP将接管原先MASTER的網絡功能。
5)VRRP協定配置時,需要配置每個路由器的虛拟路由ID(VRID)和優先權值,使用VRID将路由器進行分組,具有相同VRID值的路由器為同一個組,VRID是一個0-255的整整數,;同一個組中的路由器通過使用優先權值來選舉MASTER。,優先權大者為MASTER,優先權也是一個0-255的正整數。
keepalived工作原理
keepalived可提供vrrp以及health-check功能,可以隻用它提供雙機浮動的vip(vrrp虛拟路由功能),這樣可以簡單實作一個雙機熱備高可用功能;keepalived是以VRRP虛拟路由備援協定為基礎實作高可用的,可以認為是實作路由器高可用的協定,即将N台提供相同功能的路由器組成一個路由器組,這個組裡面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在區域網路内其他機器的預設路由為該vip),master會發多點傳播,當backup收不到VRRP包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
下圖是keepalived的元件圖

keepalived也是子產品化設計,不同子產品複雜不同的功能,它主要有三個子產品,分别是core、check和VRRP,其中:
core子產品:為keepalived的核心元件,負責主程序的啟動、維護以及全局配置檔案的加載和解析;
check:負責健康檢查,包括常見的各種檢查方式;
VRRP子產品:是來實作VRRP協定的。
system call:系統調用
watch dog:監控check和vrrp程序的看管者,check負責檢測器子程序的健康狀态,當其檢測到master上的服務不可用時則通告vrrp将其轉移至backup伺服器上。
除此之外,keepalived還有下面兩個元件:
libipfwc:iptables(ipchains)庫,配置LVS會用到
libipvs*:配置LVS會用到
注意,keepalived和LVS完全是兩碼事,隻不過他們各負其責互相配合而已。
keepalived正常啟動的時候,共啟動3個程序:
一個是父程序,負責監控其子程序;一個是VRRP子程序,另外一個是checkers子程序;
兩個子程序都被系統watchlog看管,兩個子程序各自負責複雜自己的事。
Healthcheck子程序檢查各自伺服器的健康狀況,,例如http,lvs。如果healthchecks程序檢查到master上服務不可用了,就會通知本機上的VRRP子程序,讓他删除通告,并且去掉虛拟IP,轉換為BACKUP狀态。
Keepalived作用
Keepalived主要用作RealServer的健康狀态檢查以及LoadBalance主機和BackUP主機之間failover的實作。Keepalived的作用是檢測web伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived将檢測到,并将有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動将web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的web伺服器。
----------------------------------------------------------------------------------------------------------------------------
Keepalived和Heartbeat之間的對比
1)Keepalived使用更簡單:從安裝、配置、使用、維護等角度上對比,Keepalived都比Heartbeat要簡單得多,尤其是Heartbeat2.1.4後拆分成3個子項目,安裝、配置、使用都比較複雜,尤其是出問題的時候,都不知道具體是哪個子系統出問題了;而Keepalived隻有1個安裝檔案、1個配置檔案,配置檔案也簡單很多;
2)Heartbeat功能更強大:Heartbeat雖然複雜,但功能更強大,配套工具更全,适合做大型叢集管理,而Keepalived主要用于叢集倒換,基本沒有管理功能;
3)協定不同:Keepalived使用VRRP協定進行通信和選舉,Heartbeat使用心跳進行通信和選舉;Heartbeat除了走網絡外,還可以通過序列槽通信,貌似更可靠;
Keepalived使用的vrrp協定方式,虛拟路由備援協定 ;Heartbeat是基于主機或網絡的服務的高可用方式;
Keepalived的目的是模拟路由器的雙機;Heartbeat的目的是使用者service的雙機
4)使用方式基本類似:如果要基于兩者設計高可用方案,最終都要根據業務需要寫自定義的腳本,Keepalived的腳本沒有任何限制,随便怎麼寫都可以;Heartbeat的腳本有限制,即要支援service start/stop/restart這種方式,而且Heartbeart提供了很多預設腳本,簡單的綁定ip,啟動apache等操作都已經有了;
使用建議:
優先使用Keepalived,當Keepalived不夠用的時候才選擇Heartbeat
lvs的高可用建議用Keepavlived
業務的高可用用Heartbeat
--------------------------------------------------------------------------------------------------------------------------
keepalived的配置檔案
keepalived隻有一個配置檔案keepalived.conf,配置檔案裡面主要包括以下幾個配置項,分别是global_defs、static_ipaddress、static_routes、VRRP_script、VRRP_instance和virtual_server。
總的來說,keepalived主要有三類區域配置,注意不是三種配置檔案,是一個配置檔案裡面三種不同類别的配置區域:
1)全局配置(Global Configuration)
2)VRRPD配置
3)LVS配置
下面就重點來說說這三類區域的配置:
1)全局配置
全局配置又包括兩個子配置:
全局定義(global definition)
靜态路由配置(static ipaddress/routes)
1--全局定義(global definition)配置範例:
1
2
3
4
5
6
7
8
9
10
11
<code>global_defs</code>
<code>{</code>
<code>notification_email</code>
<code>[email protected]</code>
<code>}</code>
<code>notification_email_from [email protected]</code>
<code>smtp_server 127.0.0.1</code>
<code>stmp_connect_timeout 30</code>
<code>router_id node1</code>
全局配置解析
global_defs全局配置辨別,表面這個區域{}是全局配置
<code>[email protected]</code>
表示keepalived在發生諸如切換操作時需要發送email通知,以及email發送給哪些郵件位址,郵件位址可以多個,每行一個
notification_email_from [email protected]
表示發送通知郵件時郵件源位址是誰
smtp_server 127.0.0.1
表示發送email時使用的smtp伺服器位址,這裡可以用本地的sendmail來實作
smtp_connect_timeout 30
連接配接smtp連接配接逾時時間
router_id node1
機器辨別
2--靜态位址和路由配置範例
<code>static_ipaddress</code>
<code>192.168.1.1</code><code>/24</code> <code>brd + dev eth0 scope global</code>
<code>192.168.1.2</code><code>/24</code> <code>brd + dev eth1 scope global</code>
<code>static_routes</code>
<code>src $SRC_IP to $DST_IP dev $SRC_DEVICE</code>
<code>src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE</code>
這裡實際上和系統裡面用指令配置IP位址和路由的曹一樣,例如:
192.168.1.1/24 brd + dev eth0 scope global 相當于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global
就是給eth0配置IP位址
路由同理
一般這個區域不需要配置
這裡實際上就是給伺服器配置真實的IP位址和路由的,在複雜的環境下可能需要配置,一般不會用這個來配置,我們可以直接用vi /etc/sysconfig/network-script/ifcfg-eth1來配置,切記這裡可不是VIP哦,不要搞混淆了,切記切記!
VRRPD配置包括三個類:
VRRP同步組(synchroization group)
VRRP執行個體(VRRP Instance)
VRRP腳本
1--VRRP同步組(synchroization group)配置範例
<code>vrrp_sync_group VG_1 {</code>
<code>group {</code>
<code>http</code>
<code>mysql</code>
<code>notify_master </code><code>/path/to/to_master</code><code>.sh</code>
<code>notify_backup </code><code>/path_to/to_backup</code><code>.sh</code>
<code>notify_fault “</code><code>/path/fault</code><code>.sh VG_1”</code>
<code>notify </code><code>/path/to/notify</code><code>.sh</code>
<code>smtp_alert</code>
其中:
group {
http
mysql
}
http和mysql是執行個體名和下面的執行個體名一緻
notify_master /path/to/to_master.sh:表示當切換到master狀态時,要執行的腳本
notify_backup /path_to/to_backup.sh:表示當切換到backup狀态時,要執行的腳本
notify_fault “/path/fault.sh VG_1”
notify /path/to/notify.sh:
smtp alter表示切換時給global defs中定義的郵件位址發送右鍵通知
2--VRRP執行個體(instance)配置範例
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<code>vrrp_instance http {</code>
<code>state MASTER</code>
<code>interface eth0</code>
<code>dont_track_primary</code>
<code>track_interface {</code>
<code>eth0</code>
<code>eth1</code>
<code>mcast_src_ip <IPADDR></code>
<code>garp_master_delay 10</code>
<code>virtual_router_id 51</code>
<code>priority 100</code>
<code>advert_int 1</code>
<code>authentication {</code>
<code>auth_type PASS</code>
<code>autp_pass 1234</code>
<code>virtual_ipaddress {</code>
<code>#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL></code>
<code>192.168.200.17</code><code>/24</code> <code>dev eth1</code>
<code>192.168.200.18</code><code>/24</code> <code>dev eth2 label eth2:1</code>
<code>virtual_routes {</code>
<code># src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab</code>
<code>src 192.168.100.1 to 192.168.109.0</code><code>/24</code> <code>via 192.168.200.254 dev eth1</code>
<code>192.168.110.0</code><code>/24</code> <code>via 192.168.200.254 dev eth1</code>
<code>192.168.111.0</code><code>/24</code> <code>dev eth2</code>
<code>192.168.112.0</code><code>/24</code> <code>via 192.168.100.254</code>
<code>nopreempt</code>
<code>preemtp_delay 300</code>
<code>debug</code>
state:state指定instance(Initial)的初始狀态,就是說在配置好後,這台伺服器的初始狀态就是這裡指定的,但這裡指定的不算,還是得要通過競選通過優先級來确定,裡如果這裡設定為master,但如若他的優先級不及另外一台,那麼這台在發送通告時,會發送自己的優先級,另外一台發現優先級不如自己的高,那麼他會就回搶占為master
interface:執行個體綁定的網卡,因為在配置虛拟IP的時候必須是在已有的網卡上添加的
dont track primary:忽略VRRP的interface錯誤
track interface:跟蹤接口,設定額外的監控,裡面任意一塊網卡出現問題,都會進入故障(FAULT)狀态,例如,用nginx做均衡器的時候,内網必須正常工作,如果内網出問題了,這個均衡器也就無法運作了,是以必須對内外網同時做健康檢查
mcast src ip:發送多點傳播資料包時的源IP位址,這裡注意了,這裡實際上就是在那個位址上發送VRRP通告,這個非常重要,一定要選擇穩定的網卡端口來發送,這裡相當于heartbeat的心跳端口,如果沒有設定那麼就用預設的綁定的網卡的IP,也就是interface指定的IP位址
garp master delay:在切換到master狀态後,延遲進行免費的ARP(gratuitous ARP)請求
virtual router id:這裡設定VRID,這裡非常重要,相同的VRID為一個組,他将決定多點傳播的MAC位址
priority 100:設定本節點的優先級,優先級高的為master
advert int:檢查間隔,預設為1秒
virtual ipaddress:這裡設定的就是VIP,也就是虛拟IP位址,他随着state的變化而增加删除,當state為master的時候就添加,當state為backup的時候删除,這裡主要是有優先級來決定的,和state設定的值沒有多大關系,這裡可以設定多個IP位址
virtual routes:原理和virtual ipaddress一樣,隻不過這裡是增加和删除路由
lvs sync daemon interface:lvs syncd綁定的網卡
authentication:這裡設定認證
auth type:認證方式,可以是PASS或AH兩種認證方式
auth pass:認證密碼
nopreempt:設定不搶占,這裡隻能設定在state為backup的節點上,而且這個節點的優先級必須别另外的高
preempt delay:搶占延遲
debug:debug級别
notify master:和sync group這裡設定的含義一樣,可以單獨設定,例如不同的執行個體通知不同的管理人員,http執行個體發給網站管理者,mysql的就發郵件給DBA
3--VRRP腳本範例
<code>vrrp_script check_running {</code>
<code> </code><code>script “</code><code>/usr/local/bin/check_running</code><code>”</code>
<code> </code><code>interval 10</code>
<code> </code><code>weight 10</code>
<code> </code><code>state BACKUP</code>
<code> </code><code>smtp_alert</code>
<code> </code><code>interface eth0</code>
<code> </code><code>virtual_router_id 101</code>
<code> </code><code>priority 90</code>
<code> </code><code>advert_int 3</code>
<code> </code><code>authentication {</code>
<code> </code><code>auth_type PASS</code>
<code> </code><code>auth_pass whatever</code>
<code> </code><code>}</code>
<code> </code><code>virtual_ipaddress {</code>
<code> </code><code>1.1.1.1</code>
<code> </code><code>track_script {</code>
<code> </code><code>check_running weight 20</code>
首先在vrrp_script區域定義腳本名字和腳本執行的間隔和腳本執行的優先級變更vrrp_script check_running {
<code>script “</code><code>/usr/local/bin/check_running</code><code>”</code>
<code>interval 10 </code><code>#腳本執行間隔</code>
<code>weight 10 </code><code>#腳本結果導緻的優先級變更:10表示優先級+10;-10則表示優先級-10</code>
然後在執行個體(vrrp_instance)裡面引用,有點類似腳本裡面的函數引用一樣:先定義,後引用函數名
<code>track_script {</code>
<code>check_running weight 20</code>
注意:VRRP腳本(vrrp_script)和VRRP執行個體(vrrp_instance)屬于同一個級别
3)LVS配置
如果你沒有配置LVS+keepalived,那麼無需配置這段區域,如果你用的是nginx來代替LVS,這無需配置這款,這裡的LVS配置是專門為keepalived+LVS內建準備的。
注意了,這裡LVS配置并不是指真的安裝LVS然後用ipvsadm來配置它,而是用keepalived的配置檔案來代替ipvsadm來配置LVS,這樣會友善很多,一個配置檔案搞定這些,維護友善,配置友善是也!
這裡LVS配置也有兩個配置
一個是虛拟主機組配置
一個是虛拟主機配置
1--虛拟主機組配置檔案詳解
這個配置是可選的,根據需求來配置吧,這裡配置主要是為了讓一台realserver上的某個服務可以屬于多個Virtual Server,并且隻做一次健康檢查:
virtual_server_group <STRING> { # VIP port <IPADDR> <PORT> <IPADDR> <PORT> fwmark <INT> }
2--虛拟主機配置
virtual server可以以下面三種的任意一種來配置:
a)virtual server IP port
b)virtual server fwmark int
c)virtual server group string
下面以第一種比較常用的方式來配詳細解說一下:
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<code>virtual_server 192.168.1.2 80 { </code><code>#設定一個virtual server: VIP:Vport</code>
<code>delay_loop 3 </code><code># service polling的delay時間,即服務輪詢的時間間隔</code>
<code>lb_algo rr|wrr|lc|wlc|lblc|sh|dh </code><code>#LVS排程算法</code>
<code>lb_kind NAT|DR|TUN </code><code>#LVS叢集模式 </code>
<code>persistence_timeout 120 </code><code>#會話保持時間(秒為機關),即以使用者在120秒内被配置設定到同一個後端realserver</code>
<code>persistence_granularity <NETMASK> </code><code>#LVS會話保持粒度,ipvsadm中的-M參數,預設是0xffffffff,即每個用戶端都做會話保持</code>
<code>protocol TCP </code><code>#健康檢查用的是TCP還是UDP</code>
<code>ha_suspend </code><code>#suspendhealthchecker’s activity</code>
<code>virtualhost <string> </code><code>#HTTP_GET做健康檢查時,檢查的web伺服器的虛拟主機(即host:頭)</code>
<code>sorry_server <IPADDR> <PORT> </code><code>#備用機,就是當所有後端realserver節點都不可用時,就用這裡設定的,也就是臨時把所有的請求都發送到這裡啦</code>
<code>real_server <IPADDR> <PORT> </code><code>#後端真實節點主機的權重等設定,主要,後端有幾台這裡就要設定幾個</code>
<code>weight 1 </code><code>#給每台的權重,0表示失效(不知給他轉發請求知道他恢複正常),預設是1</code>
<code>inhibit_on_failure </code><code>#表示在節點失敗後,把他權重設定成0,而不是沖IPVS中删除</code>
<code>notify_up <STRING> | <QUOTED-STRING> </code><code>#檢查伺服器正常(UP)後,要執行的腳本</code>
<code>notify_down <STRING> | <QUOTED-STRING> </code><code>#檢查伺服器失敗(down)後,要執行的腳本</code>
<code>HTTP_GET </code><code>#健康檢查方式</code>
<code>url { </code><code>#要堅持的URL,可以有多個</code>
<code>path / </code><code>#具體路徑</code>
<code>digest <STRING> </code>
<code>status_code 200 </code><code>#傳回狀态碼</code>
<code>connect_port 80 </code><code>#監控檢查的端口</code>
<code>bindto <IPADD> </code><code>#健康檢查的IP位址</code>
<code>connect_timeout 3 </code><code>#連接配接逾時時間</code>
<code>nb_get_retry 3 </code><code>#重連次數</code>
<code>delay_before_retry 2 </code><code>#重連間隔</code>
<code>} </code><code># END OF HTTP_GET|SSL_GET</code>
<code>#下面是常用的健康檢查方式,健康檢查方式一共有HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK這些</code>
<code>#TCP方式</code>
<code>TCP_CHECK {</code>
<code>connect_port 80</code>
<code>bindto 192.168.1.1</code>
<code>connect_timeout 4</code>
<code>} </code><code># TCP_CHECK</code>
<code># SMTP方式,這個可以用來給郵件伺服器做叢集</code>
<code>SMTP_CHECK</code>
<code>host {</code>
<code>connect_ip <IP ADDRESS></code>
<code>connect_port <PORT> </code><code>#預設檢查25端口</code>
<code>14 KEEPALIVED</code>
<code>bindto <IP ADDRESS></code>
<code>connect_timeout <INTEGER></code>
<code>retry <INTEGER></code>
<code>delay_before_retry <INTEGER></code>
<code># “smtp HELO”ž|·-ëê§Œà”</code>
<code>helo_name <STRING>|<QUOTED-STRING></code>
<code>} </code><code>#SMTP_CHECK</code>
<code>#MISC方式,這個可以用來檢查很多伺服器隻需要自己會些腳本即可</code>
<code>MISC_CHECK</code>
<code>misc_path <STRING>|<QUOTED-STRING> </code><code>#外部程式或腳本</code>
<code>misc_timeout <INT> </code><code>#腳本或程式執行逾時時間</code>
<code>misc_dynamic </code><code>#這個就很好用了,可以非常精确的來調整權重,是後端每天伺服器的壓力都能均衡調配,這個主要是通過執行的程式或腳本傳回的狀态代碼來動态調整weight值,使權重根據真實的後端壓力來适當調整,不過這需要有過硬的腳本功夫才行哦</code>
<code>#傳回0:健康檢查沒問題,不修改權重</code>
<code>#傳回1:健康檢查失敗,權重設定為0</code>
<code>#傳回2-255:健康檢查沒問題,但是權重卻要根據傳回代碼修改為傳回碼-2,例如如果程式或腳本執行後傳回的代碼為200,#那麼權重這回被修改為 200-2</code>
<code>} </code><code># Realserver</code>
<code>} </code><code># Virtual Server</code>
***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************
本文轉自散盡浮華部落格園部落格,原文連結:http://www.cnblogs.com/kevingrace/p/6248941.html,如需轉載請自行聯系原作者