linux集羣架構-keepalived高可用

1.什麼是高可用,爲何要設計高可用?nginx

兩臺機器啓動着相同的業務系統時,當有一臺宕機,另一臺服務器能快速的接管,對於訪問的用戶是減小系統不能提供服務的時間web

2.高可用使用什麼工具來實現?硬件仍是軟件?vim

軟件:keepalivedbash

3.keepalived如何實現高可用?服務器

經過vrrp協議實現,虛擬路由冗餘協議負載均衡

4.curl

5.工具

6.測試

7.keepalived高可用的安裝與配置url

10.0.0.5

10.0.0.6兩臺機器都作了負載均衡

1.安裝

yum install keepalived -y

2.配置(master |backup)

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {     
    router_id lb01   
}

vrrp_instance VI_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
    }
}

BACKUP

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf global_defs {
    router_id lb02
}

vrrp_instance VI_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
    }
}

啓動

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl enable keepalived

驗證

[root@lb01 ~]# ip addr|grep 10.0.0.3

8.keepalived高可用搶佔式與非搶佔式?

1.master故障----backup頂上-----master恢復-----      搶佔式 默認

2.master故障----backup頂上------master恢復-----backup繼續工做      非搶佔式

一、兩個節點的state都必須配置爲BACKUP(官方建議)
二、兩個節點都在vrrp_instance中添加nopreempt參數
三、其中一個節點的優先級必需要高於另一個節點的優先級。
兩臺服務器都角色狀態啓用nopreempt後,必須修改角色狀態統一爲BACKUP,惟一的區分就是優先級。

特色:

搶佔:硬件配置不一

非搶佔:硬件配置一致

keepalived高可用與nginx集成,地址實現漂移高可用

nginx與keepalivd本質上沒有什麼關係,但nginx須要藉助keepalived VIP 地址漂移 實現高可用

9.若是nginx宕機,會致使用戶請求失敗,但keepalived並不會進行切換,因此須要編寫一個腳本檢測nginx的存活

1.判斷nginx進程是否存在            ps aux|grep nginx|grep -v grep
2.判斷nginx的端口是否存在        netstat -lntp|grep :80|wc -l
3.經過curl來模擬訪問,判斷訪問結果是否ok   curl -H Host:url.oldxu.com http://10.0.0.3

編寫腳本

[root@lb01 ~]# mkdir /scripts
    [root@lb01 ~]# vim /scripts/check_web.sh
    #!/usr/bin/bash

    nginx_port=$(netstat -lntp|grep :80|wc -l)
    if [ $nginx_port -ne 1 ];then
        
        systemctl start nginx &>/dev/null
        rc=$?
        sleep 3
        if [ $rc -ne 0 ];then
            systemctl stop  keepalived 
        fi
    fi

[root@lb01 ~]# chmod +x /scripts/check_web.sh

2.keeplaived調用該腳本

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
    global_defs {     
        router_id lb01   
    }

    定義腳本名稱,以及腳本所在的路徑
    vrrp_script check_web {
       script "/scripts/check_web.sh"
       interval 5
    }


    vrrp_instance VI_1 {
        state MASTER
        #nopreempt
        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
        }
    }

 模擬nginx中止,檢查nginx是否會被拉起

systemctl stop nginx

systemctl starus nginx

10keepalived高可用腦裂與故障解決

腦裂(split-brain),指在一個高可用(HA)系統中,當聯繫着的兩個節點斷開聯繫時,原本爲一個總體的系統,分裂爲兩個獨立節點,這時兩個節點開始爭搶共享資源,結果會致使系統混亂,數據損壞。

 

對於無狀態服務的HA,無所謂腦裂不腦裂;

但對有狀態服務(好比MySQL)的HA,必需要嚴格防止腦裂。

(但有些生產環境下的系統按照無狀態服務HA的那一套去配置有狀態服務,結果可想而知...)

在備上編寫檢測腳本,測試若是能ping通主而且備節點還有VIP的話則認爲產生了腦裂

[root@lb02 conf.d]# cat /scripts/check_spilt.sh 
vip=10.0.0.3
master_ip=10.0.0.5

ping -c2 $master_ip &>/dev/null
if [ $? -eq 0 ];then
    ip_check=$(ip addr | grep "$vip" | wc -l)
    if [ $ip_check -eq 1 ];then
        echo "腦列"
        systemctl stop keepalived
    fi
fi

執行腳本

[root@lb02 conf.d]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb02
}

vrrp_script check_spilt {
   script "/scripts/check_spilt.sh"
   interval 3
}


vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    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_spilt
    }

}

keeplaived使用:

1.不能在公有云上使用

2.公有云要想實現負載均衡高可用-----> 購買的SLB  自帶高可用

3.虛擬IP咋使--->真實的硬件環境:

 

 

 

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs {     router_id lb01   }定義腳本名稱,以及腳本所在的路徑vrrp_script check_web {   script "/scripts/check_web.sh"   interval 5}vrrp_instance VI_1 {state MASTER#nopreemptinterface eth0virtual_router_id 50priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3}#調用腳本名稱track_script {check_web}}

相關文章
相關標籤/搜索