Keepalived軟件起初是專門爲LVS負載均衡軟件設計的用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了能夠實現高可用的VRRP功能。所以,Keepalived除了可以管理LVS軟件外,還能夠做爲其餘服務的高可用解決方案軟件。ios
Keepalived軟件主要是經過VRRP協議實現高可用功能的,VRRP是Virtual Router Redundancy Protocol(虛擬路由器冗餘協議)的縮寫.VRRP出現的目的就是爲了解決靜態路由單點故障問題的nginx
1.master在工做狀態會不斷羣發一個廣播包(內涵優先參數)算法
2.其餘路由收到收到廣播後會和本身的優先參數做對比,若是優先參數小於本身則什麼都不執行,若是優先參數大於本身則開啓爭搶機制vim
3.若是啓動了爭搶機制,他就會羣發本身的優先參數,最終優先參數最小的稱爲master路由.bash
core核心模塊 chech健康監測 vrrp虛擬路由冗餘協議服務器
1.管理LVS 2.對LVS集羣節點檢查 3.做爲系統網絡服務的高可用功能網絡
#其中3高可用可做爲任意網絡功能負載均衡
Keepalived高可用故障切換,是經過VRRP虛擬路由器冗餘協議來實現的。 ssh
在Keepalived服務正常工做時,主Master節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備Backup節點本身還活着,當主Master節點發生故障時,就沒法發送心跳消息,備節點沒法檢測到來自主Master節點心跳了,因而調用自身的接管程序,接管主Master節點的IP資源及服務。而當主Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。oop
yum -y install keepalived #安裝keepalived vim /etc/keepalived/keepalived.conf #修改主keepalived配置文件 yum -y install openssh-clients #安裝scp scp /etc/keepalived/keepalived.conf root@192.168.50.149:/etc/keepalived/ #發從給從 /etc/init.d/keepalived start #啓動keepalived
! 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.50.1 #設置smtp server地址 smtp_connect_timeout 30 #設置smtp超時鏈接時間 以上參數能夠不配置 router_id LVS_DEVEL #是Keepalived服務器的路由標識在一個局域網內,這個標識(router_id)是惟一的 } vrrp_instance VI_1 { #VRRP實例定義區塊名字是VI_1 state MASTER #表示當前實例VI_1的角色狀態這個狀態只能有MASTER和BACKUP兩種狀態,而且須要大寫這些字符ASTER爲正式工做的狀態,BACKUP爲備用的狀態 interface eth0 virtual_router_id 51 #虛擬路由ID標識,這個標識最好是一個數字,在一個keepalived.conf配置中是惟一的, MASTER和BACKUP配置中相同實例的virtual_router_id必須是一致的. priority 100 #priority爲優先級 越大越優先 advert_int 1 #爲同步通知間隔。MASTER與BACKUP之間通訊檢查的時間間隔,單位爲秒,默認爲1. authentication { #authentication爲權限認證配置不要改動,同一vrrp實例的MASTER與BACKUP使用相同的密碼才能正常通訊。 auth_type PASS auth_pass 1111 } virtual_ipaddress { #設置虛擬IP地址 192.168.50.16 #此格式ip a顯示 ifconfig不顯示 192.168.50.17/24 dev eth0 label eth0:1 #綁定接口爲eth0,別名爲eth0:1 } #至此爲止以上爲實現高可用配置,如只需使用高可用功能下邊配置可刪除 #如下爲虛擬服務器定義部分 virtual_server 192.168.50.16 80 { #設置虛擬服務器,指定虛擬IP和端口 delay_loop 6 #健康檢查時間爲6秒 lb_algo rr #設置負載調度算法 rr算法 lb_kind NAT #設置負載均衡機制 #有NAT,TUN和DR三種模式可選 nat_mask 255.255.255.0 #非NAT模式註釋掉此行 註釋用!號 persistence_timeout 50 #鏈接保留時間,50秒無響應則從新分配節點 protocol TCP #指定轉發協議爲TCP real_server 192.168.5.150 80 { #RS節點1 weight 1 #權重 TCP_CHECK { #節點健康檢查 connect_timeout 8 #延遲超時時間 nb_get_retry 3 #重試次數 delay_before_retry 3 #延遲重試次數 connect_port 80 #利用80端口檢查 } } real_server 192.168.50.149 80 { #RS節點2 weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
配置完畢後啓動keepalived 並檢測是否有虛擬端口
/etc/init.d/keepalived start ip a | grep 192.168.50.16 #出現上述帶有vip:192.168.50.16行的結果表示lb01的Keepalived服務單實例配置成功
! Configuration File for keepalived global_defs { notification_email { 215379068@qq.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 #此參數和lb01 MASTER不一樣 } vrrp_instance VI_1 { #和lb01 MASTER相同 state BACKUP #此參數和lb01 MASTER不一樣 interface eth0 #和lb01 MASTER相同 virtual_router_id 55 #和lb01 MASTER相同 priority 90 #此參數和lb01 MASTER不一樣 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.50.17/24 dev eth0 label eth0:1 } } #如下都相同
配置完成後,啓動Keepalived服務 並模擬實驗 主從vip漂移(只需開啓關閉主 .關閉主,主VIP消失從顯示VIP ,開啓主 從VIP消失,主VIP顯示)
router_id dd1 router_id dd2 路由標識
state MASTER state BACKUP 主備狀態
priority 100 priority 90 優先級
Keepalived雙實例雙主模式配置
啓動兩個vrrp vrrp_instance VI_1和vrrp_instance VI_2 讓他倆互爲主從.
Keepalived軟件僅僅在對方機器宕機或Keepalived停掉的時候纔會接管業務。但在實際工做中,有業務服務中止而Keepalived服務還在工做的狀況,這就會致使用戶訪問的VIP沒法找到對應的服務
實現方法1.能夠寫守護進程腳原本處理,。當服務有問題時,就停掉本地的Keepalived服務,實現IP漂移到對端繼續提供服務。
例 nginx高可用
#!/bin/sh while true do if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi sleep 5 done #此腳本的基本思想是若沒有80端口存在,就停掉Keepalived服務實現釋放本地的VIP。在後臺執行上述腳本並檢查:
第二個方法:能夠使用Keepalived的配置文件參數觸發寫好的監測服務腳本。首先要開發檢測服務腳本,注意這個腳本與上一個腳本的不一樣。
#!/bin/bash if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi
在keepalived的配置文件加入如下模塊
vrrp_script chk_nginx_proxy { #定義vrrp腳本,檢測HTTP端口 script "/server/scripts/chk_nginx_proxy.sh" #執行腳本,當Nginx服務有問題,就停掉Keepalived服務 interval 2 #間隔2秒 weight 2
當在同一個局域網內部署了多組Keepalived服務器對,而又未使用專門的心跳線通訊時,可能會發生高可用接管的嚴重故障問題。以前已經講解過Keepalived高可用功能是經過VRRP協議實現的,VRRP協議默認經過IP多播的形式實現高可用對之間的通訊,若是同一個局域網內存在多組Keepalived服務器對,就會形成IP多播地址衝突問題,致使接管錯亂,不一樣組的Keepalived都會使用默認的224.0.0.18做爲多播地址。此時的解決辦法是,在同組的Keepalived服務器全部的配置文件裏指定獨一無二的多播地址,配置以下:
global_defs { #全局配置 router_id LVS_19 #服務標識 vrrp_mcast_group4 224.0.0.19 #這個就是指定多播地址的配置 } #提示: 1)不一樣實例的通訊認證密碼也最好不一樣,以確保接管正常。 2)另外一款高可用軟件Heartbeat,若是採用多播方式實現主備通訊,一樣會有多播地址衝突問題。
在備節點上執行腳本,若是能夠ping通主節點而且備節點有VIP就報警,讓人員介入檢查是否裂腦。
#!/bin/bash lb01_vip=192.168.0.240 lb01_ip=192.168.0.221 while true do ping -c 2 -W 3 $lb01_ip &>/dev/null if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then echo "ha is split brain.warning." else echo "ha is OK" fi sleep 5 done
能夠將此腳本整合到Nagios或Zabbix監控服務裏,進行監控報警。