負載均衡連載之二

6.2 故障隔離、失敗切換框架keepalived
       作者:田逸([email protected]
Keepalived是運行在lvs之上,它的主要功能是實現真實機的故障隔離及負載均衡器間的失敗切換FailOver.lvs結合keepalived,就實現了3層、4層、5/7層交換的功能,下面摘錄來自官方網站www.keepalived.org的一段描述:
The main goal of the keepalived project is to add a strong & robust keepalive facility to the Linux Virtual Server project. This project is written in C with multilayer TCP/IP stack checks. Keepalived implements a framework based on three family checks : Layer3, Layer4 & Layer5/7. This framework gives the daemon the ability of checking a LVS server pool states. When one of the server of the LVS server pool is down, keepalived informs the linux kernel via a setsockopt call to remove this server entrie from the LVS topology. In addition keepalived implements an independent VRRPv2 stack to handle director failover. So in short keepalived is a userspace daemon for LVS cluster nodes healthchecks and LVS directors failover.
從這段描述中,我們可以得到幾個有用的信息:
1、 keepalived是lvs的擴展項目,因此它們之間具備良好的兼容性。這點應該是keepalived部署比其他類似工具能更簡潔的原因吧!
2、 通過對服務器池對象的健康檢查,實現對失效機器/服務的故障隔離。
3、 負載均衡器之間的失敗切換failover,是通過VRRPv2(Virtual Router Redundancy Protocol) stack實現的。
6.2.1 keepalived 體系結構
Keepalived 大致分兩層結構:用戶空間 user space和內核空間 kernel space.圖6-2是來自官方站點(http://www.keepalived.org/software_design.html)關於其結構的展示。
圖6-2 keepalived 內部結構圖
在這個結構圖裏,處於下端的是內核空間,它包括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源碼軟件步驟是以模一樣的。下面給出其安裝過程。
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個進程之間的關係。
圖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.
關於配置文件的理論我們就先講到這裏。由於應用場景的不同,配置文件也會有很大的差異,在接下來的章節裏,我將以兩個具體的應用來展示keepalived神奇功效。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章