keepalived介紹:
Keepalived的作用是檢測伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived将檢測到,并将有故障的伺服器從系統中剔除,同時使用其他伺服器代替該伺服器的工作,當伺服器工作正常後Keepalived自動将伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的伺服器。
keepalived最初的目的是為ipvs提供高可用。
keepalived的核心:
vrrp的實作:
virtual server
vrrp_script
keepalived工作原理
keepalived主要有三個子產品,分别是core、check和vrrp。core子產品為keepalived的核心,負責主程序的啟動、維護以及全局配置檔案的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp子產品是來實作VRRP協定的。
keepalived隻有一個配置檔案keepalived.conf,裡面主要包括以下幾個配置區域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
keepalived配置檔案樣例:
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
28
29
30
31
32
33
34
35
36
37
38
39
<code>! Configuration File </code><code>for</code> <code>keepalived </code>
<code>global_defs { </code>
<code> </code><code>notification_email { </code>
<code> </code><code>root@localhost</code>
<code> </code><code>} </code>
<code> </code><code>notification_email_from [email protected]</code>
<code> </code><code>smtp_connect_timeout 3 </code>
<code> </code><code>smtp_server 127.0.0.1 </code>
<code> </code><code>router_id LVS_DEVEL </code>
<code>} </code>
<code>vrrp_script chk_mantaince_down {</code>
<code> </code><code>script </code><code>"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"</code>
<code> </code><code>#[ -f /etc/keepalived/down ]檢查是否有down這個檔案,如果真傳回1,1代表失敗,如果假傳回0,0代表成功</code>
<code> </code><code># commadn1 && command2 隻有在 && 左邊的指令傳回真(指令傳回值 $? == 0),&& 右邊的指令才會被執行</code>
<code> </code><code># commadn1 || command2 隻有在 || 左邊的指令傳回假(指令傳回值 $? == 1),|| 右邊的指令才會被執行。</code>
<code> </code><code>interval 1</code>
<code> </code><code>weight -2</code>
<code> </code><code>#隻要上面exit 1,weight就-2,下面的101 -2 = 99 #BACKUP的100少了,優先級低了,就變成備用狀态,再次檢測如果down沒了,權重又成101了,就又變成MASTER了。這樣就可以手動幹預vip在節點間切換</code>
<code>}</code>
<code>vrrp_instance VI_1 { </code>
<code> </code><code>interface eth0 </code>
<code> </code><code>state MASTER </code><code># BACKUP for slave routers</code>
<code> </code><code>priority 101 </code><code># 100 for BACKUP</code>
<code> </code><code>virtual_router_id 51 </code>
<code> </code><code>garp_master_delay 1 </code>
<code> </code><code>authentication { </code>
<code> </code><code>auth_type PASS </code>
<code> </code><code>auth_pass password </code>
<code> </code><code>} </code>
<code> </code><code>track_interface { </code>
<code> </code><code>eth0 </code>
<code> </code><code>virtual_ipaddress { </code>
<code> </code><code>192.168.255.100</code><code>/24</code>
<code> </code><code>track_script { </code>
<code> </code><code>chk_mantaince_down</code>
<code> </code><code>}</code>
主要是配置故障發生時的通知對象以及機器辨別
<code>global_defs {</code>
<code> </code><code>notification_email {</code>
<code> </code><code>[email protected]</code>
<code> </code><code>[email protected]</code>
<code> </code><code>...</code>
<code> </code><code>}</code>
<code> </code><code>notification_email_from [email protected]</code>
<code> </code><code>smtp_server smtp.abc.com</code>
<code> </code><code>smtp_connect_timeout 30</code>
<code> </code><code>enable_traps</code>
<code> </code><code>router_id host163</code>
notification_email 故障發生時給誰發郵件通知。
notification_email_from 通知郵件從哪個位址發出。
smpt_server 通知郵件的smtp位址。
smtp_connect_timeout 連接配接smtp伺服器的逾時時間。
router_id 辨別本節點的字條串,通常為hostname,但不一定非得是hostname。故障發生時,郵件通知會用到。
static_ipaddress和static_routes區域配置的是是本節點的IP和路由資訊。如果你的機器上已經配置了IP和路由,那麼這兩個區域可以不用配置。其實,一般情況下你的機器都會有IP位址和路由資訊的,是以沒必要再在這兩個區域配置。
<code>static_ipaddress {</code>
<code> </code><code>10.210.214.163</code><code>/24</code> <code>brd 10.210.214.255 dev eth0</code>
<code> </code><code>...</code>
<code>static_routes {</code>
<code> </code><code>10.0.0.0</code><code>/8</code> <code>via 10.210.214.1 dev eth0</code>
以上分别表示啟動/關閉keepalived時在本機執行的如下指令:
<code># /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0</code>
<code># /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0</code>
<code># /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0</code>
<code># /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0</code>
注意: 請忽略這兩個區域,因為我堅信你的機器肯定已經配置了IP和路由。
用來做健康檢查的,當時檢查失敗時會将<code>vrrp_instance</code>的<code>priority</code>減少相應的值。
<code>vrrp_script chk_http_port {</code>
<code> </code><code>script </code><code>"</dev/tcp/127.0.0.1/80"</code>
<code> </code><code>interval 1</code>
<code> </code><code>weight -10</code>
以上意思是如果<code>script</code>中的指令執行失敗,那麼相應的<code>vrrp_instance</code>的優先級會減少10個點。
vrrp_instance用來定義對外提供服務的VIP區域及其相關屬性。
vrrp_rsync_group用來定義vrrp_intance組,使得這個組内成員動作一緻。舉個例子來說明一下其功能:
兩個vrrp_instance同屬于一個vrrp_rsync_group,那麼其中一個vrrp_instance發生故障切換時,另一個vrrp_instance也會跟着切換(即使這個instance沒有發生故障)。
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<code>vrrp_sync_group VG_1 {</code>
<code> </code><code>group {</code>
<code> </code><code>inside_network </code><code># name of vrrp_instance (below)</code>
<code> </code><code>outside_network </code><code># One for each moveable IP.</code>
<code> </code><code>notify_master </code><code>/path/to_master</code><code>.sh</code>
<code> </code><code>notify_backup </code><code>/path/to_backup</code><code>.sh</code>
<code> </code><code>notify_fault </code><code>"/path/fault.sh VG_1"</code>
<code> </code><code>notify </code><code>/path/notify</code><code>.sh</code>
<code> </code><code>smtp_alert</code>
<code>vrrp_instance VI_1 {</code>
<code> </code><code>state MASTER</code>
<code> </code><code>interface eth0</code>
<code> </code><code>use_vmac</code>
<code> </code><code>dont_track_primary</code>
<code> </code><code>track_interface {</code>
<code> </code><code>eth0</code>
<code> </code><code>eth1</code>
<code> </code><code>mcast_src_ip</code>
<code> </code><code>lvs_sync_daemon_interface eth1</code>
<code> </code><code>garp_master_delay 10</code>
<code> </code><code>virtual_router_id 1</code>
<code> </code><code>priority 100</code>
<code> </code><code>advert_int 1</code>
<code> </code><code>authentication {</code>
<code> </code><code>auth_type PASS</code>
<code> </code><code>auth_pass 12345678</code>
<code> </code><code>virtual_ipaddress {</code>
<code> </code><code>10.210.214.253</code><code>/24</code> <code>brd 10.210.214.255 dev eth0</code>
<code> </code><code>192.168.1.11</code><code>/24</code> <code>brd 192.168.1.255 dev eth1</code>
<code> </code><code>virtual_routes {</code>
<code> </code><code>172.16.0.0</code><code>/12</code> <code>via 10.210.214.1</code>
<code> </code><code>192.168.1.0</code><code>/24</code> <code>via 192.168.1.1 dev eth1</code>
<code> </code><code>default via 202.102.152.1</code>
<code> </code><code>track_script {</code>
<code> </code><code>chk_http_port</code>
<code> </code><code>nopreempt</code>
<code> </code><code>preempt_delay 300</code>
<code> </code><code>debug</code>
<code> </code><code>notify_master</code>
<code>|</code>
<code> </code><code>notify_backup</code>
<code> </code><code>notify_fault</code>
<code> </code><code>notify</code>
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的值不能重複,否則會出錯,相關錯誤資訊如下。
<code>Keepalived_vrrp[27120]: ip address associated with VRID not present </code><code>in</code> <code>received packet :</code>
<code>one or </code><code>more</code> <code>VIP associated with VRID mismatch actual MASTER advert</code>
<code>bogus VRRP packet received on eth1 !!!</code>
<code>receive an invalid ip number count associated with VRID!</code>
<code>VRRP_Instance(xxx) ignoring received advertisment...</code>
可以用這條指令來檢視該網絡中所存在的vrid:<code>tcpdump -nn -i any net 224.0.0.0/8</code>
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一下)。
當使用<code>track_script</code>時可以不用加<code>nopreempt</code>,隻需要加上<code>preempt_delay 5</code>,這裡的間隔時間要大于<code>vrrp_script</code>中定義的時長。
preempt_delay master啟動多久之後進行接管資源(VIP/Route資訊等),并提是沒有<code>nopreempt</code>選項。
virtual_server_group一般在超大型的LVS中用到,一般LVS用不到這東西,是以不多說。
<code>virtual_server IP Port {</code>
<code> </code><code>delay_loop</code>
<code> </code><code>lb_algo rr|wrr|lc|wlc|lblc|sh|dh</code>
<code> </code><code>lb_kind NAT|DR|TUN</code>
<code> </code><code>persistence_timeout</code>
<code> </code><code>persistence_granularity</code>
<code> </code><code>protocol TCP</code>
<code> </code><code>ha_suspend</code>
<code> </code><code>virtualhost</code>
<code> </code><code>alpha</code>
<code> </code><code>omega</code>
<code> </code><code>quorum</code>
<code> </code><code>hysteresis</code>
<code> </code><code>quorum_up</code>
<code> </code><code>quorum_down</code>
<code> </code><code>sorry_server</code>
<code> </code><code>real_server</code>
<code>{</code>
<code> </code><code>weight</code>
<code> </code><code>inhibit_on_failure</code>
<code> </code><code>notify_up</code>
<code> </code><code>notify_down</code>
<code> </code><code># HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK</code>
<code> </code><code>HTTP_GET|SSL_GET {</code>
<code> </code><code>url {</code>
<code> </code><code>path</code>
<code> </code><code># Digest computed with genhash</code>
<code> </code><code>digest</code>
<code> </code><code>status_code</code>
<code> </code><code>}</code>
<code> </code><code>connect_port</code>
<code> </code><code>connect_timeout</code>
<code> </code><code>nb_get_retry</code>
<code> </code><code>delay_before_retry</code>
<code> </code><code>}</code>
delay_loop 延遲輪詢時間(機關秒)。
lb_algo 後端調試算法(load balancing algorithm)。
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采用VRRP(virtual router redundancy protocol),虛拟路由備援協定,以軟體的形式實作伺服器熱備功能。通常情況下是将兩台linux伺服器組成一個熱備組(master-backup),同一時間熱備組内隻有一台主伺服器(master)提供服務,同時master會虛拟出一個共用IP位址(VIP),這個VIP隻存在master上并對外提供服務。如果keepalived檢測到master當機或服務故障,備伺服器(backup)會自動接管VIP成為master,keepalived并将master從熱備組移除,當master恢複後,會自動加入到熱備組,預設再搶占成為master,起到故障轉移功能
Keepalive要考慮的問題?
1、如何在狀态轉換時進行通知?
通知的指令可以用在vrrp_sync_group中,也可以用在vrrp_instance中
#####1.使用:
notify_master
notify_backup
notify_fault
可以使用在vrrp_sync_group和vrrp_instance中,較多使用在vrrp_instance中
如果腳本帶有參數,需要用引号“”引起來:notify_fault “/path/fault.sh VG_1”
當發生狀态切換時,會根據切換的狀态配置設定調用MASTER BACKUP FAULT指定的腳本
#####2.使用:
notify進行通知,notify可以使用在vrrp_sync_group和vrrp_instance中
此時腳本需要接受三個參數:
1指明組vrrpsyncgroup或執行個體vrrpinstance2 組或instance名
$3 “MASTER”|”BACKUP”|”FAULT”
2、如何配置LVS?
virtual server配置?
realserver配置?
health_check?
3、如何對某特定服務做高可用?
4、如何實作基于多虛拟路由的master/master模型?
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1864514,如需轉載請自行聯系原作者