Nginx + keepalived 實現雙機熱備

Nginx + keepalived

keepalived 簡介

Keepalived是一個基於VRRP協議來實現的服務高可用方案,可以利用其來避免IP單點故障,類似的工具還有heartbeat、corosync、pacemaker。但是它一般不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一起工作來達到集羣的高可用。

VRRP 協議

VRRP全稱 Virtual Router Redundancy Protocol,即 虛擬路由冗餘協議。可以認爲它是實現路由器高可用的容錯協議,即將N臺提供相同功能的路由器組成一個路由器組(Router Group),這個組裏面有一個master和多個backup,但在外界看來就像一臺一樣,構成虛擬路由器,擁有一個虛擬IP(vip,也就是路由器所在局域網內其他機器的默認路由)。

佔有這個IP的master實際負責ARP相應和轉發IP數據包,組中的其它路由器作爲備份的角色處於待命狀態。master會發組播消息,當backup在超時時間內收不到vrrp包時就認爲master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master,保證路由器的高可用。

Nginx + keepalived

服務器架構

主(master) VIP 備(backup)
192.168.1.17 192.168.1.181 192.168.1.19

  1. 安裝 keepalived
    主、備服務器上分別安裝、啓動 keepalived,並設置開機啓動。
    $ yum install -y keepalived
    $ systemctl start keepalived
    $ systemctl enable keepalived

  2. 修改 keepalived 配置文件
    主、備服務器分別修改配置文件,注意state要填寫對應節點身份,interface要對應真實網卡,priority數值要能反映主備優先級,virtual_router_id 、authentication、virtual_ipaddress配置項要一致。
    修改完以後記得重啓服務
    $ vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    
    vrrp_instance VI_1 {
        state MASTER       #標識爲主服務器(BACKUP)
        interface em1      #對應網卡
        virtual_router_id 51	#id 號,主、備要一致
        priority 100	        #優先級,主要比備小;有多個備時,優先級高的接管
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111       #主、備一致
        }
        virtual_ipaddress {
            192.168.1.181        #定義vip
        }
    }
    
  3. Nginx 主頁
    yum 安裝 Nginx ,分別修改主、備服務器的 Nginx頁面。
    $ yum install nginx
    $ vim /usr/share/nginx/html/index.html
    修改以後主、備頁面如下:
    在這裏插入圖片描述

  4. VIP 偏移
    主、備服務器均開啓 keepalived,查看主網卡信息,發現 vip 在主服務器上:
    em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 44:a8:42:2b:08:1f brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.17/24 brd 192.168.1.255 scope global noprefixroute em1
    valid_lft forever preferred_lft forever
    inet 192.168.1.181/32 scope global em1
    valid_lft forever preferred_lft forever
    inet6 fe80::46a8:42ff:fe2b:81f/64 scope link
    打開nginx頁面,結果如下:顯示的內容是主服務器的網頁信息。
    在這裏插入圖片描述
    關閉主服務器上的 keepalived,查看備服務器日誌,發現,vip已經偏移。
    Mar 28 10:36:38 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Transition to MASTER STATE
    Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Entering MASTER STATE
    Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) setting protocol VIPs.
    Mar 28 10:36:39 compute7 Keepalived_healthcheckers[143498]: Netlink reflector reports IP 192.168.1.181 added
    Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Sending gratuitous ARPs on em1 for 192.168.1.181
    Mar 28 10:36:44 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Sending gratuitous ARPs on em1 for 192.168.1.181
    查看備網卡信息:181已經偏移到備服務器
    em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 18:66:da:f2:44:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.19/24 brd 192.168.1.255 scope global em1
    valid_lft forever preferred_lft forever
    inet 192.168.1.181/32 scope global em1
    valid_lft forever preferred_lft forever
    inet6 fe80::1a66:daff:fef2:4434/64 scope link
    valid_lft forever preferred_lft forever
    查看 Nginx 主頁:發現顯示的信息已經是備服務器
    在這裏插入圖片描述

  5. Nginx 檢查腳本
    該腳本檢測 nginx 的運行狀態,並在 nginx 進程不存在時嘗試重啓 nginx,如果重啓失敗則停止 keepalived,準備讓其他機器接管。
    #!/bin/bash
    counter=(psCnginxnoheadingwcl)if[&quot;(ps -C nginx --no-heading|wc -l) if [ &quot;{counter}" = “0” ];then
    /usr/sbin/nginx
    sleep 2
    counter=(psCnginxnoheadingwcl)if[&quot;(ps -C nginx --no-heading|wc -l) if [ &quot;{counter}" = “0” ];then
    systemctl stop keepalived
    fi
    fi
    修改主上 keepalived 配置文件,添加監控腳本。

    注意: interval 要比nginx監控腳本數值要大,不然會報錯 exited due to signal 15。
    查看 /var/log/messages 發現:
    WARNING – default user ‘keepalived_script’ for script execution does not exist – please create
    解決辦法:在 chk_nginx 腳本下添加執行用戶 user root 配置項。
    ! Configuration File for keepalived

    vrrp_script chk_nginx {
    
        script "/etc/keepalived/check_nginx.sh"           #腳本位置
        interval 4                                        #腳本執行間隔(要大於檢測腳本時間間隔)
        weight -2                                         #檢測失敗則優先級-2
        fall  2                                           #檢測兩次失敗纔算失敗
        rise 1                                            #檢測一次成功就成功
        user root                                         #腳本執行用戶
    }
    
    vrrp_instance VI_1
     {
        state MASTER
        interface em1
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.181
        }
        track_script {                                   #實例中添加要執行的腳本
           chk_nginx
        }
    }                                  
    

    日誌文件位置 /var/log/messages

  6. 檢測腳本是否成功

    • 主服務器,關閉主 Nginx進程,看能否成功啓動。
      $ pkill nginx
      打開頁面發現成功調用健康檢查腳本、啓動了 Nginx,測試成功。
      在這裏插入圖片描述
    • 主服務器, Nginx重啓失敗,看 VIP 是否偏移。(爲了測試方便,這裏我們可以通過修改健康檢查腳本里的參數,故意寫錯參數)
      在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章