nginx——keepalived

nginx——keepalived

1.keepalived高可用基本概述

什麼是高可用

通常是指2臺機器啓動着徹底相同的業務系統,當有一臺機器down機了,另一臺服務器就能快速的接管,對於訪問的用戶是無感知的。nginx

高可用一般使用什麼軟件

硬件使用F5web

軟件使用keepalivedvim

keepalilved是如何實現高可用的

keepalived軟件是基於VRRP協議實現的,VRRP虛擬路由冗餘協議,主要用於解決單點故障問題windows

那麼vrrp是如何誕生的,原理又是什麼?

好比公司的網絡是經過網關進行上網的,那麼若是該路由器故障了,網關沒法轉發報文了,此時全部人都沒法上網了,怎麼辦?緩存

一般作法是給路由器增長一臺北街店,可是問題是,若是咱們的主網關master故障了,用戶是須要手動指向backup的,若是用戶過多修改起來會很是麻煩。服務器

問題一:假設用戶將指向都修改成backup路由器,那麼master路由器修好了怎麼辦?
問題二:假設Master網關故障,咱們將backup網關配置爲master網關的ip是否能夠?網絡

實際上是不行的,由於PC第一次經過ARP廣播尋找到Master網關的MAC地址與IP地址後,會將信息寫到ARP的緩存表中,那麼PC以後鏈接都是經過那個緩存表的信息去鏈接,而後進行數據包的轉發,即便咱們修改了IP可是Mac地址是惟一的,pc的數據包依然會發送給master。(除非是PC的ARP緩存表過時,再次發起ARP廣播的時候才能獲取新的backup對應的Mac地址與IP地址)測試

如何才能作到出現故障自動轉移,此時VRRP就出現了,咱們的VRRP實際上是經過軟件或者硬件的形式在Master和Backup外面增長一個虛擬的MAC地址(VMAC)與虛擬IP地址(VIP),那麼在這種狀況下,PC請求VIP的時候,不管是Master處理仍是Backup處理,PC僅會在ARP緩存表中記錄VMAC與VIP的信息。code

高可用keepalived使用場景

一般業務系統須要保證7×24小時不DOWN機,好比公司內部的OA系統,天天公司人員都須要使用,則不容許Down機,做爲業務系統來講隨時均可用router

一、如何肯定誰是主節點誰是背節點(選舉投票,優先級)

二、若是Master故障,Backup自動接管,那麼Master回覆後會奪權嗎(搶佔試、非搶佔式)

三、若是兩臺服務器都認爲本身是Master會出現什麼問題(腦裂)

keepalived高可用安裝配置

2.1 實踐環境配置

做用 IP 角色
節點1 10.0.0.5 Master
節點2 10.0.0.6 Backup
VIP 10.0.0.3

2.2 在master和backup上分別安裝keepalived

[root@lb01 ~]# yum install -y keepalived
[root@lb02 ~]# yum install -y keepalived

2.3 配置節點1,Master

#找到配置文件
[root@lb02 ~]# rpm -qc keepalived
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived

#編輯配置文件
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {                   #全局配置
    router_id lb01              #標識身份->名稱
}

vrrp_instance VI_1 {
    state MASTER                #標識角色狀態
    interface eth0              #網卡綁定接口
    virtual_router_id 50        #虛擬路由id
    priority 150                #優先級
    advert_int 1                #監測間隔時間
    authentication {            #認證
        auth_type PASS          #認證方式
        auth_pass 1111          #認證密碼
    }
    virtual_ipaddress {         
        10.0.0.3                #虛擬的VIP地址
    }
}

2.4 配置節點2,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
    }
}

2.5 對比master與Backup的keepalived配置區別

Keepalived配置區別 Master節點配置 Backup節點配置
route_id(惟一標識) router_id lb01 router_id lb02
state(角色狀態) state MASTER state BACKUP
priority(競選優先級) priority 150 priority 100

2.6 啓動Master和Backup節點的keepalived

#Master節點
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl enable keepalived

#Backup節點
[root@lb02 ~]# systemctl start keepalived
[root@lb02 ~]# systemctl enable keepalived

3. 高可用keepalived搶佔式與非搶佔式

3.1 兩個節點都啓動時

#因爲節點1的優先級高於節點2,因此VIP在節點1上面
[root@lb01 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0

3.2 關閉節點1的keepalived

[root@lb01 ~]# systemctl stop keepalived

#節點2聯繫不上節點1,主動接管VIP
[root@lb02 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0

3.3 此時從新啓動Master上的keepalived,會發現VIP被強行搶佔

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global eth0

3.4 配置非搶佔式

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

Master配置
    vrrp_instance VI_1 {
        state BACKUP
        priority 150
        nopreempt
    }

Backup配置
    vrrp_instance VI_1 {
        state BACKUP
        priority 100
        nopreempt
    }

3.5 經過windows的arp去驗證,是否會切換MAC地址

#查看VIP在節點1上面
[root@lb01 ~]# ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global eth0

#windows查看Mac地址

#將節點1的keepalived停掉
[root@lb01 ~]# systemctl stop keepalived

#節點2接管VIP
[root@lb02 ~]# ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global eth0

#再次查看mac地址
arp -a


4. 高可用keepalived故障腦裂

因爲某些緣由,致使兩臺keepalived高可用服務器在指定時間內,沒法檢測到對方的心跳,個字去的資源及服務的全部權,而此時的兩臺高可用服務器又都還活着。

4.1 腦裂故障緣由

一、服務器網線鬆動等網絡故障
二、服務器硬件故障發生損壞現象而崩潰
三、主備都開啓firewalld防火牆

4.2 腦裂故障現象

#將節點1和節點2的防火牆都打開
[root@lb01 ~]# systemctl start firewalld

[root@lb02 ~]# systemctl start firewalld

#fireshark抓包查看


4.3 解決腦裂故障方案

#若是發生鬧裂,則隨機kill掉一臺便可
#在備上編寫檢測腳本, 測試若是能ping通主而且備節點還有VIP的話則認爲產生了列腦
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
    ping -c 2 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
    else
        echo "ha is ok"
    fi
sleep 5
done

5. 高可用keepalived與nginx

5.1 爲何域名解析到VIP就能夠訪問nginx?

Nginx默認監聽在全部的IP地址上,VIP會飄到一臺節點上,至關於那臺nginx多了VIP這麼一個網卡,因此能夠訪問到nginx所在機器

5.2 若是nginx宕機,會致使用戶請求失敗,可是keepalived沒有掛掉不會進行切換,因此須要編寫一個腳本檢測Nginx的存活狀態,若是不存活則kill掉keepalived

[root@lb01 ~]# mkdir /server/scripts
[root@lb01 ~]# vim /server/scripts/check_web.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)

#1.判斷Nginx是否存活,若是不存活則嘗試啓動Nginx
if [ $nginxpid -eq 0 ];then
    systemctl start nginx
    sleep 3
    #2.等待3秒後再次獲取一次Nginx狀態
    nginxpid=$(ps -C nginx --no-header|wc -l) 
    #3.再次進行判斷, 如Nginx還不存活則中止Keepalived,讓地址進行漂移,並退出腳本  
    if [ $nginxpid -eq 0 ];then
        systemctl stop keepalived
   fi
fi
#給腳本增長執行權限
[root@lb01 ~]# chmod +x /server/scripts/check_web.sh

5.3 在lb01主機的keepalived配置文件中調用此腳本

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

#每5秒執行一次腳本,腳本執行內容不能超過5秒,不然會中斷再次從新執行腳本
vrrp_script check_web {
    script "/server/scripts/check_web.sh"
    interval 5
}

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    
    }


#調用並運行腳本
track_script {
    check_web
}
}
#在Master的keepalived中調用腳本,搶佔式,僅需在master配置便可。(注意,若是配置爲非搶佔式,那麼須要兩臺服務器都使用該腳本)
相關文章
相關標籤/搜索