1. 程式人生 > >使用Keepalived配置主從熱備實現Nginx高可用(HA)

使用Keepalived配置主從熱備實現Nginx高可用(HA)

_id keep 過去 基礎 inter icmp interval RR 轉發

Keepalived 簡要介紹

Keepalived 是一種高性能的服務器高可用或熱備解決方案,Keepalived 可以用來防止服務器單點故障的發生,通過配合 Nginx 可以實現 web 前端服務的高可用。
Keepalived 以 VRRP 協議為實現基礎,用 VRRP 協議來實現高可用性(HA)。VRRP(Virtual RouterRedundancy Protocol)協議是用於實現路由器冗余的協議,
VRRP 協議將兩臺或多臺路由器設備虛擬成一個 設備,對外提供虛擬路由器 IP(一個或多個),而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER,
或者是通過算法選舉產生,MASTER 實現針對虛擬路由器 IP 的各種網絡功能, 如 ARP 請求,ICMP,以及數據的轉發等;其他設備不擁有該虛擬 IP,狀態是 BACKUP,
除了接收 MASTER 的 VRRP 狀態通告信息外,不執行對外的網絡功能。當主機失效時,BACKUP 將接管原先 MASTER 的網絡功能。
VRRP 協議使用多播數據來傳輸 VRRP 數據,VRRP 數據使用特殊的虛擬源 MAC 地址發送數據而不是自身 網卡的 MAC 地址,VRRP 運行時只有 MASTER 路由器定時發送 VRRP 通告信息,
表示 MASTER 工作正常以及虛 擬路由器 IP(組),BACKUP 只接收 VRRP 數據,不發送數據,如果一定時間內沒有接收到 MASTER 的通告信 息,各 BACKUP 將宣告自己成為 MASTER,
發送通告信息,重新進行 MASTER 選舉狀態。

Keepalived + Nginx 方案圖

技術分享圖片

Nginx相關環境基於上篇Nginx安裝博客的配置;

Keepalived 安裝

通過yum安裝:

yum install -y keepalived

耐心等待安裝完畢。

安裝完畢後 會生成 /etc/keepalived 目錄

相關命令:

service keepalived start         #啟動服務
service keepalived stop          #停止服務
service keepalived restart       #重啟服務  

Keepalived 配置

防火墻添加arrp組播規則,或關閉防火墻

iptables:

vi /etc/sysconfig/iptables  
-A INPUT -p vrrp -d 224.0.0.18/32 -j ACCEPT

firewall:

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp4s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

關閉selinux:

vi /etc/sysconfig/selinux
#修改:
SELINUX=disabled
#setenforce 0

keepalived 的所有功能都是通過配置 keepalived.conf文件來實現的。

建議備份一下keepalived.conf文件重新添加一個新文件填寫或者清空keepalived.conf文件重新填寫。

搶占模式配置

紅色字體為不同配置

Master節點:

global_defs {
   router_id nginx_01  #標識本節點的名稱,通常為hostname
}

## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
##如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加。如果腳本執行結果非0,
##並且weight配置的值小於 0,則優先級相應的減少。其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2  #每2秒檢測一次nginx的運行狀態
       weight -20  #失敗一次,將自己的優先級-20
}

vrrp_instance VI_1 {
    state MASTER                  # 狀態,主節點為MASTER,備份節點為BACKUP
    interface eno16777736         # 綁定VIP的網絡接口,通過ip add查看自己的網絡接口
    virtual_router_id 51          # 虛擬路由的ID號,兩個節點設置必須一樣,可選IP最後一段使用,相同的VRID為一個組,他將決定多播的MAC地址
    mcast_src_ip 192.168.60.131   # 本機IP地址(80端口已配置好nginx)
    priority 100                  # 節點優先級,值範圍0~254,MASTER要比BACKUP高
    advert_int 1                  # 組播信息發送時間間隔,兩個節點必須設置一樣,默認為1秒
    # 設置驗證信息,兩個節點必須一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP,兩個節點設置必須一樣。可以設置多個,一行寫一個
    virtual_ipaddress {
        192.168.60.200
    }

    track_script {
       chk_nginx  # nginx存活狀態檢測腳本
    }
}

BackUp 節點:

global_defs {
   router_id nginx_02  #標識本節點的名稱,通常為hostname
}

## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
##如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加。如果腳本執行結果非0,
##並且weight配置的值小於 0,則優先級相應的減少。其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2  #每2秒檢測一次nginx的運行狀態
       weight -20  #失敗一次,將自己的優先級-20
}

vrrp_instance VI_1 {
    state BACKUP                  # 狀態,主節點為MASTER,備份節點為BACKUP
    interface eno16777736         # 綁定VIP的網絡接口,通過ip add查看自己的網絡接口
    virtual_router_id 51          # 虛擬路由的ID號,兩個節點設置必須一樣,可選IP最後一段使用,相同的VRID為一個組,他將決定多播的MAC地址
    mcast_src_ip 192.168.60.133   # 本機IP地址(80端口已配置nginx)
    priority 90                  # 節點優先級,值範圍0~254,MASTER要比BACKUP高
    advert_int 1                  # 組播信息發送時間間隔,兩個節點必須設置一樣,默認為1秒
    # 設置驗證信息,兩個節點必須一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP,兩個節點設置必須一樣。可以設置多個,一行寫一個
    virtual_ipaddress {
        192.168.60.200
    }

    track_script {
       chk_nginx  # nginx存活狀態檢測腳本
    }
}

創建nginx服務檢測腳本

分別在主備服務器/etc/keepalived目錄下創建nginx_check.sh腳本,並為其添加執行權限chmod +x /etc/keepalived/nginx_check.sh

用於keepalived定時檢測nginx的服務狀態,如果nginx停止了,會嘗試重新啟動nginx,如果啟動失敗,會將keepalived進程殺死,將vip漂移到備份機器上。

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx #嘗試重新啟動nginx
    sleep 2  #睡眠2秒
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived #啟動失敗,將keepalived服務殺死。將vip漂移到其它備份節點
    fi
fi

配置完畢,分別啟動主從服務器keepalived服務

service keepalived start 
ps aux | grep keepalived

兩節點的啟動情況

技術分享圖片

查看vip綁定情況

ip add

主節點:

技術分享圖片

BackUp節點:

技術分享圖片

測試vip漂移

停止Master上的keepalived服務

技術分享圖片

BackUp節點:

技術分享圖片

重新開啟Master的keepalived服務再次看下vip綁定情況:

技術分享圖片

BackUp:

技術分享圖片

實現搶占式配置。

非搶占模式

Master 節點修改配置文件:

global_defs {
   router_id nginx_01  #標識本節點的名稱,通常為hostname
}

## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
##如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加。如果腳本執行結果非0,
##並且weight配置的值小於 0,則優先級相應的減少。其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2  #每2秒檢測一次nginx的運行狀態
       weight -20  #失敗一次,將自己的優先級-20
}

vrrp_instance VI_1 {
    state MASTER                  # 狀態,主節點為MASTER,備份節點為BACKUP
    interface eno16777736         # 綁定VIP的網絡接口,通過ifconfig查看自己的網絡接口
    virtual_router_id 51          # 虛擬路由的ID號,兩個節點設置必須一樣,可選IP最後一段使用,相同的VRID為一個組,他將決定多播的MAC地址
    mcast_src_ip 192.168.60.131   # 本機IP地址
    priority 100                  # 節點優先級,值範圍0~254,MASTER要比BACKUP高
    advert_int 1                  # 組播信息發送時間間隔,兩個節點必須設置一樣,默認為1秒
   #非搶占式
    nopreempt
   # 設置驗證信息,兩個節點必須一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP,兩個節點設置必須一樣。可以設置多個,一行寫一個
    virtual_ipaddress {
        192.168.60.200
    }

    track_script {
       chk_nginx  # nginx存活狀態檢測腳本
    }
}

BackUp節點修改配置文件:

global_defs {
   router_id nginx_02  #標識本節點的名稱,通常為hostname
}

## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
##如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加。如果腳本執行結果非0,
##並且weight配置的值小於 0,則優先級相應的減少。其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2  #每2秒檢測一次nginx的運行狀態
       weight -20  #失敗一次,將自己的優先級-20
}

vrrp_instance VI_1 {
    state BACKUP                  # 狀態,主節點為MASTER,備份節點為BACKUP
    interface eno16777736         # 綁定VIP的網絡接口,通過ifconfig查看自己的網絡接口
    virtual_router_id 51          # 虛擬路由的ID號,兩個節點設置必須一樣,可選IP最後一段使用,相同的VRID為一個組,他將決定多播的MAC地址
    mcast_src_ip 192.168.60.133   # 本機IP地址
    priority 100                  # 節點優先級,值範圍0~254,MASTER要比BACKUP高
    advert_int 1                  # 組播信息發送時間間隔,兩個節點必須設置一樣,默認為1秒
   #非搶占式  
    nopreempt
   # 設置驗證信息,兩個節點必須一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP,兩個節點設置必須一樣。可以設置多個,一行寫一個
    virtual_ipaddress {
        192.168.60.200
    }

    track_script {
       chk_nginx  # nginx存活狀態檢測腳本
    }
}

紅色為修改部分,從中可看出backup節點需要把優先級設置與master節點一樣。

重啟兩個節點的keepalived服務,再次斷開Master節點keepalived服務,vip漂移到BackUp節點,然後再開啟Master節點keepalived服務:

Master:

技術分享圖片

BackUp:

技術分享圖片

Master沒有搶占過去,非搶占式配置成功。

最後看下keepalived與nginx的配置成果:

技術分享圖片

使用Keepalived配置主從熱備實現Nginx高可用(HA)