一、Keepalived的安裝過程
Keepalived的安裝非常簡單,下面通過源碼編譯的方式介紹下Keepalived的安裝過程。首先打開Keepalived的官方網址http://www.keepalived.org,從中可以下載下傳到各種版本的Keepalived,這裡下載下傳的是keepalived-1.2.12.tar.gz。以作業系統環境Centos6.3為例,Keepalived安裝步驟如下:
1
2
3
4
5
6
7
8
9
<code>[root@keepalived-master app]</code><code>#tar zxvf keepalived-1.2.12.tar.gz</code>
<code>[root@keepalived-master app]</code><code>#cd keepalived-1.2.12</code>
<code>[root@keepalived-master keepalived-1.2.12]</code><code>#./configure --sysconf=/etc \</code>
<code>> --with-kernel-</code><code>dir</code><code>=</code><code>/usr/src/kernels/2</code><code>.6.32-431.5.1.el6.x86_64</code>
<code>[root@keepalived-master keepalived-1.2.12]</code><code>#make</code>
<code>[root@keepalived-master keepalived-1.2.12]</code><code>#make install</code>
<code>[root@keepalived-master keepalived-1.2.12]</code><code>#ln -s /usr/local/sbin/keepalived /sbin/</code>
<code>[root@keepalived-master keepalived-1.2.12]</code><code># chkconfig --add keepalived</code>
<code>[root@keepalived-master keepalived-1.2.12]</code><code># chkconfig --level 35 keepalived on</code>
在編譯選項中,“--sysconf”指定了Keepalived配置檔案的安裝路徑,即路徑為/etc/Keepalived/Keepalived.conf;“--with-kernel-dir”是個很重要的參數,但這個參數并不是要把Keepalived編譯進核心,而是指定使用核心源碼中的頭檔案,即include目錄。隻有在使用LVS時,才需要用到“--with-kernel-dir”參數,其他時候是不需要的。
在Keepalived輸出的加載子產品資訊,其中:
Use IPVS Framework表示使用IPVS架構,也就是負載均衡子產品,後面的“Yes”表示啟用IPVS功能。一般在搭建高可用負載均衡叢集時會啟用IPVS功能,如果隻是使用Keepalived的高可用功能,則不需要啟用IPVS子產品,可以在編譯Keepalived時通過“--disable-lvs”關閉IPVS功能。
IPVS sync daemon support表示啟用IPVS的同步功能,此子產品一般和IPVS子產品一起使用,如果需要關閉,可在編譯Keepalived時通過“--disable-lvs-syncd”參數實作。
IPVS use libnl表示使用新版的libnl。libnl是NETLINK的一個實作,如果要使用新版的libnl,需要在系統中安裝libnl和libnl-devel軟體包。
Use VRRP Framework表示使用VRRP架構,這是實作Keepalived高可用功能必需的子產品。
Use VRRP VMAC表示使用基礎VMAC接口的xmit VRRP包,這是Keepalived在1.2.10版本及以後新增的一個功能。
至此,Keepalived的安裝介紹完畢。下面開始進入Keepalived配置的講解。
二、Keepalived的全局配置
在上節安裝Keepalived的過程中,指定了Keepalived配置檔案的路徑為/etc/Keepalived/Keepalived.conf,Keepalived的所有配置均在這個配置檔案中完成。由于Keepalived.conf檔案中可配置的選項比較多,這裡根據配置檔案所實作的功能,将Keepalived配置分為三類,分别是:全局配置(Global Configuration)、VRRPD配置和LVS配置。下面将主要介紹下Keepalived配置檔案中一些常用配置選項的含義和用法。
Keepalived的配置檔案都是以塊(block)的形式組織的,每個塊的内容都包含在{}中,以“#”和“!”開頭的行都是注釋。全局配置就是對整個Keepalived都生效的配置,基本内容如下:
10
11
<code>! Configuration File </code><code>for</code> <code>keepalived</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>notification_email_from Keepalived@localhost</code>
<code> </code><code>smtp_server 192.168.200.1</code>
<code> </code><code>smtp_connect_timeout 30</code>
<code> </code><code>router_id LVS_DEVEL </code>
<code>}</code>
全局配置以“global_defs”作為辨別,在“global_defs”區域内的都是全局配置選項,其中:
notification_email用于設定報警郵件位址,可以設定多個,每行一個。注意,如果要開啟郵件報警,需要開啟本機的Sendmail服務。
notification_email_from用于設定郵件的發送位址。
smtp_server用于設定郵件的smtp server位址。
smtp_connect_timeout用于設定連接配接smtp server的逾時時間。
router_id表示運作Keepalived伺服器的一個辨別,是發郵件時顯示在郵件主題中的資訊。
三、Keepalived的VRRPD配置
VRRPD配置是Keepalived所有配置的核心,主要用來實作Keepalived的高可用功能。從結構上來看,VRRPD配置又可分為VRRP同步組配置和VRRP執行個體配置。
這裡首先介紹同步組實作的主要功能。同步組是相對于多個VRRP執行個體而言的,在多個VRRP執行個體的環境中,每個VRRP執行個體所對應的網絡環境會有所不同,假設一個執行個體處于網段A,另一個執行個體處于網段B,而如果VRRPD隻配置了A網段的檢測,那麼當B網段主機出現故障時,VRRPD會認為自身仍處于正常狀态,進而不會進行主備節點的切換,這樣問題就出現了。同步組就是用來解決這個問題的,将所有VRRP執行個體都加入到同步組中,這樣任何一個執行個體出現問題,都會導緻Keepalived進行主備切換。
下面是兩個同步組的配置樣例:
12
13
14
15
16
<code>vrrp_sync_group G1 {</code>
<code> </code><code>group {</code>
<code> </code><code>VI_1</code>
<code> </code><code>VI_2</code>
<code> </code><code>VI_5</code>
<code> </code><code>}</code>
<code> </code><code>notify_backup </code><code>"/usr/local/bin/vrrp.back arg1 arg2"</code>
<code> </code><code>notify_master </code><code>"/usr/local/bin/vrrp.mast arg1 arg2"</code>
<code> </code><code>notify_fault </code><code>"/usr/local/bin/vrrp.fault arg1 arg2"</code>
<code>vrrp_sync_group G2 {</code>
<code> </code><code>VI_3</code>
<code> </code><code>VI_4</code>
其中,G1同步組包含VI_1、VI_2、VI_5三個VRRP執行個體,G2同步組包含VI_3、VI_4兩個VRRP執行個體。這五個執行個體将在vrrp_instance段進行定義。另外,在vrrp_sync_group段中還出現了notify_master、notify_backup、notify_fault和notify_stop四個選項,這是Keepalived配置中的一個通知機制,也是Keepalived包含的四種狀态。下面介紹每個選項的含義。
notify_master:指定當Keepalived進入Master狀态時要執行的腳本,這個腳本可以是一個狀态報警腳本,也可以是一個服務管理腳本。Keepalived允許腳本傳入參數,是以靈活性很強。
notify_backup:指定當Keepalived進入Backup狀态時要執行的腳本,同理,這個腳本可以是一個狀态報警腳本,也可以是一個服務管理腳本。
notify_fault:指定當Keepalived進入Fault狀态時要執行的腳本,腳本功能與前兩個類似。
notify_stop:指定當Keepalived程式終止時需要執行的腳本。
下面正式進入VRRP執行個體的配置,也就是配置Keepalived的高可用功能。VRRP執行個體段主要用來配置節點角色(主或從)、執行個體綁定的網絡接口、節點間驗證機制、叢集服務IP等。下面是執行個體VI_1的一個配置樣例。
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<code>vrrp_instance VI_1 {</code>
<code> </code><code>state MASTER</code>
<code> </code><code>interface eth0</code>
<code> </code><code>virtual_router_id 51</code>
<code> </code><code>priority 100</code>
<code> </code><code>advert_int 1 </code>
<code> </code><code>mcast_src_ip <IPADDR></code>
<code> </code><code>garp_master_delay 10 </code>
<code> </code>
<code> </code><code>track_interface {</code>
<code>eth0 </code>
<code>eth1</code>
<code> </code><code>authentication {</code>
<code> </code><code>auth_type PASS</code>
<code> </code><code>auth_pass qwaszx</code>
<code> </code><code>}</code>
<code> </code><code>virtual_ipaddress {</code>
<code> </code><code>#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL></code>
<code> </code><code>192.168.200.16</code>
<code> </code><code>192.168.200.17 dev eth1</code>
<code> </code><code>192.168.200.18 dev eth2</code>
<code> </code><code>virtual_routes {</code>
<code>#src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE></code>
<code> </code><code>src 192.168.100.1 to 192.168.109.0</code><code>/24</code> <code>via 192.168.200.254 dev eth1</code>
<code> </code><code>192.168.110.0</code><code>/24</code> <code>via 192.168.200.254 dev eth1</code>
<code> </code><code>192.168.111.0</code><code>/24</code> <code>dev eth2</code>
<code> </code><code>192.168.112.0</code><code>/24</code> <code>via 192.168.100.254</code>
<code> </code><code>192.168.113.0</code><code>/24</code> <code>via 192.168.100.252 or 192.168.100.253</code>
<code>nopreempt </code>
<code>preemtp_delay 300</code>
以上VRRP配置以“vrrp_instance”作為辨別,在這個執行個體中包含了若幹配置選項,分别介紹如下:
vrrp_instance是VRRP執行個體開始的辨別,後跟VRRP執行個體名稱。
state用于指定Keepalived的角色,MASTER表示此主機是主伺服器,BACKUP表示此主機是備用伺服器。
interface用于指定HA監測網絡的接口。
virtual_router_id是虛拟路由辨別,這個辨別是一個數字,同一個vrrp執行個體使用唯一的辨別,即在同一個vrrp_instance下,MASTER和BACKUP必須是一緻的。
priority用于定義節點優先級,數字越大表示節點的優先級就越高。在一個vrrp_instance下,MASTER的優先級必須大于BACKUP的優先級。
advert_int用于設定MASTER與BACKUP主機之間同步檢查的時間間隔,機關是秒。
mcast_src_ip用于設定發送多點傳播包的位址,如果不設定,将使用綁定的網卡所對應的IP位址。
garp_master_delay用于設定在切換到Master狀态後延時進行Gratuitous arp請求的時間。
track_interface用于設定一些額外的網絡監控接口,其中任何一個網絡接口出現故障,Keepalived都會進入FAULT狀态。
authentication用于設定節點間通信驗證類型和密碼,驗證類型主要有PASS和AH兩種,在一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通信。
virtual_ipaddress用于設定虛拟IP位址(VIP),又叫做漂移IP位址。可以設定多個虛拟IP位址,每行一個。之是以稱為漂移IP位址,是因為Keepalived切換到Master狀态時,這個IP位址會自動添加到系統中,而切換到BACKUP狀态時,這些IP又會自動從系統中删除。Keepalived通過“ip address add”指令的形式将VIP添加進系統中。要檢視系統中添加的VIP位址,可以通過“ip add”指令實作。“virtual_ipaddress”段中添加的IP形式可以多種多樣,例如可以寫成 “192.168.16.189/24 dev eth1” 這樣的形式,而Keepalived會使用IP指令“ip addr add 192.168.16.189/24 dev eth1”将IP資訊添加到系統中。是以,這裡的配置規則和IP指令的使用規則是一緻的。
virtual_routes和virtual_ipaddress段一樣,用來設定在切換時添加或删除相關路由資訊。使用方法和例子可以參考上面的示例。通過“ip route”指令可以檢視路由資訊是否添加成功,此外,也可以通過上面介紹的notify_master選項來代替virtual_routes實作相同的功能。
nopreempt設定的是高可用叢集中的不搶占功能。在一個HA Cluster中,如果主節點當機了,備用節點會進行接管,主節點再次正常啟動後一般會自動接管服務。這種來回切換的操作,對于實時性和穩定性要求不高的業務系統來說,還是可以接受的,而對于穩定性和實時性要求很高的業務系統來說,不建議來回切換,畢竟服務的切換存在一定的風險和不穩定性,在這種情況下,就需要設定nopreempt這個選項了。設定nopreempt可以實作主節點故障恢複後不再切回到主節點,讓服務一直在備用節點工作,直到備用節點出現故障才會進行切換。在使用不搶占時,隻能在“state”狀态為“BACKUP”的節點上設定,而且這個節點的優先級必須高于其他節點。
preemtp_delay用于設定搶占的延時時間,機關是秒。有時候系統啟動或重新開機之後網絡需要經過一段時間才能正常工作,在這種情況下進行發生主備切換是沒必要的,此選項就是用來設定這種情況發生的時間間隔。在此時間内發生的故障将不會進行切換,而如果超過“preemtp_delay”指定的時間,并且網絡狀态異常,那麼才開始進行主備切換。
四、Keepalived的LVS配置
由于Keepalived屬于LVS的擴充項目,是以, Keepalived可以與LVS無縫整合,輕松搭建一套高性能的負載均衡叢集系統。下面介紹下Keepalived配置檔案中關于LVS配置段的配置方法。
LVS段的配置以“virtual_server”作為開始辨別,此段内容有兩部分組成,分别是real_server段和健康檢測段。下面是virtual_server段常用選項的一個配置示例:
<code>virtual_server 192.168.12.200 80 { </code>
<code> </code><code>delay_loop 6</code>
<code>lb_algo rr</code>
<code>lb_kind DR </code>
<code>persistence_timeout 50</code>
<code> </code><code>persistence_granularity <NETMASK></code>
<code>protocol TCP</code>
<code>ha_suspend</code>
<code>virtualhost <string></code>
<code>sorry_server <IPADDR> <PORT></code>
下面介紹每個選項的含義。
virtual_server:設定虛拟伺服器的開始,後面跟虛拟IP位址和服務端口,IP與端口之間用空格隔開。
delay_loop:設定健康檢查的時間間隔,機關是秒。
lb_algo:設定負載排程算法,可用的排程算法有rr、wrr、lc、wlc、lblc、sh、dh等,常用的算法有rr和wlc。
lb_kind:設定LVS實作負載均衡的機制,有NAT、TUN和DR三個模式可選。
persistence_timeout:會話保持時間,機關是秒。這個選項對動态網頁是非常有用的,為叢集系統中的session共享提供了一個很好的解決方案。有了這個會話保持功能,使用者的請求會一直分發到某個服務節點,直到超過這個會話的保持時間。需要注意的是,這個會話保持時間是最大無響應逾時時間,也就是說,使用者在操作動态頁面時,如果在50秒内沒有執行任何操作,那麼接下來的操作會被分發到另外的節點,但是如果使用者一直在操作動态頁面,則不受50秒的時間限制。
persistence_granularity:此選項是配合persistence_timeout的,後面跟的值是子網路遮罩,表示持久連接配接的粒度。預設是255.255.255.255,也就是一個單獨的用戶端IP。如果将掩碼修改為255.255.255.0,那麼用戶端IP所在的整個網段的請求都會配置設定到同一個real server上。
protocol:指定轉發協定類型,有TCP和UDP兩種可選。
ha_suspend:節點狀态從Master到Backup切換時,暫不啟用real server節點的健康檢查。
virtualhost:在通過HTTP_GET/ SSL_GET做健康檢測時,指定的Web伺服器的虛拟主機位址。
sorry_server:相當于一個備用節點,在所有real server失效後,這個備用節點會啟用。
下面是real_server段的一個配置示例:
<code>real_server 192.168.12.132 80 {</code>
<code>weight 3</code>
<code>inhibit_on_failure</code>
<code>notify_up <STRING> | <QUOTED-STRING></code>
<code>notify_down <STRING> | <QUOTED-STRING></code>
real_server:是real_server段開始的辨別,用來指定real server節點,後面跟的是real server的真實IP位址和端口,IP與端口之間用空格隔開。
weight:用來配置real server節點的權值。權值大小用數字表示,數字越大,權值越高。設定權值的大小可以為不同性能的伺服器配置設定不同的負載,為性能高的伺服器設定較高的權值,而為性能較低的伺服器設定相對較低的權值,這樣才能合理地利用和配置設定了系統資源。
inhibit_on_failure:表示在檢測到real server節點失效後,把它的“weight”值設定為0,而不是從IPVS中删除。
notify_up:此選項與上面介紹過的notify_maser有相同的功能,後跟一個腳本,表示在檢測到real server節點服務處于UP狀态後執行的腳本。
notify_down:表示在檢測到real server節點服務處于DOWN狀态後執行的腳本。
健康檢測段允許多種檢查方式,常見的有HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK。首先看TCP_CHECK檢測方式示例:
<code>TCP_CHECK {</code>
<code>connect_port 80</code>
<code> </code><code>connect_timeout 3 </code>
<code> </code><code>nb_get_retry 3 </code>
<code> </code><code>delay_before_retry 3 </code>
<code> </code><code>}</code>
下面介紹每個選項的含義介。
connect_port:健康檢查的端口,如果無指定,預設是real_server指定的端口。
connect_timeout:表示無響應逾時時間,機關是秒,這裡是3秒逾時。
nb_get_retry:表示重試次數,這裡是3次。
delay_before_retry:表示重試間隔,這裡是間隔3秒。
下面是HTTP_GET和SSL_GET檢測方式的示例:
<code>HTTP_GET |SSL_GET</code>
<code>{</code>
<code>url { </code>
<code>path </code><code>/index</code><code>.html</code>
<code>digest e6c271eb5f017f280cf97ec2f51b02d3</code>
<code>status_code 200 </code>
<code>bindto 192.168.12.80</code>
<code>connect_timeout 3</code>
<code>nb_get_retry 3 </code>
<code>delay_before_retry 2 </code>
url:用來指定HTTP/SSL檢查的URL資訊,可以指定多個URL。
path:後跟詳細的URL路徑。
digest:SSL檢查後的摘要資訊,這些摘要資訊可以通過genhash指令工具擷取。例如:genhash -s 192.168.12.80 -p 80 -u /index.html。
status_code:指定HTTP檢查傳回正常狀态碼的類型,一般是200。
bindto:表示通過此位址來發送請求對伺服器進行健康檢查。
下面是MISC_CHECK檢測方式的示例:
<code>MISC_CHECK</code>
<code>misc_path </code><code>/usr/local/bin/script</code><code>.sh</code>
<code>misc_timeout 5</code>
<code>! misc_dynamic</code>
MISC健康檢查方式可以通過執行一個外部程式來判斷real server節點的服務狀态,使用非常靈活。以下是常用的幾個選項的含義。
misc_path:用來指定一個外部程式或者一個腳本路徑。
misc_timeout:設定執行腳本的逾時時間。
misc_dynamic:表示是否啟用動态調整real server節點權重,“!misc_dynamic”表示不啟用,相反則表示啟用。在啟用這功能後,Keepalived的healthchecker程序将通過退出狀态碼來動态調整real server節點的“weight”值,如果傳回狀态碼為0,表示健康檢查正常,real server節點權重保持不變;如果傳回狀态碼為1,表示健康檢查失敗,那麼就将real server節點權重設定為0;如果傳回狀态碼為2~255之間任意數值,表示健康檢查正常,但real server節點的權重将被設定為傳回狀态碼減2,例如傳回狀态碼為10,real server節點權重将被設定為8(10-2)。
到這裡為止,Keepalived配置檔案中常用的選項已經介紹完畢,在預設情況下,Keepalived在啟動時會查找/etc/Keepalived/Keepalived.conf配置檔案,如果配置檔案放在其他路徑下,通過“Keepalived -f”參數指定配置檔案的路徑即可。
在配置Keepalived.conf時,需要特别注意配置檔案的文法格式,因為Keepalived在啟動時并不檢測配置檔案的正确性,即使沒有配置檔案,Keepalived也照樣能夠啟動,是以一定要保證配置檔案正确。
本文轉自南非螞蟻51CTO部落格,原文連結:http://blog.51cto.com/ixdba/1650311 ,如需轉載請自行聯系原作者