1. 什麼是Keepalived?
keepalived是一個類似與layer3,4,5交換機制的軟件,也就是我們平時說的第3,4,5層交換.Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後keepalived自動將web服務器加入到服務器集羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器.
2. Keepalived作用
負載均衡方案
高可用性HA
實現對是小機器/服務的故障隔離
負載均衡器間的失敗切換failover,是通過VRRPv2(Virtual Router Redundancy Protocol) stack實現
3. Keepalived體系結構
Keepalived大致分爲兩層結構: 用戶空間(User space)和內核空間(kernel space)
WatchDog 負責監控checkers和VRRP進程的狀況
Checkers 負責真實服務器的健康檢查healthchecking,是Keepalived最主要的功能.換句話說--可以沒有VRRP Stack,但健康檢查healthchecking是一定要有的.
CRRP Stack 負責負載均衡器之間失敗切換FailOver. 如果只用一個負載均衡器,則VRRP不是必須的.
IPVS wrapper 用來發送設定的規則到內核ipvs代碼
Netlink Reflector 用來設定vrrp 的vip地址等
3. Keepalived的安裝
[root@clust1 keepalived-1.2.1]# ln -s /usr/src/kernels/2.6.18-238.el5-i686/ /usr/src/linux
## 否則 Use IPVS Framework : No
[root@clust1 keepalived-1.2.1]# ./configure --prefix=/opt/keepalived121/
[root@clust1 keepalived-1.2.1]# make
[root@clust1 keepalived-1.2.1]# make install
[root@clust1 keepalived-1.2.1]# cd /opt/keepalived121/
# 設置 service 方式啓動服務
[root@clust1 keepalived121]# mkdir /etc/keepalived
[root@clust1 keepalived121]# cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
[root@clust1 keepalived121]# cp etc/sysconfig/keepalived /etc/sysconfig/
[root@clust1 keepalived121]# cp etc/keepalived/keepalived.conf /etc/keepalived/
[root@clust1 keepalived121]# cp sbin/keepalived /usr/sbin/
#啓動進程
[root@clust1 keepalived121]# service keepalived start
Starting keepalived: [ OK ]
[root@clust1 keepalived121]# ps aux | grep keep
root 15417 0.0 0.2 5032 576 ? Ss 19:58 0:00 keepalived -D
root 15418 0.0 0.5 5104 1452 ? S 19:58 0:00 keepalived -D
root 15419 0.0 0.3 5104 972 ? S 19:58 0:00 keepalived -D
Keepalived正常運行時,共啓動3個進程,其中一個進程是父進程,負責監控其子進程,一個是vrrp子進程,另外一個是checkers子進程.
4. Keepalived的配置文件
位置:
[root@clust1 keepalived121]# cat /etc/keepalived/keepalived.conf
Keepalived的所有配置都在一個配置文件裏設置,支持的配置項也比較多,可以分爲三類:
a. 全局配置(Global configuration)
就是對整個Keepalived起作用的配置,不管是否使用LVS
b. VRRPD配置
是Keepalived的核心
c. LVS配置
只在使用Keepalived來配置和管理LVS時需要使用,如果僅使用Keepalived來做HA,LVS的配置完全是不需要的
4.1 全局配置
全局配置包括兩個子配置: 全局定義(global definition), 靜態地址路由(static ipaddress routes)
A: 全局定義主要設置Keepalived的通知機制和標識:
global_defs { notification_email { } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } notification_email : 指定Keepalived在發生事件時,需要發送Email到的對象,可以有多個,每行一個 smtp_* : 指定發送email的smtp服務器 route_id : 運行Keepalived的機器的一個標識 |
B: 靜態地址和路由
所謂靜態,就是說不會隨vrrpd instance的開/關的變化的,VIP就不是static的,會隨着vrrp而添加/刪除,這個配置可以用來給服務器配置靜態的IP地址/路由
靜態地址和路由的配置結構:
static_ipaddress { 192.168.1.1/24 brd + dev eth0 scope global } static_routes { src $SRC_IP to $DST_IP dev $SRC_DEVICE ..... src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE } |
4.2 VRRPD配置
VRRPD的配置也包括兩個部分: VRRP同步組(synchronization group), VRRP實例(VRRP instance)
A: VRRP同步組
如果機器或路由有兩個網段,一個內網一個外網,每個網段開啓一個VRRP實例,假設VRRP配置爲檢查內網,那麼外網出現問題時,VRRPD認爲自己仍然健康,那麼不會發送Master和Backup的切換,sync group就是爲了解決這個問題,可以把兩個實例都放進一個sync group. 這樣group裏任何一個實例出現問題都會發生切換.
VRRP同步組的配置結構:
vrrp_sync_group VG_1 { group { inside_network outside_network } notify_master /path/to/to_master.sh notify_backup /path/to/to_backup.sh notify_fault "/path/fault.sh VG_1" notify /path/to/notify.sh smtp_alert } # notify_master : 指定當切換到master時,執行的腳本,這個腳本可以傳入參數 # smtp_alert : 使用global_defs裏面定義的郵件地址和smtp服務器在切換後發送郵件通知 |
B: VRRP實例
VRRP實例表示在上面開啓了VRRP協議,這個實例說明了VRRP的一些特性.
VRRP實例的配置結構:
vrrp_instance VI_1 { state MASTER # 實例的初始狀態 interface eth0 # 實例綁定的網卡 dont_track_primary # 忽略VRRP的interface錯誤 lvs_sync_daemon_interface eth0 # 綁定eth0作爲lvs同步的 track_interface { # 設置額外的監控,裏面的任意一個出現問題,都會進入fault狀態 eth0 eth1 } mcast_src_ip <IPADDR> # 發送多播包地址,默認使用綁定的網卡 garp_master_delay 10 # 在切換到master狀態後,延遲進行gratuitous ARP請求 virtual_router_id 51 # VRID標記 priority 100 # 高優先級競選爲master,至少高backup 50 advert_int 1 # 檢查間隔 authentication { # 設置驗證 auth_type PASS # 認證方式,支持PASS和AH auth_pass 1111 # 認證的密碼 } virtual_ipaddress { # 虛擬IP # <IPADDR>/<MASK>brd<IPADDR>dev<STRING>scope<SCOPT>label<LABEL> 192.168.200.16 192.168.200.17 192.168.200.18 } } |
C: 檢查服務是否正常配置:
vrrp_script chk_http_port { script "killall -0 httpd" #檢查httpd服務是否正常 # script "/tcp/127.0.0.1/80" interval 1 #檢查時間間隔 } |
使用:
在vrrp_instance裏面
track_script { chk_http_port } |
4.3 LVS配置
LVS的配置有兩個部分: 虛擬主機組(virtual server group), 虛擬主機(virtual server)
A: 虛擬主機組
可選的,目的是爲了讓一臺RealServer上的某個service可以屬於多個virtual server並且只做一次健康檢查
virtual_server_group <STRING> { # VIP port <IPADDR> <PORT> <IPADDR> <PORT> ..... fwmark <INT> } |
B: 虛擬主機 --虛擬服務器定義部分
virtual_server 10.10.10.3 1358 { # 設置虛擬服務器,需要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開 delay_loop 3 # 設置健康檢查時間,單位是秒 lb_algo rr # 設置負載調度算法 lb_kind NAT # 設置LVS實現負載均衡的機制,可以有NAT,TUN和DR三個模式 nat_mask 255.255.255.0 persistence_timeout 50 # 會話保持時間,單位的秒 protocol TCP # 指定轉發協議類型,有tcp和udp兩種 sorry_server <IPADDR> <PORT> # 備機IP端口,所有的real server失效後啓用 # 節點服務器配置部分 real_server 192.168.200.4 1358 { # 配置服務節點,需要指定real server的真實IP地址和端口,ip與端口之間用空格隔開 weight 1 # 配置服務節點的權值,權值大小用數字表示,數字越大,權值越高, # 設置權值的大小可以爲不同性能的服務器分配不同的負載, # 可以對性能高的服務器設置較高的權值,而對性能較低的服務器設置相對較低的權值 # 這樣就合理的利用和分配了系統資源 inhibit_on_failure # 健康檢查失敗後,將weight設置爲0,不從IPVS裏面刪除 TCP_CHECK { # realserver的狀態檢查設置部分,單位是秒 connect_timeout 10 # 10秒無響應超時 nb_get_retry 3 # 重試次數 delay_before_retry 3 # 重試間隔 } HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } |
5. 測試
clust3 -> keepalived.conf
[root@clust3 keepalived-1.2.1]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id Haweb_1 } vrrp_sync_group VGM { group { VI_HA } } vrrp_instance VI_HA { state MASTER interface eth1 lvs_sync_daemon_interface eth1 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.98.155/24 dev eth1 } } |
clust4 -> keepalived.conf
[root@clust4 keepalived-1.2.1]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id Haweb_1 } vrrp_sync_group VGM { group { VI_HA } } vrrp_instance VI_HA { state BACKUP interface eth1 lvs_sync_daemon_interface eth1 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.98.155/24 dev eth1 } } |
# 查看日誌輸出
[root@clust4 keepalived-1.2.1]# tail -f /var/log/messages
# stop master/backup查看IP地址變化
[root@clust4 keepalived-1.2.1]# ip a
# cluster3 -> service keepalived stop
# 瀏覽器輸入 192.168.98.155 看現實的哪臺服務器的頁面內容
# cluster3 -> service keepalived start
# 瀏覽器輸入 192.168.98.155 看現實的哪臺服務器的頁面內容
問題:
1. Keepalived搶佔問題如何優化?
兩臺服務器組成高可用集羣,分別處於Master和Backup狀態,當Master出現故障時由Backup來接管所有任務,那麼當Master恢復時,Master會搶回所有權.雖然是高可用,但是對客戶來說,來回的切換是比較煩惱的事.
解決: 可將兩服務器均設置成backup狀態是因爲 nopreempt(不搶佔)只支持backup模式,而讓那一臺成爲master,這個由優先級priority來決定