keepalived主要針對LVS羣聚應用而設計的,提供故障切換和健康檢查功能。在非LVS羣集環境中,也可用來實現多機熱備功能。linux
故障切換:ha fallover功能,實現LB Master和Backup主機之間故障轉移和自動切換nginx
這是針對有兩個負載均衡器Director同時工做而採起的故障轉移措施。當主負載均衡器(MASTER)失效或出現故障時候,備份負載均衡器(BACKUP)將自動接管主負載均衡器的全部工做;一旦主負載均衡器故障修復,主負載均衡器又會接管回它原來處理的工做,而備份負載均衡器會釋放master失效時它接管的工做,這時候二者恢復到以前的角色。算法
健康檢查:rs healthcheck功能。負載均衡按期檢查RS的可用性決定是否給其分發請求。bash
當虛擬服務器中的某一個甚至是幾個真實服務器同時發生故障沒法提供服務時,負載均衡器會自動的將失效的服務器從轉發隊列中清除出去,從而保證用戶的訪問不受影響;當故障的服務器被修復之後,系統又會自動把它加入到轉發隊列,分發請求提供正常服務。服務器
是經過VRRP(虛擬路由器冗餘協議)來實現的。在keepalived Director正常工做時,主Director節點會不斷的向備節點廣播心跳消息,用來告訴備節點本身還活着,當主節點發生故障時,備節點就沒法繼續檢測到主節點的心跳,進而調用自身接管程序,接管主節點的IP資源及服務。而當主節點恢復時,備節點會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的自身的備用角色。負載均衡
1.安裝所必須的軟件包ide
yum install kernel-developenssl-devel popt-devel -y
2.下載keepalived源碼報,編譯安裝oop
wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz tar zxfkeepalived-1.2.2.tar.gz cd keepalived-1.2.2 ./configure --prefix=/--with-kernel-dir=/usr/src/kernels/2.6.* make && make install
編譯參數:測試
--with-kernel-dir=DIR 指定內核文件所在目錄,一般是在/usr/src/kernels/2.2*url
--disable-lvs-syncd do not use LVS synchronization daemon
--disable-lvs do not use the LVS framework
--disable-vrrp do not use the VRRP framework
若只想作keepalived其餘服務(http,db,nginx,haproxy)高可用而不作LVS的高可用時候,可使用上面三個參數進行禁用
keepalivedhi安裝完以後,若安裝路徑不是指定的根路徑,則爲了操做方便,須要把生成的文件拷貝到系統經常使用的目錄中
提示:當執行./configure以後出現下面這種狀況時,表示成功
Keepalived configuration
------------------------
Keepalived version : 1.2.2
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : No #LVS功能
IPVS sync daemon support :No #LVS功能
Use VRRP Framework : Yes #VRRP功能
Use Debug flags : No
因爲本實驗只是測試keepalived雙機熱備,沒裝LVS(ipvsadm),因此會提示NO
若要都爲yes時須要先安裝ipvsadm
下載安裝ipvsadm
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
ln -sfkernels/2.6.32-358.el6.x86_64/ /usr/src/linux
tar zxf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make && make install
! Configuration File forkeepalived
global_defs {
notification_email { #指定郵件的目的地址
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_fromAlexandre.Cassen@firewall.loc
smtp_server 192.168.200.1 #指定smtp服務器地址
smtp_connect_timeout 30
router_id LVS_MASTER #指定本機ID
}
全局定義部分:主要設置keepalived的通知機制和表示
第7--14行是email通知參數。做用:當LVS發生切換或RS等有故障時,就會發郵件報警。
第15行lvs負載均衡的表示(router_id),在一個局域網內,它必須是惟一的
vrrp_instance VI_1 { 定義VRRP熱備實例
state MASTER
interface eth0
virtual_router_id 51 #虛擬路由標識
priority 100 #設置優先級。用於肯定那個是主,備
advert_int 1 #通告間隔描述即心跳
nopreempt #非搶佔(由於默認若是master掛的時候,backup會頂上,當master再好的時候,會再切回去,這樣就會形成兩次斷開,加上nopreempt的時候,及時master又好了,依舊不會切換,可是要注意兩個state 都要是backup)
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #設置虛擬IP相似LVS中的VIP
172.16.254.111
192.168.254.111
}
VRRP定義模塊
第17行爲VRRP實例vrrp_instance。每一個VRRP實例能夠認爲是一個keepalived實例,在配置中能夠存在多個實例
第18行實例狀態,只有MASER和BACKUP兩種狀態,而且須要大寫。
interface 通訊接口,設備對外提供服務的網卡。注意:lvs_sync_daemon_interface是用來設置負載均衡器之間監控的接口。
virtual_router_id這個標識是一個數字,同一個VRRP實例中必須惟一。每一個熱備組中須要保持一致。
配置多實例的時候只須要把第17-32行復制一份,修改VRRP實例名字等
virtual_server 192.168.200.100 80 { #VIP 端口
delay_loop 3 #健康檢查時間間隔
lb_algo rr #lvs調度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind NAT #負載均衡轉發規則NAT|DR|RUN
nat_mask 255.255.255.0 #nat 掩碼
persistence_timeout 50 #會話保持時間
protocol TCP #使用的協議
sorry_server<IPADDR> <port> #備用機,全部realserver失效後啓用
real_server 192.168.201.100 443 { #RIP 端口
weight 1 #默認爲1,0爲失效
inhibit_on_failure #在服務器健康檢查失效時,將其設爲0,而不是直接從ipvs中刪除
notify_up 腳本(絕對路徑) #在檢測到server up後執行腳本
notify_down 腳本(絕對路徑) #在檢測到server down後執行腳本
SSL_GET { #健康檢查的名字
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc #檢查url,能夠指定多個
status_code 200 #檢查的返回狀態碼
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #鏈接超時時間
nb_get_retry 3 #重連次數
delay_before_retry 3 #重連間隔時間
connect_port 80 #健康檢查的端口的端口
}
}
}
1.keepalived啓動
keepalived會自動生成啓動文件,只須要附加執行權限便可
chmod a+x/etc/init.d/keepalived service keepalived start chkconfig keepalived on
2.查看生成的虛擬IP,並測試
主:
[root@master ~]# ip add showdev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:f3:4e:52 brdff:ff:ff:ff:ff:ff
inet 192.168.1.110/24 brd 192.168.1.255scope global eth0
inet 192.168.1.250/32 scope global eth0
inet6 fe80::20c:29ff:fef3:4e52/64 scopelink
valid_lft forever preferred_lft forever
備:
[root@backup ~]# ip add show dev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:15:20:bb brdff:ff:ff:ff:ff:ff
inet 192.168.1.109/24 brd 192.168.1.255scope global eth0
inet 192.168.1.250/32 scope global eth0
inet6 fe80::20c:29ff:fe15:20bb/64 scopelink
valid_lft forever preferred_lft forever
比較能夠看出,如今虛擬ip在主(MASTER)上生成。
如今模擬主的eth0宕機,繼續查看
主:
[root@ master ~]# ifdown eth0
[root@ master ~]# ip add showdev eth0
2: eth0:<BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether 00:0c:29:f3:4e:52brd ff:ff:ff:ff:ff:ff
備:
[root@ backup ~]# ip add show dev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:15:20:bb brdff:ff:ff:ff:ff:ff
inet 192.168.1.109/24 brd 192.168.1.255scope global eth0
inet 192.168.1.250/32 scope global eth0
inet6 fe80::20c:29ff:fe15:20bb/64 scopelink
valid_lft forever preferred_lft forever
而同時去ping虛擬ip,會發現中斷一下以後會繼續能ping通。(下面截圖是在虛擬環境中,因此會有延遲,真實環境會是瞬間就完成切換)
恢復主master
主:
[root@ master ~]# ifup eth0
正在決定 eth0 的 IP 信息...完成。
[root@ master ~]# ip add showdev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:f3:4e:52 brdff:ff:ff:ff:ff:ff
inet 192.168.1.250/32 scope global eth0
inet 192.168.1.110/24 brd 192.168.1.255scope global eth0
inet6 fe80::20c:29ff:fef3:4e52/64 scopelink
valid_lft forever preferred_lft forever
備:
[root@ backup ~]# ip add showdev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:15:20:bb brdff:ff:ff:ff:ff:ff
inet 192.168.1.109/24 brd 192.168.1.255scope global eth0
inet6 fe80::20c:29ff:fe15:20bb/64 scopelink
valid_lft forever preferred_lft forever
會發現,虛擬IP從新回到主上。ping包也是丟了一個後馬上就又通了