介紹
Keepalived軟件起初是專門為LVS負載均衡軟件設計的用來管理並監控LVS集群系統中各個服務節點的狀態,后來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務的高可用解決方案軟件。
Keepalived軟件主要是通過VRRP協議實現高可用功能的,VRRP是Virtual Router Redundancy Protocol(虛擬路由器冗余協議)的縮寫.VRRP出現的目的就是為了解決靜態路由單點故障問題的
VRRP原理
1.master在工作狀態會不斷群發一個廣播包(內涵優先參數)
2.其他路由收到收到廣播后會和自己的優先參數作對比,如果優先參數小於自己則什么都不執行,如果優先參數大於自己則開啟爭搶機制
3.如果啟動了爭搶機制,他就會群發自己的優先參數,最終優先參數最小的稱為master路由.
keepalived的三個核心模塊
core核心模塊 chech健康監測 vrrp虛擬路由冗余協議
Keepalived服務的三個重要功能
1.管理LVS 2.對LVS集群節點檢查 3.作為系統網絡服務的高可用功能
#其中3高可用可作為任意網絡功能
Keepalived高可用故障切換轉移原理
Keepalived高可用故障切換,是通過VRRP虛擬路由器冗余協議來實現的。
在Keepalived服務正常工作時,主Master節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備Backup節點自己還活着,當主Master節點發生故障時,就無法發送心跳消息,備節點無法檢測到來自主Master節點心跳了,於是調用自身的接管程序,接管主Master節點的IP資源及服務。而當主Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
keepalived搭建
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
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顯示)
Keepalived單實例與多實例
單實主備配置文件的不同
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服務器對,而又未使用專門的心跳線通信時,可能會發生高可用接管的嚴重故障問題。之前已經講解過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,如果采用多播方式實現主備通信,同樣會有多播地址沖突問題。
開發檢測Keepalived裂腦的腳本
在備節點上執行腳本,如果可以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監控服務里,進行監控報警。