1. 程式人生 > 其它 >nginx+keepalived高可用配置筆記

nginx+keepalived高可用配置筆記

一、nginx安裝

二、keepalived安裝

2.1 解壓

tar -zxvf keepalived-2.2.2.tar.gz

mv keepalived-2.2.2 /opt/

2.2 編譯安裝

# 設定安裝目錄
./configure --prefix=/usr/local/keepalived

# 編譯
make

# 安裝
make install

2.3 拷貝配置檔案,重要

安裝完成後,進入安裝目錄的etc目錄下,將keepalived相應的配置檔案拷貝到系統相應的目錄當中。keepalived啟動時會從/etc/keepalived目錄下查詢keepalived.conf配置檔案。

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived

三、keepalived配置

3.1 killall指令安裝包

在配置nginx檢查指令碼用得到。

yum install -y psmisc

注意:killall指令中 -0 是用來發送測試訊號的,不會殺死程序。 -9是強制殺死程序,慎用。

3.2 keepalived主要配置

主要配置位於/etc/keepalived/keepalived.conf檔案。

主節點:如果需要主節點恢復後VIP漂移回來,需要state MASTER

如果不需要搶佔,則可以都設定為BACKUP節點,一旦故障轉移,就按權重選取MASTER,初始時,先啟動的為主節點。

# 全域性配置
global_defs {
    notification_email {
        [email protected]  #設定報警收件人郵件地址,可以設定多個,每行一個。需要開啟sendmail服務。
    }
    notification_email_from [email protected] #發件人
    smtp_server smtp.qq.com   #設定SMTP Server地址
    smtp_connection_timeout 30   #設定SMTP Server的超時時間
    router_id nginx_master       #表示執行Keepalived伺服器的一個標識,唯一的
}
#檢測指令碼
vrrp_script chk_http_port {
#    script "killall -0 nginx" # 這個指令碼只做訊號檢查,功能弱了一些,一般都自定義指令碼
    script "/usr/local/keepalived/sbin/check_nginx.sh" #心跳執行的指令碼,檢測nginx是否啟動
    interval 2                          #(檢測指令碼執行的間隔,單位是秒)
    weight -2                            #權重
}
#vrrp 例項定義部分
vrrp_instance VI_1 {
    state BACKUP            # 指定keepalived的角色,MASTER為主,BACKUP為備 說明:可以都設定為BACKUP,先啟動為主,然後nopreempt才能有效
    interface ens33         # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡) 用ifconfig檢視你具體的網絡卡
    virtual_router_id 66    # 虛擬路由編號,主從要一致
    priority 100            # 優先順序,數值越大,獲取處理請求的優先順序越高
    advert_int 1            # 檢查間隔,預設為1s(vrrp組播週期秒數)
    nopreempt               # 設定為不搶佔,說明:這個配置只能在BACKUP主機上面設定 
    #授權訪問
    authentication {
        auth_type PASS #設定驗證型別和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通訊
        auth_pass 1111
    }
    track_script {
        chk_http_port            #(呼叫檢測指令碼)
    }
    virtual_ipaddress {
        192.168.44.100            # 定義虛擬ip(VIP),可多設,每行一個
    }
}

從節點:只需重設部分引數

router_id nginx_backup01
state BACKUP # 如果是多主情況,這裡都是BACKUP
priority 99  # 多個從節點,優先順序依次降低

例:

# 全域性配置
global_defs {
    notification_email {
        [email protected]  #設定報警郵件地址,可以設定多個,每行一個。需要開啟sendmail服務。
    }
    notification_email_from [email protected]
    smtp_server smtp.qq.com   #設定SMTP Server地址
    smtp_connection_timeout 30   #設定SMTP Server的超時時間
    router_id nginx_backup01       #表示執行Keepalived伺服器的一個標識,唯一的
}
#檢測指令碼
vrrp_script chk_http_port {
#    script "killall -0 nginx"
    script "/usr/local/keepalived/sbin/check_nginx.sh" #心跳執行的指令碼,檢測nginx是否啟動
    interval 2                          #(檢測指令碼執行的間隔,單位是秒)
    weight -2                            #權重
}
#vrrp 例項定義部分
vrrp_instance VI_1 {
    state BACKUP            # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface ens33         # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡) 用ifconfig檢視你具體的網絡卡
    virtual_router_id 66    # 虛擬路由編號,主從要一直
    priority 99            # 優先順序,數值越大,獲取處理請求的優先順序越高
    advert_int 1            # 檢查間隔,預設為1s(vrrp組播週期秒數)
    nopreempt               # 非搶佔式  
    #授權訪問
    authentication {
        auth_type PASS #設定驗證型別和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通訊
        auth_pass 1111
    }
    track_script {
        chk_http_port            #(呼叫檢測指令碼)
    }
    virtual_ipaddress {
        192.168.44.100            # 定義虛擬ip(VIP),可多設,每行一個
    }
}

3.3 檢測指令碼

check_nginx.sh指令碼根據生產環境要求調整,重要的是要返回結果值,正常為0,錯誤為1

#!/bin/bash
# 檢測nginx是否啟動
A=`ps -C nginx --no-header |wc -l`
result=0
if [ $A -eq 0 ];then    #如果nginx沒有啟動就啟動nginx                        
      /usr/local/nginx/sbin/nginx                #重啟nginx
      sleep 2
      A=`ps -C nginx --no-header |wc -l`
      if [ $A -eq 0 ];then    #nginx重啟失敗,則停掉keepalived服務,進行VIP轉移
            killall keepalived
            result=1
      fi
fi
# keepalived根據返回值增減權重
exit $result

3.4 新增防火牆規則

因為vrrp使用224.0.0.18這個組播地址,所以必須新增組播規則或者關閉防火牆,否則會出現腦裂現象。

新增:

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

檢視:

firewall-cmd --direct --get-all-rules

ipv4 filter OUTPUT 0 --out-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

3.5 啟動keepalived

啟動Keepalived並新增到開機自啟

systemctl start keepalived

systemctl enable keepalived

3.6 檢查vip漂移情況

使用killall keepalived殺掉程序後,可以觀察到vip會根據權重依次漂移。

ip ad

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:01:83:24 brd ff:ff:ff:ff:ff:ff
    inet 192.168.44.10/24 brd 192.168.44.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.44.100/32 scope global ens33
       valid_lft forever preferred_lft forever

四、keepalived高可用原理

keepalived本質與nginx無關係,keepalived只是通過組播實現自身的故障轉移和VIP漂移,它提供了指令碼檢測介面,通過指令碼,我們可以把需要檢測服務用指令碼管理起來,實現服務的故障檢查、轉移、恢復等功能。