keepalived結合nginx實現nginx高可用


1.簡介

 Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,可以利用其來避免單點故障。一個LVS服務會有2台服務器運行Keepalived,一台為主服務器(MASTER),一台為備份服務器(BACKUP),但是對外表現為一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。Keepalived是VRRP的完美實現,因此在介紹keepalived之前,先介紹一下VRRP的原理。

1.VRRP 協議簡介

在現實的網絡環境中,兩台需要通信的主機大多數情況下並沒有直接的物理連接。對於這樣的情況,它們之間路由怎樣選擇?主機如何選定到達目的主機的下一跳路由,這個問題通常的解決方法有二種:

  • 在主機上使用動態路由協議(RIP、OSPF等)

  • 在主機上配置靜態路由

很明顯,在主機上配置動態路由是非常不切實際的,因為管理、維護成本以及是否支持等諸多問題。配置靜態路由就變得十分流行,但路由器(或者說默認網關default gateway)卻經常成為單點故障。VRRP的目的就是為了解決靜態路由單點故障問題,VRRP通過一競選(election)協議來動態的將路由任務交給LAN中虛擬路由器中的某台VRRP路由器。

2.VRRP 工作機制

       在一個VRRP虛擬路由器中,有多台物理的VRRP路由器,但是這多台的物理的機器並不能同時工作,而是由一台稱為MASTER的負責路由工作,其它的都是BACKUP,MASTER並非一成不變,VRRP讓每個VRRP路由器參與競選,最終獲勝的就是MASTER。MASTER擁有一些特權,比如,擁有虛擬路由器的IP地址,我們的主機就是用這個IP地址作為靜態路由的。擁有特權的MASTER要負責轉發發送給網關地址的包和響應ARP請求。

       VRRP通過競選協議來實現虛擬路由器的功能,所有的協議報文都是通過IP多播(multicast)包(多播地址224.0.0.18)形式發送的。虛擬路由器由VRID(范圍0-255)和一組IP地址組成,對外表現為一個周知的MAC地址。所以,在一個虛擬路由 器中,不管誰是MASTER,對外都是相同的MAC和IP(稱之為VIP)。客戶端主機並不需要因為MASTER的改變而修改自己的路由配置,對客戶端來說,這種主從的切換是透明的。

       在一個虛擬路由器中,只有作為MASTER的VRRP路由器會一直發送VRRP通告信息(VRRPAdvertisement message),BACKUP不會搶占MASTER,除非它的優先級(priority)更高。當MASTER不可用時(BACKUP收不到通告信息), 多台BACKUP中優先級最高的這台會被搶占為MASTER。這種搶占是非常快速的(<1s),以保證服務的連續性。由於安全性考慮,VRRP包使用了加密協議進行加密。

3.VRRP 工作流程

(1).初始化:    
路由器啟動時,如果路由器的優先級是255(最高優先級,路由器擁有路由器地址),要發送VRRP通告信息,並發送廣播ARP信息通告路由器IP地址對應的MAC地址為路由虛擬MAC,設置通告信息定時器准備定時發送VRRP通告信息,轉為MASTER狀態;否則進入BACKUP狀態,設置定時器檢查定時檢查是否收到MASTER的通告信息。

(2).Master

  • 設置定時通告定時器;

  • 用VRRP虛擬MAC地址響應路由器IP地址的ARP請求;

  • 轉發目的MAC是VRRP虛擬MAC的數據包;

  • 如果是虛擬路由器IP的擁有者,將接受目的地址是虛擬路由器IP的數據包,否則丟棄;

  • 當收到shutdown的事件時刪除定時通告定時器,發送優先權級為0的通告包,轉初始化狀態;

  • 如果定時通告定時器超時時,發送VRRP通告信息;

  • 收到VRRP通告信息時,如果優先權為0,發送VRRP通告信息;否則判斷數據的優先級是否高於本機,或相等而且實際IP地址大於本地實際IP,設置定時通告定時器,復位主機超時定時器,轉BACKUP狀態;否則的話,丟棄該通告包;

(3).Backup

  • 設置主機超時定時器;

  • 不能響應針對虛擬路由器IP的ARP請求信息;

  • 丟棄所有目的MAC地址是虛擬路由器MAC地址的數據包;

  • 不接受目的是虛擬路由器IP的所有數據包;

  • 當收到shutdown的事件時刪除主機超時定時器,轉初始化狀態;

  • 主機超時定時器超時的時候,發送VRRP通告信息,廣播ARP地址信息,轉MASTER狀態;

  • 收到VRRP通告信息時,如果優先權為0,表示進入MASTER選舉;否則判斷數據的優先級是否高於本機,如果高的話承認MASTER有效,復位主機超時定時器;否則的話,丟棄該通告包;

4.ARP查詢處理

       當內部主機通過ARP查詢虛擬路由器IP地址對應的MAC地址時,MASTER路由器回復的MAC地址為虛擬的VRRP的MAC地址,而不是實際網卡的 MAC地址,這樣在路由器切換時讓內網機器覺察不到;而在路由器重新啟動時,不能主動發送本機網卡的實際MAC地址。如果虛擬路由器開啟的ARP代理 (proxy_arp)功能,代理的ARP回應也回應VRRP虛擬MAC地址。

2.搭建環境

  1. 服務器1:10.63.0.154  安裝keeplived並設置priority 優先值為100
  2. 服務器2:10.63.0.155  安裝keeplived並設置priority 優先值為98
  3. 設置兩台服務器對應的虛擬ip為:10.63.0.158

3.安裝keepalived主節點

在服務器上安裝nginx,安裝方法可參考文章:FastDFS教程Ⅰ-文件服務器安裝與Nginx配置。本次安裝keepalived采用yum的模式,在服務器1上安裝,主要操作步驟如下:

  1. 安裝ipvsadm,指令:yum install ipvsadm,安裝完成后,可通過指令ipvsadm –v查看版本號。
  2. 安裝keepalived,指令:yum install keepalived,安裝完成后,可通過指令Keepalived –v查看版本號。
  3. 創建/usr/local/nginx/nginx_check.sh腳本。腳本內容如下:
    #!/bin/bash
    #判斷nginx服務是否啟動,如果不存在,調用nginx啟用命令,並停止2秒,若#啟動失敗,殺掉keepalived
    A=`ps -C nginx --no-header |wc -l`
    if [ $A -eq 0 ];then 
        /usr/sbin/nginx
        sleep 2
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
    fi
    View Code

     設置nginx_check.sh權限,設置命令為:chmod  777   /usr/local/nginx/nginx_check.sh

  4. 配置keepalived節點信息,默認配置文件為/etc/keepalived/keepalived.conf。keepalived.conf配置文件如下:
    ! Configuration File for keepalived
    
    global_defs {
       router_id nginx_master154
    }
    
    vrrp_script chk_nginx {
       script "/usr/local/nginx/nginx_check.sh"
        interval 2
        weight 20
    }
    vrrp_instance VI_1 {
        state  MASTER
        interface  eth0
        virtual_router_id 154
       mcast_src_ip 10.63.0.154
        priority 100
        nopreempt
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
      track_script {
            chk_nginx
        }
        virtual_ipaddress {
            10.63.0.158
        }
    }
    }
    View Code

     配置文件關鍵參數說明:

  •  router_id   //定義節點名稱
  • vrrp_script chk_nginx {    script "/etc/keepalived/nginx_check.sh"     interval 2     weight -20  }    //每隔2秒中去執行/etc/keepalived/nginx_check.sh腳本一次,這項檢查從開始便一直進行,interval表示間隔時間,weight -20的意思是,腳本執行當判斷異常時,把10.63.0.154這個節點的優先級降低20。
  • state MASTER   //表示該節點角色定義為MASTER
  • virtual_router_id 154  //定義虛擬的節點標識
  • interface eth0   //定義網卡名稱 查看服務器網卡名稱可通過指令:ifconfig或者ip  a,如圖:
  •  

    以上配置文件完成后,啟動nginx,啟動keepalived,可測試nginx是否可被虛擬ip地址訪問。啟動keepalived指令:systemctl start keepalived.service,啟動后可通過指令 systemctl status keepalived.service查看狀態。利用虛擬ip訪問nginx主界面截圖如下:

     

3.安裝keepalived備用節點

 在服務器2上面安裝keepalived的方法和服務器1完全一樣,在keepalived.conf配置文件中只需修改三個地方:

  • interface eth0   //定義網卡名稱 查看服務器2的網卡 如網卡名稱為 eno24 ,則定義為:interface eno24
  • priority  //優先值設置為98
  • mcast_src_ip 10.63.0.155

兩台服務器上面的keepalived安裝成功后,通過虛擬ip10.63.0.158調用測試,發現始終是主節點的頁面,不會調用備用節點的頁面。設置把服務器1上面的keepalived關閉后,再次調用,會出現備用節點的主界面,如下圖:

     

4.Linux服務管理工具systemctl

Linux中,有service和chkconfig兩個命令管理服務。systemctl 是管理服務的主要工具, 它整合了chkconfig 與 service功能於一體。(可以通過該命令管理yum安裝軟件,同時設置是否開機啟動)

  • systemctl is-enabled servicename.service #查詢服務是否開機啟動
  • systemctl enable *.service #開機運行服務
  • systemctl disable *.service #取消開機運行
  • systemctl start *.service #啟動服務
  • systemctl stop *.service #停止服務
  • systemctl restart *.service #重啟服務
  • systemctl reload *.service #重新加載服務配置文件
  • systemctl status *.service #查詢服務運行狀態
  • systemctl --failed #顯示啟動失敗的服務

       注:*代表某個服務的名字,如http的服務名為httpd

例如在CentOS 7 上安裝http

      [root@CentOS7 ~]# yum -y install httpd

  • 啟動服務(等同於service httpd start)  systemctl start httpd.service
  • 停止服務(等同於service httpd stop)  systemctl stop httpd.service
  • 重啟服務(等同於service httpd restart) systemctl restart httpd.service
  • 查看服務是否運行(等同於service httpd status) systemctl status httpd.service
  • 開機自啟動服務(等同於chkconfig httpd on)  systemctl enable httpd.service
  • 開機時禁用服務(等同於chkconfig httpd on) systemctl disable httpd.service

    ps -ef | grep nginx #查看服務進程
  •  #非systemctl配置開機啟動:chmod +x /etc/rc.d/rc.local
  • #打開rc.localvi /etc/rc.local
  • #加入啟動腳本其中路徑一定要用全路徑如:/usr/local/nginx/sbin/nginx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM