1. 程式人生 > 實用技巧 >Keepalived+nginx高可用

Keepalived+nginx高可用

1.域名不能繫結在兩個IP上

  • 我們把域名繫結在VIP上

2.如何實現切換?

負載均衡的高可用

keepalived

注意:任何軟體都可以使用keepalived來做高可用

keepalived如何實現高可用

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地址)

VIP:虛擬IP地址

VMAC:虛擬mac地址

如何才能做到出現故障自動轉移,此時VRRP就出現了,我們的VRRP其實是通過軟體或者硬體的形式在Master和Backup外面增加一個虛擬的MAC地址(VMAC)與虛擬IP地址(VIP),那麼在這種情況下,PC請求VIP的時候,無論是Master處理還是Backup處理,PC僅會在ARP快取表中記錄VMAC與VIP的資訊。

安裝配置keepalived

環境準備

作用 IP 角色 VIP
lb01 10.0.0.5 Master 10.0.0.3
lb02 10.0.0.6 Backup 等master掛了VIP會過來
web01 10.0.0.7 web 沒有VIP

部署web

部署MySQL

部署lb01

部署lb02

部署 keepalived

# 1.安裝keepalived
[root@lb01 ~]# yum install -y keepalived
[root@lb02 ~]# yum install -y keepalived

# 2.MASTER配置檔案
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地址
    }
}

# 3.BACKUP配置檔案
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
    }
}

我們需要把keepalived和nginx關聯起來

搶佔式和非搶佔式

1、兩個節點的state都必須配置為BACKUP
2、兩個節點都必須加上配置 nopreempt
3、其中一個節點的優先順序必須要高於另外一個節點的優先順序。
兩臺伺服器都角色狀態啟用nopreempt後,必須修改角色狀態統一為BACKUP,唯一的區分就是優先順序。

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

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

關聯nginx和keepalived

vim /etc/keepalived/keepalived.conf 

global_defs {                   #全域性配置
    router_id lb01              #標識身份->名稱
}

vrrp_script xxx {
    script "/root/nginx_keep.sh"
    interval 5
}

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地址
    }
    
}

track_script {
    xxx
}

[root@lb01 ~]# cat /root/nginx_keep.sh
#!/bin/sh
nginx_status=$(ps -C nginx --no-header|wc -l)

#1.判斷Nginx是否存活,如果不存活則嘗試啟動Nginx
if [ $nginx_status -eq 0 ];then
    systemctl start nginx
    sleep 3
    #2.等待3秒後再次獲取一次Nginx狀態
    nginx_status=$(ps -C nginx --no-header|wc -l) 
    #3.再次進行判斷, 如Nginx還不存活則停止Keepalived,讓地址進行漂移,並退出指令碼  
    if [ $nginx_status -eq 0 ];then
        systemctl stop keepalived
   fi
fi

# 想讓VIP漂移,不重啟nginx
#!/bin/sh
nginx_status=$(ps -C nginx --no-header|wc -l)

if [ $nginx_status -eq 0 ];then
        systemctl stop keepalived
fi

## 注意:如果是搶佔式,指令碼只需要放在MASTER上,如果是非搶佔式,指令碼必須放在MASTER和BACKUP上

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

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {                   #全域性配置
    router_id lb01              #標識身份->名稱
}

vrrp_script xxx {
    script "/usr/local/nginx_keep.sh"
    interval 5
}

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地址
    }

    track_script {
        xxx
    }
}

網站訪問指令碼

#!/bin/bash

while true;do
        code_status=$(curl -I -m 10 -o /dev/null -s -w %{http_code} www.wp.com)
        if [ $code_status -eq 200 ];then
                echo "$(date +%F-%T)_網站訪問成功" >> /tmp/web.log
        else
                echo "$(date +%F-%T)_網站訪問失敗,狀態碼是: $code_status" >> /tmp/web.log
        fi
        sleep 1
done

高可用會存在的問題:

1、如何確定誰是主節點誰是備節點?

  • MASTER(主節點)
  • BACKUP(備節點)
  • priority(優先順序,主節點的優先順序要大於備節點的優先順序)

2、如果Master故障,Backup自動接管,那麼Master回覆後會奪權嗎?

  • 如果配置的是搶佔式,MASTER會搶回VIP
  • 如果配置的是非搶佔式,兩個都BACKUP,額外加一個引數:nopreempt,非搶佔式不會搶VIP

3、如果兩臺伺服器都認為自己是Master會出現什麼問題

兩臺機器上面都有VIP,兩臺機器都認為自己是主節點,如果都有VIP,會導致網站訪問不了

1、伺服器網線鬆動等網路故障
2、伺服器硬體故障發生損壞現象而崩潰
3、主備都開啟firewalld防火牆

#!/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 ];then
        lb01_vip_status=$(ssh $lb01_ip "ip add|grep $vip|wc -l")
        lb02_vip_status=$(ip add|grep $vip|wc -l)
        if [ $lb01_vip_status -eq 1 -a $lb02_vip_status -eq 1 ];then
                echo '主節點和備節點都有VIP,開始關閉備節點的VIP...'
                systemctl stop keepalived
        fi
    else
        echo '主節點無法通訊'
    fi
#sleep 5
#done

注意:

負載均衡:lvs harproxy nginx

1.如果企業中用的是物理服務,機房。我們可以做keepalived的高可用

2.如果企業中用的是雲伺服器,(阿里雲...)不能做keepalived.... slb