keepalived高可用負載均衡

不太聪明的大鹅發表於2024-04-02

為什麼需要keepalived(保持存活)

keepalived實現高可用的工作原理

1.  準備一個叢集,為了實現高可用,如nginx負載均衡的2個機器,確保使用者的請求,能正確,高可用性的到達這個nginx叢集

2. 部署keepalived,生成VIP,虛擬IP資源。


3. keepalived是將 一組伺服器,組成一個虛擬裝置組,實現他們之間的心跳通訊(可以透過抓包,檢視他們的通訊協議,其實是VRRP虛擬路由冗餘協議。)

vrrp協議圖解

虛擬,路由, 冗餘,協議  ,vrrp

在同一組虛擬網路裝置中,master可以和backup互相通訊,知道對方的存活。

vip的漂移條件是,
心跳機制。
當backup收不到master發來的心跳資料包之後,就確認master掛掉了


vrrp工作原理

1. keppalived高可用是基於VRRP虛擬路由冗餘協議實現的,因此我從VRRP給您描述起
2. VRRP也就是虛擬路由冗餘協議,是為了解決靜態路由的單點故障;
3. VRRP透過競選協議將路由任務交給某一臺VRRP路由器。
4. VRRP正常工作時,master會自動傳送資料包,backup接收資料包,目的是為了判斷對方是否存活;如果backup收不到master的資料包了,自動接管master的資源;
backup節點可以有多個,透過優先順序競選,但是keepalived伺服器一般都是成對出現;
5. VRRP預設對資料包進行了加密,但是官網預設還是推薦使用明文來配置認證;

說完了VRRP,我再給您描述下keepalived工作原理。
1.keepalived就是基於VRRP協議實現的高可用,master的優先順序必須高於backup,因此啟動時master優先獲得機器的IP資源,backup處於等待狀態;若master掛掉後,backup頂替上來,繼續提供服務。
2.在keepalived工作時,master角色的機器會一直髮送VRRP廣播資料包,告訴其他backup機器,“我還活著”,此時backup不會搶奪資源,老實待著。
當master出現問題掛了,導致backup收不到master發來的廣播資料包,因此開始接替VIP,保證業務的不中斷執行,整個過程小於1秒。

透過抓包工具,檢視lb5和lb6的vrrp資料包的通訊(心跳資料包的傳送)

檢視資料包

模擬master掛掉,檢視資料包
目前,master會不斷的向這個組播地址,發心跳資料包,。

檢視資料包

恢復master機器,檢視這個心跳資料包的走向。

keepalived組播原理

單播流量走向圖

廣播資料流

組播資料流

keepalived環境準備(實踐部署)

1.先部署web機器組(web7、web8)

簡單部署,讓web7,web8分別提供一個不同的靜態頁面,能看出負載均衡的效果即可。

1. 安裝nginx
yum install nginx -y


2. 部署nginx,提供靜態頁面的虛擬主機就OK


3.建立測試資料
echo 'web7 ~~~~~~~~~~~~~~'   > /usr/share/nginx/html/index.html

echo 'web8 ===================='   > /usr/share/nginx/html/index.html

4.啟動2個web機器
nginx

5.本地測試,檢查nginx
[root@web-7 ~]#ps -ef|grep nginx
root       2172      1  0 10:40 ?        00:00:00 nginx: master process nginx
nginx      2173   2172  0 10:40 ?        00:00:00 nginx: worker process
root       2175   2054  0 10:40 pts/1    00:00:00 grep --color=auto nginx

[root@web-7 ~]#
[root@web-7 ~]#netstat -tnlp|grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2172/nginx: master  
tcp6       0      0 :::80                   :::*                    LISTEN      2172/nginx: master  


[root@web-7 ~]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~

2.部署負載均衡裝置(lb5,lb6)

1. 安裝nginx,使用它的負載均衡功能

yum install nginx -y

2. 建立負載均衡地址池

upstream web_pools {
        server 10.0.0.7;
        server 10.0.0.8;
}
server {
listen 80;
server_name _;
location / {

        proxy_pass http://web_pools;
        include proxy_params;
}

}


代理引數的配置
[root@lb-6 /etc/nginx/conf.d]#cat /etc/nginx/proxy_params 
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;


3.啟動nginx,檢視負載均衡的效果
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~

到這裡,就明確配置好了  slb5 和slb6,都可以正確的進行負載均衡

3.部署兩臺lb裝置,需要支援高可用了。(keepavlied技術)

這裡得細心了,注意看配置檔案。,預設基於epel源即可安裝。

yum install keepalived -y


1.  部署slb5的keepalived(master角色,優先獲取VIP資源,當master掛掉不可用,然後才輪到backup上場。)
注意,中文註釋,別寫入到配置檔案中


global_defs {
    router_id lb-5 # 路由器ID,每個機器不一樣
}

vrrp_instance VIP_1 {       # 設定VRRP路由器組組名,屬於同一組的名字一樣
    state MASTER            # 角色,master、backup兩種            
    interface eth0          # VIP繫結的網路卡         
    virtual_router_id 50    # 虛擬路由IP,同一組的一樣    
    priority 150            # 優先順序,優先順序越高,權重越高
    advert_int 1            # 傳送組播間隔1s
    authentication {        # 認證形式
        auth_type PASS      # 密碼認證,明文密碼 1111
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3            # 指定虛擬VIP地址,必須沒人使用
    }
}



# lb5機器的配置檔案

global_defs {
    router_id lb-5
}

vrrp_instance VIP_1 {
    state MASTER        
    interface eth0      
    virtual_router_id 50    
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24
    }
}

# 簡單能理解,keepalived的配置檔案,需要設定哪些引數的,扣6,
# 總結一波,如下設定,理解這個引數,是方便你如果出錯,可以去拍錯,檢查這些引數即可。

# 
 router_id 在這個虛擬路由器組中的都不一樣
 state 只有一個master,可以有多個backup
 interface 指定當前負載均衡機器的 通訊的網路卡即可,。
 virtual_router_id  注意,每個機器,都一樣,表示是一組內的裝置
 priority 優先順序,master需要高於backup
 authentication  一組裝置中的master和backup的通訊認證,是明文形式的 1111
 這個資訊,可以透過抓包看到。
 
 virtual_ipaddress  指定VIP的ip地址,需要在區域網內,無人使用。。
 
 

 
 
# lb6機器的配置檔案,注意如下部分引數,要和lb5機器區分開即可。

global_defs {
    router_id lb-6
}

vrrp_instance VIP_1 {
    state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24
    }
}



4.分別啟動兩臺機器的keepalived

systemctl start keepalived


5.繫結客戶端的VIP,訪問檢視效果,檢視日誌

10.0.0.3  www.linux0224.cc

keepalived腦裂問題

2.如何解決腦裂

基於shell指令碼去維護。
問題1,故障出在了backup機器,搶奪了VIP問題1,故障出在了backup機器,搶奪了VIP
[root@lb-6 /etc/keepalived]#ls
check_vip.sh keepalived.conf

# 1.在backup機器,設定好監控指令碼
[root@lb-6 /etc/keepalived]#
[root@lb-6 /etc/keepalived]#cat check_vip.sh 
#!/bin/bash
MASTER_VIP=$(ssh 10.0.0.5 ip a|grep 10.0.0.3|wc -l)
MY_VIP=$(ip a|grep 10.0.0.3|wc -l)

# 如果遠端有VIP並且自己本地也存在了VIP,就幹掉自己
if [ ${MASTER_VIP} == 1 -a ${MY_VIP} == 1 ]
then
   systemctl stop keepalived
fi



#  2. 讓keepalived去檢測使用這個指令碼,修改配置檔案如下
【前提矯健是,lb5和lb6機器可以免密登入,才可以遠端執行命令,以及給指令碼新增可執行許可權】


global_defs {
    router_id lb-6
}

# 定義指令碼
vrrp_script check_vip {
    script "/etc/keepalived/check_vip.sh"
    interval 5 # 指令碼執行的時間間隔
}

vrrp_instance VIP_1 {
    state BACKUP 
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
    # 調動指令碼
    track_script {
        check_vip
    }
}

[root@lb-6 /etc/keepalived]#chmod +x check_vip.sh

[root@lb-6 /etc/keepalived]#ssh-copy-id root@10.0.0.5


確保可以正確重啟keepavlied
[root@lb-6 /etc/keepalived]#systemctl restart keepalived

[root@lb-6 /etc/keepalived]#systemctl status keepalived


去手動,讓backup機器,搶奪VIP資源,如開啟防火牆服務
systemctl restart firewalld
3. 等待,檢視backup機器的是否會幹掉自己的keepalived以及檢查VIP

故障2,master機器出現了nginx掛掉的解決方案

這個指令碼,執行於 master機器

#!/bin/bash
NGINX_STATUS=$(ps -ef|grep ngin[x]|wc -l)
# 如果nginx掛了
if [ ${NGINX_STATUS} == 0 ]
then
   systemctl restart nginx
   # 如果重啟失敗
   if [ $? == 1 ]
   then
         # keepalived沒必要活著了
      systemctl stop keepalived
   fi
fi


# 給指令碼執行許可權

[root@lb-5 /etc/keepalived]#vim check-web.sh


[root@lb-5 /etc/keepalived]#chmod +x check-web.sh 


修改keepalived配置檔案
global_defs {
    router_id lb-5
}

vrrp_script check_web {
    script "/etc/keepalived/check_web.sh"
    interval 5
}

vrrp_instance VIP_1 {
    state MASTER
        interface eth0
        virtual_router_id 50
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
        track_script {
            check_web
        }
}


[root@lb-5 /etc/keepalived]#systemctl restart keepalived

[root@lb-5 /etc/keepalived]#systemctl status keepalived

[root@lb-5 ~]#echo 'yuchaoit.cn' >> /etc/nginx/nginx.conf 
[root@lb-5 ~]#systemctl stop nginx
5.此時已經正確切換到backup了。

相關文章