Keepalived是一個基於VRRP協議來實現的服務高可用方案,能夠利用其來避免IP單點故障,相似的工具還有heartbeat、 corosync、pacemaker。可是它通常不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一塊兒工做來達到集羣的 高可用。nginx
VRRP全稱 Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。 能夠認爲它是實現路由器高可用的容錯協議,即將N臺提供相同功能的路由器組成一個路由器組(Router Group),這個組裏面有一個master和多個backup,但在外界看來就像一臺同樣,構成虛擬路由器,擁有一個虛擬IP(vip,也就是路由器所 在局域網內其餘機器的默認路由),佔有這個IP的master實際負責ARP相應和轉發IP數據包,組中的其它路由器做爲備份的角色處於待命狀態。 master會發組播消息,當backup在超時時間內收不到vrrp包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個 backup當master,保證路由器的高可用。shell
在VRRP協議實現裏,虛擬路由器使用 00-00-5E-00-01-XX 做爲虛擬MAC地址,XX就是惟一的 VRID (Virtual Router IDentifier),這個地址同一時間只有一個物理路由器佔用。在虛擬路由器裏面的物理路由器組裏面經過多播IP地址 224.0.0.18 來定時發送通告消息。每一個Router都有一個 1-255 之間的優先級別,級別最高的(highest priority)將成爲主控(master)路由器。經過下降master的優先權可讓處於backup狀態的路由器搶佔(pro-empt)主路由 器的狀態,兩個backup優先級相同的IP地址較大者爲master,接管虛擬IP。bash
sudo apt-get install libssl-dev sudo apt-get install openssl sudo apt-get install libpopt-dev
apt-get install keepalived
vi /etc/keppalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { test@example.com } notification_email_from test@example.com smtp_server smtp.example.com smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 weight -5 fall 3 rise 2 } vrrp_instance VI_1 { state MASTER interface eth0 mcast_src_ip 192.168.241.32 virtual_router_id 51 priority 101 advert_int 2 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.241.200 } track_script { check_nginx } }
#只須要改變將主機配置中的3項,以下: state MASTER -> state BACKUP, priority 101 -> priority 100, mcast_src_ip 192.168.241.132 -> mcast_src_ip 192.168.241.133
#!/bin/bash counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ] then /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ] then killall keepalived fi fi
注意:腳本須要添加設置權限,須要執行 chmod +x check_nginx.sh服務器
service keepalived restart/stop/start 重啓/中止/啓動
務都起來以後,在MASTER和BACKUP上分別指向以下命令:負載均衡
ip a
或指定網卡
ip a|grep ens33
備註:就會看到虛擬ip在MASTER上綁定了,而後停掉主機的nginx(# killall nginx),若是nginx沒有故障,keepalived就會嘗試從新啓動nginx服務。若是nginx發生故障,沒法從新啓動,那麼就會自動切換到備機上,若是在用192.168.0.222訪問的話,就會訪問到BACKUP的頁面(用# ip a 命令查看,虛擬ip綁定在BACKUP上)工具
global_defs測試
vrrp_instancegoogle
vrrp_script
告訴 keepalived 在什麼狀況下切換,因此尤其重要。能夠有多個 vrrp_scriptspa
這裏要提示一下script通常有2種寫法:rest
上文 vrrp_script 配置部分,killall -0 nginx屬於第1種狀況,/etc/keepalived/check_nginx.sh屬於第2種狀況(腳本中關閉keepalived)。我的更傾向於經過shell腳本判斷,但有異常時exit 1,正常退出exit 0,而後keepalived根據動態調整的 vrrp_instance 優先級選舉決定是否搶佔VIP:
其餘狀況,本來配置的優先級不變,即配置文件中priority對應的值。
提示:
以上能夠作到利用腳本檢測業務進程的狀態,並動態調整優先級從而實現主備切換。
配置結束
在默認的keepalive.conf裏面還有 virtual_server,real_server 這樣的配置,咱們這用不到,它是爲lvs準備的。 notify 能夠定義在切換成MASTER或BACKUP時執行的腳本,若有需求請自行google。