天天看點

keepalived

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 ]] &amp;&amp; exit 1 || exit 0"</code>  

<code>   </code><code>#[ -f /etc/keepalived/down ]檢查是否有down這個檔案,如果真傳回1,1代表失敗,如果假傳回0,0代表成功</code>

<code>   </code><code># commadn1 &amp;&amp; command2  隻有在 &amp;&amp; 左邊的指令傳回真(指令傳回值 $? == 0),&amp;&amp; 右邊的指令才會被執行</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>"&lt;/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,如需轉載請自行聯系原作者

上一篇: Squid

繼續閱讀