nginx負載均衡高可用

1.1 什麼是負載均衡高可用

nginx做爲負載均衡器,全部請求都到了nginx,可見nginx處於很是重點的位置,若是nginx服務器宕機後端web服務將沒法提供服務,影響嚴重。

爲了屏蔽負載均衡服務器的宕機,須要創建一個備份機。主服務器和備份機上都運行高可用(High Availability)監控程序,經過傳送諸如「I am alive」這樣的信息來監控對方的運行情況。當備份機不能在必定的時間內收到這樣的信息時,它就接管主服務器的服務IP並繼續提供負載均衡服務;當備份管理器又從主管理器收到「I am alive」這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。

1.2 keepalived+nginx實現主備

1.2.1 什麼是keepalived

keepalived是集羣管理中保證集羣高可用的一個服務軟件,用來防止單點故障。

 Keepalived的做用是檢測web服務器的狀態,若是有一臺web服務器死機,或工做出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工做正常後Keepalived自動將web服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的web服務器。

1.2.2 keepalived工做原理

keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。

虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(VIP = Virtual IP Address,虛擬IP地址,該路由器所在局域網內其餘機器的默認路由爲該vip),master會發組播,當backup收不到VRRP包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個backup當master。這樣的話就能夠保證路由器的高可用了。

keepalived主要有三個模塊,分別是core、check和VRRP。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各類檢查方式。VRRP模塊是來實現VRRP協議的。

詳細參考:Keepalived權威指南中文.pdf

1.2.3 keepalived+nginx實現主備過程

1.2.3.1 初始狀態


1.2.3.2 主機宕機


1.2.3.3 主機恢復


1.2.4 高可用環境

兩臺nginx,一主一備:192.168.101.3和192.168.101.4

兩臺tomcat服務器:192.168.101.五、192.168.101.6

1.2.5 安裝keepalived

分別在主備nginx上安裝keepalived,參考「安裝手冊」進行安裝:

1.2.6 配置keepalived

1.2.6.1 主nginx

修改主nginx下/etc/keepalived/keepalived.conf文件

! Configuration File for keepalived

#全局配置

global_defs {

  notification_email {  #指定keepalived在發生切換時須要發送email到的對象,一行一個

    XXX@XXX.com

  }

  notification_email_from XXX@XXX.com  #指定發件人

  #smtp_server XXX.smtp.com                             #指定smtp服務器地址

  #smtp_connect_timeout 30                               #指定smtp鏈接超時時間

  router_id LVS_DEVEL                                    #運行keepalived機器的一個標識

}

vrrp_instance VI_1 {

   state MASTER           #標示狀態爲MASTER 備份機爲BACKUP

   interface eth0         #設置實例綁定的網卡

   virtual_router_id 51   #同一實例下virtual_router_id必須相同

   priority 100           #MASTER權重要高於BACKUP 好比BACKUP爲99  

   advert_int 1           #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒

   authentication {       #設置認證

       auth_type PASS     #主從服務器驗證方式

       auth_pass 8888

   }

   virtual_ipaddress {    #設置vip

       192.168.101.100       #能夠多個虛擬IP,換行便可

   }

}

1.2.6.2 備nginx

修改備nginx下/etc/keepalived/keepalived.conf文件

配置備nginx時須要注意:須要修改state爲BACKUP , priority比MASTER低,virtual_router_id和master的值一致

! Configuration File for keepalived

#全局配置

global_defs {

  notification_email {  #指定keepalived在發生切換時須要發送email到的對象,一行一個

   XXX@XXX.com

  }

  notification_email_from XXX@XXX.com   #指定發件人

  #smtp_server XXX.smtp.com                              #指定smtp服務器地址

  #smtp_connect_timeout 30                               #指定smtp鏈接超時時間

  router_id LVS_DEVEL                                    #運行keepalived機器的一個標識

}

vrrp_instance VI_1 {

   state BACKUP           #標示狀態爲MASTER 備份機爲BACKUP

   interface eth0         #設置實例綁定的網卡

   virtual_router_id 51   #同一實例下virtual_router_id必須相同

   priority 99            #MASTER權重要高於BACKUP 好比BACKUP爲99  

   advert_int 1           #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒

   authentication {       #設置認證

       auth_type PASS     #主從服務器驗證方式

       auth_pass 8888

   }

   virtual_ipaddress {    #設置vip

       192.168.101.100       #能夠多個虛擬IP,換行便可

   }

}

1.2.7 測試

主備nginx都啓動keepalived及nginx。

service keepalived start

./nginx

1.2.7.1 初始狀態

查看主nginx的eth0設置:

vip綁定在主nginx的eth0上。


查看備nginx的eth0設置:

vip沒有綁定在備nginx的eth0上。


訪問ccc.test.com,能夠訪問。

1.2.7.2 主機宕機

將主nginx的keepalived中止或將主nginx關機(至關於模擬宕機),查看主nginx的eth0:

eth0沒有綁定vip


注意這裏模擬的是中止 keepalived進程沒有模擬宕機,因此還要將nginx進程也中止表示主nginx服務沒法提供。

查看備nginx的eth0:

vip已經漂移到備nginx。


訪問ccc.test.com,能夠訪問。

1.2.7.3 主機恢復

將主nginx的keepalived和nginx都啓動。

查看主nginx的eth0:

查看備nginx的eth0:

vip漂移到主nginx。


查看備nginx的eth0:

eth0沒有綁定vip


訪問:ccc.test.com,正常訪問。

注意:主nginx恢復時必定要將nginx也啓動(一般nginx啓動要加在開機啓動中),不然即便vip漂移到主nginx也沒法訪問。

1.2.8 解決nginx進程和keepalived不一樣時存在問題

1.2.8.1 問題描述

keepalived是經過檢測keepalived進程是否存在判斷服務器是否宕機,若是keepalived進程在可是nginx進程不在了那麼keepalived是不會作主備切換,因此咱們須要寫個腳原本監控nginx進程是否存在,若是nginx不存在就將keepalived進程殺掉。

1.2.8.2 nginx進程檢測腳本

在主nginx上須要編寫nginx進程檢測腳本(check_nginx.sh),判斷nginx進程是否存在,若是nginx不存在就將keepalived進程殺掉,check_nginx.sh內容以下:

#!/bin/bash

# 若是進程中沒有nginx則將keepalived進程kill掉

A=`ps -C nginx --no-header |wc -l`      ## 查看是否有 nginx進程 把值賦給變量A

if [ $A -eq 0 ];then                    ## 若是沒有進程值得爲 零

      service keepalived stop          ## 則結束 keepalived 進程

fi

將check_nginx.sh拷貝至/etc/keepalived下,

腳本測試:

將nginx中止,將keepalived啓動,執行腳本:sh /etc/keepalived/check_nginx.sh

從執行能夠看出自動將keepalived進程kill掉了。

1.2.8.3 修改keepalived.conf

修改主nginx的keepalived.conf,添加腳本定義檢測:

注意下邊紅色標識地方:

#全局配置

global_defs {

  notification_email {  #指定keepalived在發生切換時須要發送email到的對象,一行一個

    XXX@XXX.com

  }

  notification_email_from miaoruntu@itcast.cn  #指定發件人

  #smtp_server XXX.smtp.com                             #指定smtp服務器地址

  #smtp_connect_timeout 30                               #指定smtp鏈接超時時間

  router_id LVS_DEVEL                                    #運行keepalived機器的一個標識

}

vrrp_script check_nginx {

   script "/etc/keepalived/check_nginx.sh"         ##監控腳本

   interval 2                                      ##時間間隔,2秒

   weight 2                                        ##權重

}

vrrp_instance VI_1 {

   state MASTER           #標示狀態爲MASTER 備份機爲BACKUP

   interface eth0         #設置實例綁定的網卡

   virtual_router_id 51   #同一實例下virtual_router_id必須相同

   priority 100           #MASTER權重要高於BACKUP 好比BACKUP爲99

   advert_int 1           #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒

   authentication {       #設置認證

       auth_type PASS     #主從服務器驗證方式

       auth_pass 8888

   }

  track_script {

       check_nginx        #監控腳本

  }

   virtual_ipaddress {    #設置vip

       192.168.101.100       #能夠多個虛擬IP,換行便可

   }

}

修改後重啓keepalived

1.2.8.4 測試

回到負載均衡高可用的初始狀態,保證主、備上的keepalived、nginx所有啓動。

中止主nginx服務

觀察keepalived日誌:

tail -f /var/log/keepalived.log

查看keepalived進程已經不存在。

查看eth0已經沒有綁定vip。nginx

相關文章
相關標籤/搜索