一、高可用原理
1、VRRP是什麼
keepalived主要使用的是VRRP功能,VRRP(VritrualRouterRedundancyProtocol,虛擬路由冗餘協議)出現的目的就是解決靜態路由出現的單點故障問題。
健康檢查和失敗切換是keepalived的兩大核心功能。所謂的健康檢查,就是採用tcp三次握手,icmp請求,http請求,udp echo請求等方式對負載均衡器後面的實際的服務器(通常是承載真實業務的服務器)進行保活;而失敗切換主要是應用於配置了主備模式的負載均衡器,利用VRRP維持主備負載均衡器的心跳,當主負載均衡器出現問題時,由備負載均衡器承載對應的業務,從而在最大限度上減少流量損失,並提供服務的穩定性。
2、VRRP選舉機制
VRRP路由器在運行過程中有三種狀態:
1. Initialize狀態: 系統啓動後就進入Initialize,此狀態下路由器不對VRRP報文做任何處理;
2. Master狀態;
3. Backup狀態;
一般主路由器處於Master狀態,備份路由器處於Backup狀態。
VRRP使用選舉機制來確定路由器的狀態,優先級選舉:
1.VRRP組中IP擁有者。如果虛擬IP地址與VRRP組中的某臺VRRP路由器IP地址相同,則此路由器爲IP地址擁有者,這臺路由器將被定位主路由器。
2.比較優先級。如果沒有IP地址擁有者,則比較路由器的優先級,優先級的範圍是0~255,優先級大的作爲主路由器
3.比較IP地址。在沒有Ip地址擁有者和優先級相同的情況下,IP地址大的作爲主路由器。
如下圖所示,虛擬IP爲10.1.1.254,在VRRP組中沒有IP地址擁有者,則比較優先級,很明顯RB和RA的優先級要大於RC,則比較RA和RB的IP地址,RB的IP地址大。所以RB爲組中的主路由器。
路由器使用VRRP 功能後,會根據優先級確定自己在備份組中的角色。優先級高的路由器成爲Master 路由器,優先級低的成爲Backup 路由器。Master 擁有對外服務的虛擬IP,提供各種網絡功能,並定期發送VRRP 報文,通知備份組內的其他設備自己工作正常;Backup 路由器只接收Master 發來的報文信息,用來監控Master 的運行狀態。當Master 失效時,Backup 路由器進行選舉,優先級高的Backup 將成爲新的Master 。
在搶佔方式下,當Backup 路由器收到VRRP 報文後,會將自己的優先級與報文中的優先級進行比較。如果大於通告報文中的優先級,則成爲Master 路由器;否則將保持Backup狀態;
在非搶佔方式下,只要Master 路由器沒有出現故障,備份組中的路由器始終保持Master 或Backup 狀態,Backup 路由器即使隨後被配置了更高的優先級也不會成爲Master 路由器;
如果Backup 路由器的定時器超時後仍未收到Master 路由器發送來的VRRP報文,則認爲Master 路由器已經無法正常工作,此時Backup 路由器會認爲自己是Master 路由器,並對外發送VRRP報文。備份組內的路由器根據優先級選舉出Master 路由 器,承擔報文的轉發功能。
二、安裝
1、環境
vip:192.168.0.16
server1:192.168.1.60
server2:192.168.1.65
centos 7
2、兩臺機器都安裝keepalived
# cd /usr/local/src
# tar -zxvf keepalived-1.4.5.tar.gz
# cd keepalived-1.4.5
# ./configure --prefix=/usr/local/keepalived
# make && make install
拷貝文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ #這個文件可能沒有,需要手動創建
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
這個文件可能沒有,需要手動創建,/usr/local/keepalived/etc/rc.d/init.d/keepalived ,內容:
#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: - 21 79
# description: Start and stop Keepalived
# Source function library
. /etc/rc.d/init.d/functions
# Source configuration file (we set KEEPALIVED_OPTIONS there)
. /etc/sysconfig/keepalived
RETVAL=0
prog="keepalived"
start() {
echo -n $"Starting $prog: "
daemon keepalived ${KEEPALIVED_OPTIONS}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}
stop() {
echo -n $"Stopping $prog: "
killproc keepalived
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
}
reload() {
echo -n $"Reloading $prog: "
killproc keepalived -1
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
fi
;;
status)
status keepalived
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
RETVAL=1
esac
exit $RETVAL
chkconfig keepalived on #開機啓動
三、配置
1、配置server1(主)
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id master #是運行keepalived的一個表示,多個集羣設置不同。
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER #指定實例初始狀態,實際的MASTER和BACKUP是選舉決定的。
interface em1 # 綁定虛擬 IP 的網絡接口,ifconfig 查看IP對應的網卡
virtual_router_id 51 #設置VRID標記,多個集羣不能重複(0..255)
mcast_src_ip 192.168.1.60 #localIP,可以不要該屬性
priority 100 #設置優先級,優先級高的會被競選爲Master,Master要高於BACKUP,至少50
nopreempt #設置爲不搶佔,說明:這個配置只能在BACKUP主機上面設置
advert_int 1 #檢查的時間間隔,默認1s
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress { #設置VIP,可以設置多個,用於切換時的地址綁定。
10.1.125.244 #vip
}
}
2、配置server2(備機)
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id slave
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface em1
virtual_router_id 51
mcast_src_ip 192.168.1.65
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.1.16
}
}
vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
授權
# chmod +x /etc/keepalived/nginx_check.sh
兩臺機器都添加vrrp協議到防火牆,vi /etc/sysconfig/iptables
service iptables restart 重啓防火牆。
四、測試
我這裏只做keepalived測試,nginx的測試大家自行處理。
1、啓動
service keepalived start
2、通過 ip a 查看是不是隻有一個臺機器綁定的vip,正常應該只有一個臺機器有vip,如下圖192.168.1.60,
3、停掉主 keepalived,備機自動切換爲master,備機日誌:
4、啓動主機得keepalived,會自動搶佔爲master,備機日誌如下:
tail -200 /var/log/messages
這個架構nginx+keepalived方案的缺點:
只有一臺服務器對外提供服務,使用率是50%。可以採用雙nginx對外提供服務的架構方案,提高服務的使用率。
五、注意
1、當主機服務恢復後,vip的master會自動切回到主機。
2、查看keepalived日誌
tail -f /var/log/messages
3、如果主備發生網絡不通分區的情況,可能讓keepalived集羣發生腦裂的情況,導致兩臺機器搶佔vip。比如當防火牆隔離了keepalived的通訊端口112。