Keepalived是Linux下一個輕量級別的高可用解決方案。Keepalived起初是爲LVS設計的,專門用來監控集羣系統中各個服務節點的狀態,它根據TCP/IP參考模型的第3、第四層、第五層交換機制檢測每一個服務節點的狀態,若是某個服務器節點出現異常,或者工做出現故障,Keepalived將檢測到,並將出現的故障的服務器節點從集羣系統中剔除,這些工做所有是自動完成的,不須要人工干涉,須要人工完成的只是修復出現故障的服務節點。
後來Keepalived又加入了VRRP的功能,VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)出現的目的是解決靜態路由出現的單點故障問題,經過VRRP能夠實現網絡不間斷穩定運行,實現高可用性,所以Keepalvied 一方面具備服務器狀態檢測和故障隔離功能,另一方面也有HA cluster功能,下面介紹一下VRRP協議實現的過程。java
VRRP能夠將兩臺或者多臺物理路由器設備虛擬成一個虛擬路由,這個虛擬路由器經過虛擬IP(一個或者多個)對外提供服務,而在虛擬路由器內部十多個物理路由器協同工做,同一時間只有一臺物理路由器對外提供服務,這臺物理路由設備被成爲:主路由器(Master角色),通常狀況下Master是由選舉算法產生,它擁有對外服務的虛擬IP,提供各類網絡功能,如:ARP請求,ICMP 數據轉發等,並且其它的物理路由器不擁有對外的虛擬IP,也不提供對外網絡功能,僅僅接收MASTER的VRRP狀態通告信息,這些路由器被統稱爲「BACKUP的角色」,當主路由器失敗時,處於BACKUP角色的備份路由器將從新進行選舉,產生一個新的主路由器進入MASTER角色,繼續提供對外服務,整個切換對用戶來講是徹底透明的。
每一個虛擬路由器都有一個惟一的標識號,稱爲VRID,一個VRID與一組IP地址構成一個虛擬路由器,在VRRP協議中,全部的報文都是經過IP多播(一對多,一個Master對多個Backup)方式發送的,而在一個虛擬路由器中,只有處於Master角色的路由器會一直髮送VRRP數據包,處於BACKUP角色的路由器只會接受Master角色發送過來的報文信息,用來監控Master運行狀態,通常不會發生BACKUP搶佔MASTER的狀況,除非它的優先級更高,而當MASTER不可用時,BACKUP也就沒法收到Master發過來的信息,因而就認定Master出現故障,接着多臺BAKCUP就會進行選舉,優先級最高的BACKUP將稱爲新的MASTER,這種選舉角色切換很是之快,於是保證了服務的持續可用性。linux
直接路由模式比較特別,很難說和什麼方面類似,前NAT和TUN種模式基本上都是工做在網絡層上(三層),而直接路由模式則應該是工做在數據鏈路層上(二層)。其原理 爲,DR和REALSERVER都使用同一個IP對外服務。但只有DR對ARP請求進行響應,全部REALSERVER對自己這個IP的ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求所有定向給DR,而DR收到數據包後根據調度算法,找出對應的REALSERVER,把目的MAC地址改成 REALSERVER的MAC併發給這臺REALSERVER。這時REALSERVER收到這個數據包,則等於直接從客戶端收到這個數據包無異(由於服務器也有對外服務的ip,因此,有了客戶機的ip地址,返回就能夠不通過DR),處理後 直接返回給客戶端。因爲DR要對二層包頭進行改換,因此DR和REALSERVER之間必須在一個廣播域,也能夠簡單的理解爲在同一臺交換機上。web
LVS server1 (Master):192.168.1.135虛擬IP爲:192.168.1.150(Master優先級高會首先得到vip)
LVS server2 ( Slave ) :192.168.1.136虛擬IP爲:192.168.1.150(Master掛了以後slave纔會得到vip)
WEB server1: 192.168.1.138虛擬IP爲192.168.1.150(使用tomcat做爲web容器)
WEB server2; 192.168.1.139虛擬IP爲192.168.1.150 (使用tomcat做爲web容器)算法
注意:全部集羣服務器時間要一致
bootstrap
注意此動做。不然MAKE直接報錯。
若是沒有/2.6.32-279.el6.x86_64 這個目錄,請安裝內核開發包
# yum -y install kernel-devel
# ln -s /usr/src/kernels/2.6.32-279.el6.x86_64/ /usr/src/linux
# tar -xvf ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
#make && make install
# ipvsadm –L
vim
# tar –xvf keepalived-1.2.12.tar.gz
#./configure --sysconf=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.32-279.el6.x86_64/
Keepalived version : 1.2.12
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lssl -lcrypto -lcrypt
Use IPVS Framework : Yes 表示使用ipvs框架,也是表明啓動IPVS功能
IPVS sync daemon support : Yes 表示啓動ipvs的同步功能,--disabled-lvs-sysncd此參數能夠關閉。
IPVS use libnl : No 表示使用新的libn1版本,若是想使用新的版本,須要從新安裝libn1的包
Use VRRP Framework : Yes 表示使用VRRP框架,這個實現keepalived高可用的必須功能
Use VRRP VMAC : Yes 表示使用基礎VMAC接口的xmit VRRP包
SNMP support : No
SHA1 support : No
Use Debug flags : No
# make && make install
# cp /soft/keepalived-1.2.12/bin/keepalived /usr/bin/
ERRR: yum install -y openssl openssl-devel
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
瀏覽器
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1 #郵件服務器
smtp_connect_timeout 30 #郵件超時時間
router_id master
}
vrrp_instance VI_1 { #定義VRR組,
state MASTER #定義爲MASTER主
interface eth0 #對外訪問的網絡接口
virtual_router_id 51 #虛擬路由標識。注意主從要一致,由於是同一個vip,因此id號纔要是一致
priority 100 #主從優先級,主的優先級要高於從。注意是越大優先級越高
advert_int 1 #:廣播週期秒數
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.150 #:虛擬VIP地址,真實環境這裏應該是公網IP
}
}
virtual_server 192.168.1.150 80 { #:虛擬VIP地址 與 端口,DR架構WEB端口和虛擬端口監聽一致。不然將沒法訪問,沒法實現端口映射
delay_loop 6 #健康檢查時間間隔,單位是秒
lb_algo rr #調用算法爲RR
lb_kind DR #調用架構模式爲DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.1.138 80 { #:真實WEB服務器地址與端口
weight 1
TCP_CHECK{
connect_timeout 10 #:鏈接超時爲10秒
nb_get_retry 3
delay_before_retry 8
connect_port 80 #鏈接端口爲80,要和上面的保持一致
}
real_server 192.168.1.139 80 {
weight 1
TCP_CHECK{
connect_timeout 10
nb_get_retry 3
delay_before_retry 8
connect_port 80
}
}
}tomcat
主從配置區別:bash
state BACKUP #狀態改爲BACKUP
priority 90 #優先級要低於主
interface eth0 #網絡接口注意和本機對應,
其它的配置文件內容和主的同樣服務器
#!/bin/bash
# Written by NetSeek
# description: Config realserver lo and apply noarp
WEB_VIP="192.168.1.150" ;只須要改動你設置的vip便可
. /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP
/sbin/route add -host $WEB_VIP dev lo:0
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
sysctl -p > /dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $WEB_VIP >/dev/null 2>&1
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 "RealServer Stoped"
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $WEB_VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $web_VIP`
if [ ! "$islothere" -o ! "isrothere" ]
then
echo "LVS-DR real server Stopped."
else
echo "LVS-DR Running."
fi
;;
*)
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;;
esac
exit 0
# ./ realserver.sh start
# ip add list
有上圖所示的VIP就成功了,VIP綁定在本地迴環接口
# vim /usr/local/tomcat/conf/server.xml
<Connector port="80" protocol="HTTP/1.1" 索搜此項修改默認WEB端口
connectionTimeout="20000" redirectPort="8443" />
<Host name="localhost" appBase="web" 能夠修改域名或者IP,但做代理請保持localhost
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/opt/web"></Context> 新增此項修改WEB的家目錄
[root@slave bin]# ./startup.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
keepalived,lvs是keepalived編譯支持的模塊
在LVS主從服務器上啓動keepalived
# /etc/init.d/keepalived start
在MASTER服務器上會看到VIP,當MASTER掛了以後。VIP將自動切換到SLAVE(從),
# /etc/init.d/keepalived start
有上圖所示的vip表示keepalived啓動VIP生效
是否能夠看到WEBIP
而後經過瀏覽器訪問:http://192.168.1.150 看看是否能夠訪問?
f5不停的刷新,看看是否能訪問不一樣的web頁面?