keepalived及其配置詳解

Keepalived 大致分兩層結構:用戶空間 user space和內核空間 kernel space.圖6-2是來自官方站點(http://www.keepalived.org/software_design.html)關於其結構的展示。2011年04月05日 - herb - herb

在這個結構圖裏,處於下端的是內核空間,它包括ipvs和NETLINK兩個部分。Ipvs的作用在前面的章節已經做過描述,不再重複敘述;netlink提供高級路由及其他相關的網絡功能,如果我們在負載均衡器上啓用netfilter/iptable,將會直接影響它的性能。出於圖形上方的組件爲用戶空間,由它來實現具體的功能,下面選取幾個重要的來做說明:

1、  WatchDog 負責監控checkers和VRRP進程的狀況。

2、  Checkers 負責真實服務器的健康檢查healthchecking,是keepalived最主要的功能。換句話說—可以沒有VRRP Stack,但健康檢查healthchecking是一定要有的。

3、  VRRP Stack負責負載均衡器之間的失敗切換FailOver.如果只用一個負載均衡器,則VRRP不是必須的。

4、  IPVS wrapper 用來發送設定的規則到內核ipvs代碼。

5、 Netlink Reflector 用來設定 vrrp 的vip地址等。

Keepalived各種功能的實現是通過設置其配置文件 keepalived.conf來完成的,關於配置文件各項的用途,將在後面的章節進行描述。

6.2.2 安裝keepalived

安裝keepalived非常的簡單和容易,這跟安裝其他GNU源碼軟件步驟是以模一樣的。下面給出其安裝過程。

1、  下載最新穩定版 wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz

2、  解包  tar zxvf keepalived-1.1.17.tar.gz

3、  切換目錄 cd keepalived-1.1.17

4、  配置 ./configure –prefix=/usr/local/keepalive 因爲keepalived 運行在ipvs之上,因此這兩個軟件一定要安裝在一個系統裏面。如果configure操作能正常進行,運行完畢後將有如下的彙總輸出:

Keepalived configuration————————

Keepalived version       : 1.1.17

Compiler                 : gcc

Compiler flags           : -g -O2

Extra Lib                : -lpopt -lssl -lcrypto

Use IPVS Framework       : Yes

IPVS sync daemon support : Yes

Use VRRP Framework       : Yes

Use LinkWatch            : No

Use Debug flags          : No

5、  編譯和安裝 make ; make install

6.2.3 keepalived 安裝驗證

Keepalived安裝完成後,會在安裝目錄/usr/local/keepalived生成 bin,etc,man,sbin這4個目錄。其中etc爲配置文件所在的目錄,進入這個目錄,看看裏面都有些什麼?

[root@ChinaTelecom-1 etc]# pwd

/usr/local/keepalived/etc

[root@ChinaTelecom-1 etc]# ll

total 12

drwxr-xr-x 3 root root 4096 Apr 23 10:23 keepalived

drwxr-xr-x 3 root root 4096 Apr 23 10:23 rc.d

drwxr-xr-x 2 root root 4096 Apr 23 10:23 sysconfig

還有子目錄,這裏着重關注一下keepalived目錄,它的下面包含一個完整的配置文件keepalived.conf(實際上是一個樣例)以及一些單獨的配置樣例文件。

[root@ChinaTelecom-1 keepalived]# tree -l.

|– keepalived.conf`– samples 

  |– client.pem    |– dh1024.pem

    |– keepalived.conf.HTTP_GET.port

   |– keepalived.conf.SMTP_CHECK

   |– keepalived.conf.SSL_GET 

  |– keepalived.conf.fwmark

   |– keepalived.conf.inhibit

   |– keepalived.conf.misc_check  

|– keepalived.conf.misc_check_arg  

|– keepalived.conf.sample

    |– keepalived.conf.status_code

    |– keepalived.conf.track_interface

    |– keepalived.conf.virtual_server_group

    |– keepalived.conf.virtualhost

    |– keepalived.conf.vrrp

    |– keepalived.conf.vrrp.localcheck

    |– keepalived.conf.vrrp.lvs_syncd

    |– keepalived.conf.vrrp.routes

    |– keepalived.conf.vrrp.scripts

    |– keepalived.conf.vrrp.static_ipaddress

    |– keepalived.conf.vrrp.sync

    |– root.pem

    `– sample.misccheck.smbcheck.sh

值得注意的是,keepalived的啓動過程並不會對配置文件進行語法檢查,就算沒有配置文件,keepalived的守護進程照樣能夠被運行起來。在默認狀態下–即不指定配置文件的位置—keepalived先查找文件 /etc/keepalived/keepalived.conf ,如果爲了省事,可以手動創建這個文件,然後在這個文件裏書寫規則,來達到控制keepalived運行的目的。

這裏我們先來試試默認情況,即沒有配置文件下運行keepalived.運行前先了解一下其語法:

[root@lvs-m keepalived]# keepalived –help

Keepalived v1.1.17 (06/23,2009)

Usage:

  keepalived

  keepalived -n

  keepalived -f keepalived.conf

  keepalived -d

  keepalived -h

  keepalived -v

Commands:

Either long or short options are allowed.

  keepalived –vrrp               -P    Only run with VRRP subsystem.

  keepalived –check              -C    Only run with Health-checker subsystem.

  keepalived –dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.

  keepalived –dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.

  keepalived –dont-fork          -n    Dont fork the daemon process.

  keepalived –use-file           -f    Use the specified configuration file.

                                Default is /etc/keepalived/keepalived.conf.

  keepalived –dump-conf          -d    Dump the configuration data.

  keepalived –log-console        -l    Log message to local console.

  keepalived –log-detail         -D    Detailed log messages.

  keepalived –log-facility       -S    0-7 Set syslog facility to LOG_LOCAL[0-7]. (default=LOG_DAEMON)

  keepalived –help               -h    Display this short inlined help screen.

  keepalived –version            -v    Display the version number

  keepalived –pid                -p    pidfile

  keepalived –checkers_pid       -c    checkers pidfile

  keepalived –vrrp_pid           -r    vrrp pidfile

接下來我們參照這個幫助語法,執行命令 /usr/local/keepalived/sbin/keepalive –D ,然後來檢查keepalived運行後的狀況。

1、  查看進程 ps aux | grep keepalived ,其輸出爲:

[root@lvs-m ~]# ps aux| grep keepalived |grep -v grep

root     21786  0.0  0.0   4840   564 ?        Ss   15:39   0:00 keepalived -D

root     21787  4.8  0.0   4884  1336 ?        S    15:39  23:47 keepalived -D

root     21788  4.9  0.0   4884   904 ?        S    15:39  24:15 keepalived -D

Keepalived正常運行時,共啓動3個進程,其中一個進程是父進程,負責監控其子進程;一個是vrrp子進程;另外一個是checkers子進程。圖6-3 爲keepalived 3個進程之間的關係。

keepalived1

圖6-3 keepalived進程相關性

2、  查看內核模塊,ip_vs 模塊應該被加載到內核空間。 Lsmod | grep ip_vs .

3、  查看系統日誌。因爲我在啓動keepalived是使用了選項 –D ,這將詳細的打印日誌消息。

[root@lvs-m ~]# tail -f /var/log/messages

Jun 27 00:58:05 lvs-m Keepalived: Starting VRRP child process, pid=22017

Jun 27 00:58:05 lvs-m Keepalived_healthcheckers: Netlink reflector reports IP 61.135.20.137 added

Jun 27 00:58:05 lvs-m Keepalived_healthcheckers: Registering Kernel netlink reflector

Jun 27 00:58:05 lvs-m Keepalived_vrrp: Netlink reflector reports IP 61.135.20.137 added

Jun 27 00:58:05 lvs-m Keepalived_healthcheckers: Registering Kernel netlink command channel

Jun 27 00:58:05 lvs-m Keepalived_vrrp: Registering Kernel netlink reflector

Jun 27 00:58:05 lvs-m Keepalived_vrrp: Registering Kernel netlink command channel

Jun 27 00:58:05 lvs-m Keepalived_vrrp: Registering gratutious ARP shared channel

Jun 27 00:58:05 lvs-m Keepalived_healthcheckers: Configuration is using : 2285 Bytes

Jun 27 00:58:05 lvs-m Keepalived_vrrp: Configuration is using : 28803 Bytes

逐項檢查這個輸出,可知圖6-2所示的組件都可以在這裏找到對應的紀錄。從而進一步證實keepalived安裝的正確性。

6.2.4 配置文件keepalived.conf

一個功能比較完整的keepalived的配置文件,其配置文件keepalived.conf可以包含三個文本塊:全局定義塊、VRRP實例定義塊及虛擬服務器定義塊。全局定義塊和虛擬服務器定義塊是必須的,如果在只有一個負載均衡器的場合,就不須VRRP實例定義塊。

接下來,我們以一個配置文件模版爲例,有選擇的說明其中一些重要項的功能或作用。

#全局定義塊

global_defs {

notification_email {

email

email

}

notification_email_from email

smtp_server host

smtp_connect_timeout num

lvs_id string

}

#VRRP實例定義塊

vrrp_sync_group string {

group {

string

string

}

vrrp_instance string {

state MASTER|BACKUP

interface string

mcast_src_ip @IP

lvs_sync_daemon_interface string

virtual_router_id num

priority num

advert_int num

smtp_alert

authentication {

auth_type PASS|AH

auth_pass string

}

virtual_ipaddress { # Block limited to 20 IP addresses

@IP

@IP

@IP

}

virtual_ipaddress_excluded { # Unlimited IP addresses number

@IP

@IP

@IP

}

#虛擬服務器定義塊

virtual_server (@IP PORT)|(fwmark num) {

delay_loop num

lb_algo rr|wrr|lc|wlc|sh|dh|lblc

lb_kind NAT|DR|TUN

(nat_mask @IP)

persistence_timeout num

persistence_granularity @IP

virtualhost string

protocol TCP|UDP

sorry_server @IP PORT

real_server @IP PORT {

weight num

TCP_CHECK {

connect_port num

connect_timeout num

}

}

real_server @IP PORT {

weight num

MISC_CHECK {

misc_path /path_to_script/script.sh

(or misc_path “/path_to_script/script.sh <arg_list>”)

}

}

real_server @IP PORT {

weight num

HTTP_GET|SSL_GET {

url { # You can add multiple url block

path alphanum

digest alphanum

}

connect_port num

connect_timeout num

nb_get_retry num

delay_before_retry num

}

}

}

●     全局定義塊

1、  email通知。作用:有故障,發郵件報警。這是可選項目,建議不用,用nagios全面監控代替之。

2、  Lvs負載均衡器標識(lvs_id)。在一個網絡內,它應該是唯一的。

3、  花括號“{}”。用來分隔定義塊,因此必須成對出現。如果寫漏了,keepalived運行時,不會得到預期的結果。由於定義塊內存在嵌套關係,因此很容易遺漏結尾處的花括號,這點要特別注意。

●     VRRP定義塊

1、  同步vrrp組vrrp_sync_group。作用:確定失敗切換(FailOver)包含的路由實例個數。即在有2個負載均衡器的場景,一旦某個負載均衡器失效,需要自動切換到另外一個負載均衡器的實例是哪些?

2、  實例組group.至少包含一個vrrp實例。

3、  Vrrp實例vrrp_instance.實例名出自實例組group所包含的那些名字。

(1)       實例狀態state.只有MASTER和BACKUP兩種狀態,並且需要大寫這些單詞。其中MASTER爲工作狀態,BACKUP爲備用狀態。當MASTER所在的服務器失效時,BACKUP所在的系統會自動把它的狀態有BACKUP變換成MASTER;當失效的MASTER所在的系統恢復時,BACKUP從MASTER恢復到BACKUP狀態。

(2)       通信接口interface。對外提供服務的網絡接口,如eth0,eth1.當前主流的服務器都有2個或2個以上的接口,在選擇服務接口時,一定要覈實清楚。

(3)       lvs_sync_daemon_inteface。負載均衡器之間的監控接口,類似於HA HeartBeat的心跳線。但它的機制優於Heartbeat,因爲它沒有“裂腦”這個問題,它是以優先級這個機制來規避這個麻煩的。在DR模式中,lvs_sync_daemon_inteface 與服務接口interface 使用同一個網絡接口。

(4)       虛擬路由標識virtual_router_id.這個標識是一個數字,並且同一個vrrp實例使用唯一的標識。即同一個vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同時在整個vrrp內是唯一的。

(5)       優先級priority.這是一個數字,數值愈大,優先級越高。在同一個vrrp_instance裏,MASTER 的優先級高於BACKUP。若MASTER的priority值爲150,那麼BACKUP的priority只能是140或更小的數值。

(6)       同步通知間隔 advert_int .MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位爲秒。

(7)       驗證authentication。包含驗證類型和驗證密碼。類型主要有PASS、AH兩種,通常使用的類型爲PASS,據說AH使用時有問題。驗證密碼爲明文,同一vrrp實例MASTER與BACKUP 使用相同的密碼才能正常通信。

4、  虛擬ip地址virtual_ipaddress . 可以有多個地址,每個地址佔一行,不需要指定子網掩碼。注意:這個ip必須與我們在lvs客戶端設定的vip相一致!

●     虛擬服務器virtual_server定義塊

虛擬服務器定義是keepalived框架最重要的項目了,是keepalived.conf必不可少的部分。

1、  虛擬服務器virtual_server. 這個ip來自於vrrp定義塊的第“4”步,後面一個空格,然後加上端口號。定義一個vip,可以實現多個tcp端口的負載均衡功能。

(1)       delay_loop。健康檢查時間間隔,單位是秒。

(2)       lb_algo. 負載均衡調度算法,互聯網應用常使用wlc或rr。

(3)       lb_kind. 負載均衡轉發規則。一般包括DR,NAT,TUN3種,在我的方案中,都使用DR的方式。

(4)       persistence_timeout.會話保持時間,單位是秒。這個選項對動態網站很有用處:當用戶從遠程用帳號進行登陸網站時,有了這個會話保持功能,就能把用戶的請求轉發給同一個應用服務器。在這裏,我們來做一個假設,假定現在有一個lvs 環境,使用DR轉發模式,真實服務器有3個,負載均衡器不啓用會話保持功能。當用戶第一次訪問的時候,他的訪問請求被負載均衡器轉給某個真實服務器,這樣他看到一個登陸頁面,第一次訪問完畢;接着他在登陸框填寫用戶名和密碼,然後提交;這時候,問題就可能出現了—登陸不能成功。因爲沒有會話保持,負載均衡器可能會把第2次的請求轉發到其他的服務器。

(5)       轉發協議protocol.一般有tcp和udp兩種。實話說,我還沒嘗試過udp協議類的轉發。

2、  真實服務器real_server.也即服務器池。Real_server的值包括ip地址和端口號。多個連續的真實ip,轉發的端口相同,是不是可以以範圍表示?需要進一步實驗。如寫成real_server 61.135.20.1-10 80 .

(1)       權重weight.權重值是一個數字,數值越大,權重越高。使用不同的權重值的目的在於爲不同性能的機器分配不同的負載,性能較好的機器,負載分擔大些;反之,性能差的機器,則分擔較少的負載,這樣就可以合理的利用不同性能的機器資源。(2)       Tcp檢查 tcp_check.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章