keepalived工作原理和配置文件說明
keepalived是什麽
keepalived是集群管理中保證集群高可用的一個服務軟件,其功能類似於heartbeat,用來防止單點故障。
keepalived工作原理
keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議。
虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
keepalived主要有三個模塊,分別是core、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。
keepalived的配置文件
keepalived只有一個配置文件keepalived.conf,裏面主要包括以下幾個配置區域,分別是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
global_defs區域
主要是配置故障發生時的通知對象以及機器標識
global_defs {
notification_email {
[email protected].com
[email protected].com
...
}
notification_email_from [email protected].com
smtp_server smtp.abc.com
smtp_connect_timeout 30
enable_traps
router_id host163
}
-
notification_email 故障發生時給誰發郵件通知。
-
notification_email_from 通知郵件從哪個地址發出。
-
smpt_server 通知郵件的smtp地址。
-
smtp_connect_timeout 連接smtp服務器的超時時間。
-
enable_traps 開啟SNMP陷阱(Simple Network Management Protocol)。
-
router_id 標識本節點的字條串,通常為hostname,但不一定非得是hostname。故障發生時,郵件通知會用到。
static_ipaddress和static_routes區域
static_ipaddress和static_routes區域配置的是是本節點的IP和路由信息。如果你的機器上已經配置了IP和路由,那麽這兩個區域可以不用配置。其實,一般情況下你的機器都會有IP地址和路由信息的,因此沒必要再在這兩個區域配置。
static_ipaddress {
10.210.214.163/24 brd 10.210.214.255 dev eth0
...
}
static_routes {
10.0.0.0/8 via 10.210.214.1 dev eth0
...
}
以上分別表示啟動/關閉keepalived時在本機執行的如下命令:
# /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
# /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0
註意: 請忽略這兩個區域,因為我堅信你的機器肯定已經配置了IP和路由。
vrrp_script區域
用來做健康檢查的,當時檢查失敗時會將vrrp_instance
的priority
減少相應的值。
vrrp_script chk_http_port {
script "</dev/tcp/127.0.0.1/80"
interval 1
weight -10
}
以上意思是如果script
中的指令執行失敗,那麽相應的vrrp_instance
的優先級會減少10個點。
vrrp_instance和vrrp_sync_group區域
vrrp_instance用來定義對外提供服務的VIP區域及其相關屬性。
vrrp_rsync_group用來定義vrrp_intance組,使得這個組內成員動作一致。舉個例子來說明一下其功能:
兩個vrrp_instance同屬於一個vrrp_rsync_group,那麽其中一個vrrp_instance發生故障切換時,另一個vrrp_instance也會跟著切換(即使這個instance沒有發生故障)。
vrrp_sync_group VG_1 {
group {
inside_network # name of vrrp_instance (below)
outside_network # One for each moveable IP.
...
}
notify_master /path/to_master.sh
notify_backup /path/to_backup.sh
notify_fault "/path/fault.sh VG_1"
notify /path/notify.sh
smtp_alert
}
vrrp_instance VI_1 {
state MASTER
interface eth0
use_vmac <VMAC_INTERFACE>
dont_track_primary
track_interface {
eth0
eth1
}
mcast_src_ip <IPADDR>
lvs_sync_daemon_interface eth1
garp_master_delay 10
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
10.210.214.253/24 brd 10.210.214.255 dev eth0
192.168.1.11/24 brd 192.168.1.255 dev eth1
}
virtual_routes {
172.16.0.0/12 via 10.210.214.1
192.168.1.0/24 via 192.168.1.1 dev eth1
default via 202.102.152.1
}
track_script {
chk_http_port
}
nopreempt
preempt_delay 300
debug
notify_master <STRING>|<QUOTED-STRING>
notify_backup <STRING>|<QUOTED-STRING>
notify_fault <STRING>|<QUOTED-STRING>
notify <STRING>|<QUOTED-STRING>
smtp_alert
}
-
notify_master/backup/fault 分別表示切換為主/備/出錯時所執行的腳本。
-
notify 表示任何一狀態切換時都會調用該腳本,並且該腳本在以上三個腳本執行完成之後進行調用,keepalived會自動傳遞三個參數($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
-
smtp_alert 表示是否開啟郵件通知(用全局區域的郵件設置來發通知)。
-
state 可以是MASTER或BACKUP,不過當其他節點keepalived啟動時會將priority比較大的節點選舉為MASTER,因此該項其實沒有實質用途。
-
interface 節點固有IP(非VIP)的網卡,用來發VRRP包。
-
use_vmac 是否使用VRRP的虛擬MAC地址。
-
dont_track_primary 忽略VRRP網卡錯誤。(默認未設置)
-
track_interface 監控以下網卡,如果任何一個不通就會切換到FALT狀態。(可選項)
-
mcast_src_ip 修改vrrp組播包的源地址,默認源地址為master的IP。(由於是組播,因此即使修改了源地址,該master還是能收到回應的)
-
lvs_sync_daemon_interface 綁定lvs syncd的網卡。
-
garp_master_delay 當切為主狀態後多久更新ARP緩存,默認5秒。
-
virtual_router_id 取值在0-255之間,用來區分多個instance的VRRP組播。
註意: 同一網段中virtual_router_id的值不能重復,否則會出錯,相關錯誤信息如下。
Keepalived_vrrp[27120]: ip address associated with VRID not present in received packet :
one or more VIP associated with VRID mismatch actual MASTER advert
bogus VRRP packet received on eth1 !!!
receive an invalid ip number count associated with VRID!
VRRP_Instance(xxx) ignoring received advertisment...
可以用這條命令來查看該網絡中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8
-
priority 用來選舉master的,要成為master,那麽這個選項的值最好高於其他機器50個點,該項取值範圍是1-255(在此範圍之外會被識別成默認值100)。
-
advert_int 發VRRP包的時間間隔,即多久進行一次master選舉(可以認為是健康查檢時間間隔)。
-
authentication 認證區域,認證類型有PASS和HA(IPSEC),推薦使用PASS(密碼只識別前8位)。
-
virtual_ipaddress vip,不解釋了。
-
virtual_routes 虛擬路由,當IP漂過來之後需要添加的路由信息。
-
virtual_ipaddress_excluded 發送的VRRP包裏不包含的IP地址,為減少回應VRRP包的個數。在網卡上綁定的IP地址比較多的時候用。
-
nopreempt 允許一個priority比較低的節點作為master,即使有priority更高的節點啟動。
首先nopreemt必須在state為BACKUP的節點上才生效(因為是BACKUP節點決定是否來成為MASTER的),其次要實現類似於關閉auto failback的功能需要將所有節點的state都設置為BACKUP,或者將master節點的priority設置的比BACKUP低。我個人推薦使用將所有節點的state都設置成BACKUP並且都加上nopreempt選項,這樣就完成了關於autofailback功能,當想手動將某節點切換為MASTER時只需去掉該節點的nopreempt選項並且將priority改的比其他節點大,然後重新加載配置文件即可(等MASTER切過來之後再將配置文件改回去再reload一下)。
當使用track_script
時可以不用加nopreempt
,只需要加上preempt_delay 5
,這裏的間隔時間要大於vrrp_script
中定義的時長。
- preempt_delay master啟動多久之後進行接管資源(VIP/Route信息等),並提是沒有
nopreempt
選項。
virtual_server_group和virtual_server區域
virtual_server_group一般在超大型的LVS中用到,一般LVS用不過這東西,因此不多說。
virtual_server IP Port {
delay_loop <INT>
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
lb_kind NAT|DR|TUN
persistence_timeout <INT>
persistence_granularity <NETMASK>
protocol TCP
ha_suspend
virtualhost <STRING>
alpha
omega
quorum <INT>
hysteresis <INT>
quorum_up <STRING>|<QUOTED-STRING>
quorum_down <STRING>|<QUOTED-STRING>
sorry_server <IPADDR> <PORT>
real_server <IPADDR> <PORT> {
weight <INT>
inhibit_on_failure
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
HTTP_GET|SSL_GET {
url {
path <STRING>
# Digest computed with genhash
digest <STRING>
status_code <INT>
}
connect_port <PORT>
connect_timeout <INT>
nb_get_retry <INT>
delay_before_retry <INT>
}
}
}
-
delay_loop 延遲輪詢時間(單位秒)。
-
lb_algo 後端調試算法(load balancing algorithm)。
-
lb_kind LVS調度類型NAT/DR/TUN。
-
virtualhost 用來給HTTP_GET和SSL_GET配置請求header的。
-
sorry_server 當所有real server宕掉時,sorry server頂替。
-
real_server 真正提供服務的服務器。
-
weight 權重。
-
notify_up/down 當real server宕掉或啟動時執行的腳本。
-
健康檢查的方式,N多種方式。
-
path 請求real serserver上的路徑。
-
digest/status_code 分別表示用genhash算出的結果和http狀態碼。
-
connect_port 健康檢查,如果端口通則認為服務器正常。
-
connect_timeout,nb_get_retry,delay_before_retry分別表示超時時長、重試次數,下次重試的時間延遲。
其他選項暫時不作說明。
keepalived主從切換
主從切換比較讓人蛋疼,需要將backup配置文件的priority選項的值調整的比master高50個點,然後reload配置文件就可以切換了。當時你也可以將master的keepalived停止,這樣也可以進行主從切換。
keepalived工作原理和配置文件說明