keepalived
keepalived是集群管理中保證集群高可用的一個服務軟件,其功能類似于heartbeat,用來防止單點故障。
keepalived工作原理
keepalived是以VRRP(Virtual Router Redundancy Protocol,即虛擬路由冗余協議)協議為實現基礎的。
虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
keepalived主要有三個模塊,分別是core、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。
keepalived的配置文件
keepalived只有一個配置文件keepalived.conf,里面主要包括以下幾個配置區域,分別是global_defs、(static_ipaddress、static_routes)、vrrp_script、vrrp_instance和virtual_server。
配置前提:
(1) 各節點時間必須同步;
(2) 確保iptables及selinux不會成為阻礙;
配置文件詳解
#全局定義塊
global_defs { # 郵件通知配置
notification_email { # 故障發生時給誰發郵件通知
email1
email2
}
notification_email_from email # 通知郵件從哪個地址發出
smtp_server host ????????# 通知郵件的smtp地址
smtp_connect_timeout num # 連接smtp服務器的超時時間
lvs_id string ????????????????????????# lvs負載均衡器標識,在一個網絡內,它的值應該是唯一的
router_id string ????????????????????????# 標識本節點的字條串,通常為hostname,故障發生時,郵件通知會用到
}
#本節點的IP和路由信息,一般不用配置
static_ipaddress {
? ? 10.210.214.163/24 brd 10.210.214.255 dev eth0
? ? ...
}
static_routes {?
? 10.0.0.0/8 via 10.210.214.1 dev eth0
? ? ...
}
#VRRP健康檢查,當時檢查失敗時會將vrrp_instance的priority減少相應的值?
vrrp_script?check_nginx?{???? ????????????????
????script?"/root/check_nginx.sh"?? #定義監控nginx的腳本
????interval?2???????????????????????????? #監控時間間隔??
????weight?2????????????????????????????? #失敗之后減少2點
}?
#VRRP實例定義塊
#用來定義vrrp_intance組,使得這個組內成員動作一致
vrrp_sync_group string {
group {
string
string
}
notify_master /path/xx.sh #指定當切換到master時,執行的腳本
netify_backup /path/xx.sh #指定當切換到backup時,執行的腳本
notify_fault "path/xx.sh VG_1" #故障時執行的腳本
notify /path/xx.sh?
smtp_alert #使用global_defs中提供的郵件地址和smtp服務器發送郵件通知
}
vrrp_instance string { #vrrp實例名,可以配置多個,至少要需要修改id,即vrrp組名
state MASTER|BACKUP #實例狀態,MASTER 和 BACKUP兩種,全部大寫。搶占模式下,其中MASTER為工作狀態,BACKUP為備用狀態。當MASTER所在的服務器失效時,BACKUP所在的服務會自動把它的狀態由BACKUP切換到MASTER狀態。當失效的MASTER所在的服務恢復時,BACKUP從MASTER恢復到BACKUP狀態,如果設置了nopreempt這個值不起作用,主備考priority決定
virtual_router_id num #vrrp組名,每個節點設置必須一樣,可選擇IP最后一段使用
? interface string #對外提供服務的網卡接口,實例綁定網卡
???????dont_track_primary ??????#忽略vrrp的interface錯誤(默認不設置)
???????? mcast_src_ip @IP ??????#發送多播包的地址,如果不設置默認使用綁定網卡的primary ip
???????? priority num ??????#節點優先級,取值范圍0~254,MASTER比BACKUP高
???????? advert_int num ??????#MASTER與BACKUP節點間同步檢查的時間間隔,單位為秒?
??????nopreempt ???? #禁止搶占服務。MASTER從掛掉到恢復,不再將服務搶占過來
smtp_alert ??????#有故障時是否激活郵件通知?
??????preempt_delay ??????#搶占延時,默認5分鐘
??? ??? debug ??????#debug級別
??????? lvs_sync_daemon_interface string #負載均衡器之間的監控接口,類似于 HA HeartBeat 的心跳線。但它的機制優于 Heartbeat,因為它沒有“裂腦”這個問題,它是以優先級這個機制來規避這個麻煩的。在 DR 模式中,lvs_sync_daemon_inteface與服務接口interface使用同一個網絡接口。一般不調 authentication { ????#驗證類型和驗證密碼,兩節點必須一致。類型有 PASS、AH ,通常使用PASS,據說AH使用時有問題。驗證密碼為明文,同一vrrp 實例使用相同的密碼才能正常通信
auth_type PASS|AH
auth_pass string
}
virtual_ipaddress { ????????????????????????# 虛擬IP地址池,可有多個IP,每個IP占一行,不需要指定子網掩碼。注意:這個IP必須與我們的設定的vip保持一致。
IP
IP
}
}
#虛擬服務器定義塊
virtual_server (IP PORT)|(fwmark num) { 定義一個虛擬服務器,這個ip是virtual_ipaddress中定義的其中一個,后面一個空格,然后加上虛擬服務的端口號
delay_loop num 健康檢查時間間隔,單位:秒
? lb_algo rr|wrr|lc|wlc|sh|dh|lblc 負載均衡調度算法,互聯網應用常用方式為wlc或rr
? lb_kind NAT|DR|TUN 負載均衡轉發規則。DR|NAT|TUN 3種,一般使用路由(DR)
persistence_timeout num http服務會話保持時間,單位:秒
? protocol TCP|UDP 轉發協議,分為TCP和UDP兩種
persistence_granularity <NETMASK> lvs會話保持粒度
??? virtualhost <string> 檢查的web服務器的虛擬主機(host:頭)????
??? sorry_server<IPADDR> <port> 備用機,所有realserver失效后啟用
real_server @IP PORT { 真實服務器IP和端口,可以定義多個
weight num ????????負載權重,值越大,轉發的優先級越高
? notify_down /path/script.sh 服務停止后執行的腳本
TCP_CHECK { ????????TCP服務有效性檢測
? connect_port num 服務健康檢查的端口
nb_get_retry 3 重連次數
??????????? delay_before_retry 3 重連間隔時間
connect_timeout num 服務連接超時時長,單位:秒
? }
HTTP_GET|SSL_GET { ????????HTTP健康檢查
url { 檢查url,可指定多個
path /
??? ???? digest <string> 頁面的MD5值,不能亂寫
??? ???? status_code 200 檢查的返回狀態碼
}
connect_port num 服務健康檢查的端口
connect_timeout num 服務連接超時時長,單位:秒
nb_get_retry num 服務連接失敗重試次數?
delay_before_retry num 重試連接間隔,單位:秒
}
MISC_CHECK{ ????????????MISC健康檢查,調用腳本檢查
??? misc_path <string> | <quoted-string> 外部腳本路徑
??? misc_timeout 腳本執行超時時間
?? misc_dynamic 如設置該項,則退出狀態碼會用來動態調整服務器的權重,返回0 正常,不修改;返回1,檢查失敗,權重改為0;返回2-255,正常,權重設置為:返回狀態碼-2
????}
}
進階:keepalived+LVS
安裝keeplived和lvs
在keeplived中配置虛擬服務器模塊
簡單說一下DR原理: ?假設A為前端負載均衡服務器, B,C為后端真實服務器。 A接收到數據包以后,會把數據包的MAC地址改成B的(根據調度算法,假設發給B服務器),然后把數據包重新發出去,交換機收到數據包根據MAC地址找到B,把數據包交給B。 這時B會收到數據包,同時驗證請求IP地址,由于數據包里的IP地址是給A的,所以正常情況下B會丟棄數據包,為了防止這種情況,需要在B機器的回環網卡上配置A的IP地址。并設置ARP壓制。在真是服務器上運行腳本
#!/bin/bash
#description : start realserver
VIP=192.168.1.110
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
需要修改為你自己的VIP,然后檢查虛擬網卡是否已綁定到回環網卡即可