轉自:http://essun.blog.51cto.com/721033/1405642算法
------本文大綱後端
簡介bash
keepalived原理服務器
keepalived配置文件註解網絡
---------------------------------ide
1、簡介模塊化
Keepalived:它的誕生最初是爲ipvs(一些服務,內核中的一些規則)提供高可用性的,最初最主要目的是可以自主調用ipvsadm來生成規則,而且可以自動實現將用戶訪問的地址轉移到其餘節點上進行實現的。oop
Keepalived:核心包含兩個ckeckers和VRRP協議。url
ckeckersspa
檢查服務檢查reserved的健康情況的,基於腳本也可檢查服務自己的健康情況。這裏是實現ipvs後端健康情況的檢測的。
VRRP
是一種容錯協議,它保證當主機的下一跳路由器出現故障時,由另外一臺路由器來代替出現故障的路由器進行工做,從而保持網絡通訊的連續性和可靠性。VRRP中每一個節點之間都有優先級的通常爲0-255(0,255有特殊用法)數字越大優先級越高。
相關術語解析
虛擬路由器
由一個Master路由器和多個Backup路由器組成。主機將虛擬路由器看成默認網關;
VRID
虛擬路由器的標識。有相同VRID的一組路由器構成一個虛擬路由器;
Master路由器
虛擬路由器中承擔報文轉發任務的路由器;
Backup路由器
Master路由器出現故障時,可以代替Master路由器工做的路由器;
虛擬IP 地址
虛擬路由器的IP 地址。一個虛擬路由器能夠擁有一個或多個IP地址;
IP地址擁有者
接口IP地址與虛擬IP地址相同的路由器被稱爲IP地址擁有者;
虛擬MAC地址
一個虛擬路由器擁有一個虛擬MAC地址。一般狀況下,虛擬路由器迴應ARP請求使用的是虛擬MAC地址,只有虛擬路由器作特殊配置的時候,纔回應接口的真實MAC地址;
優先級
VRRP根據優先級來肯定虛擬路由器中每臺路由器的地位;
非搶佔方式
若是Backup路由器工做在非搶佔方式下,則只要Master路由器沒有出現故障Backup路由器即便隨後被配置了更高的優先級也不會成爲Master路由器;
搶佔方式
若是Backup路由器工做在搶佔方式下,當它收到VRRP報文後,會將本身的優先級與通告報文中的優先級進行比較。若是本身的優先級比當前的Master路由器的優先級高,就會主動搶佔成爲Master路由器;不然,將保持Backup狀態.
2、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啓動後會有三個進程
父進程:內存管理,子進程管理等等
子進程:VRRP子進程
子進程:checkers子進程
兩 個子進程都被系統WatchDog看管,兩個子進程各自複雜本身的事,checkers子進程複雜檢查各自服務器的健康程度,例如HTTP,LVS等等, 若是checkers子進程檢查到MASTER上服務不可用,就會通知本機上的兄弟VRRP子進程,讓他刪除通告,而且去掉虛擬IP,轉換爲BACKUP 狀態
3、keepkeepalived配置文件介紹
安裝
1
|
[root@essun yum.repos.d]
# yum install -y keepalived
|
只有一個配置文件/etc/keepalived/keepalived.conf,裏面主要包括如下幾個比較經常使用的配置區域,分別是global_defs、vrrp_script、vrrp_instance和virtual_server。
global_defs區域主要是配置故障發生時的通知對象以及機器標識
1
2
3
4
5
6
7
8
9
10
11
|
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
|
notification_email
故障發生時給誰發郵件通知
notification_email_from
通知郵件從哪一個地址發出
smpt_server
通知郵件的smtp地址
smtp_connect_timeout
鏈接smtp服務器的超時時間
router_id
標識本節點的字條串,一般爲hostname,但不必定非得是hostname。故障發生時,郵件通知會用到
vrrp_instance區域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
vrrp_script switch {
script
"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
switch
}
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
notify_master
/path/to/to_master
.sh
notify_backup
/path_to/to_backup
.sh
notify_fault
"/path/fault.sh VG_1"
}
|
vrrp_script
定義vrrp_script 區域名稱
script
所要執行的腳本
interval
腳本執行間隔時間
weight
腳本結果致使的優先級變動:2表示優先級+2;-2則表示優先級-2
vrrp_instance
用來定義對外提供服務的VIP區域及其相關屬性
state
能夠是MASTER或BACKUP,不過當其餘節點keepalived啓動時會將priority比較大的節點選舉爲MASTER,所以該項其實沒有實質用途
interface
節點固有IP(非VIP)的網卡,用來發VRRP包
virtual_router_id
取值在0-255之間,用來區分多個instance的VRRP組播。
注意: 同一網段中virtual_router_id的值不能重複,不然會出錯。
priority
用來選舉master的,要成爲master,那麼這個選項的值最好高於其餘機器50個點,該項取值範圍是1-255(在此範圍以外會被識別成默認值100)
advert_int
檢查間隔,默認爲1秒
authentication
這裏設置認證
auth type
認證方式,能夠是PASS或AH兩種認證方式
auth pass認證密碼
track_script
對vrrp_script定義的腳本進行追蹤
switch
對那一個區域進行追蹤
notify_master
/path/to/to_master
.sh
切換到主狀態要發的通知
notify_backup
/path_to/to_backup
.sh
切換到備狀態要執行的通知
notify_fault
"/path/fault.sh VG_1"
故障時要執行的通知(若是路徑中有空格,須要加雙引號引用)
注:
以上三個參數指的腳本要自定義
virtual_server區域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
virtual_server 192.168.200.100 443 {
delay_loop 6
lb_algo rr
lb_kind NAT
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.201.100 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path
/mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
|
virtual_server 192.168.200.100 443
對外經過ip地址192.168.200.100 提供443端口的服務
delay_loop
延遲輪詢時間(s)
lb_algo
後端指定的調度算法
lb_kind
調度模式
nat_mask
網絡地址
persistence_timeout
會話保持時間(秒爲單位),用戶在50秒內被分配到同一個後端realserver
protocol TCP
健康檢查用的是TCP仍是UDP
real_server <IPADDR> <PORT>
後端真實節點主機的權重等設置,主要,後端有幾臺這裏就要設置幾個
weight
每一臺realserver的權重
SSL_GET
健康檢查方式
url
要堅持的URL,能夠有多個
path
具體的路徑
digest
表示用genhash算出的結果
connect_timeout
超時時長
nb_get_retry
重試次數
delay_before_retry
下次重試的時間延遲
在realserver也可自定義服務器狀態發生變化後所執行的腳本
notify_up <STRING> | <QUOTED-STRING>
檢查服務器正常(UP)後,要執行的腳本
notify_down <STRING> | <QUOTED-STRING>
檢查服務器失敗(down)後,要執行的腳本
以上則經常使用到的參數,更多參數及用法請man keepalived.conf