Keepalived高可用集群


介紹

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監控服務里,進行監控報警。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM