天天看點

Nginx極簡實戰—如何實作Nginx負載均衡高可用

之前講了Nginx 如何實作負載均衡,以及如何實作動靜分離。但是還确少Nginx 高可用的部分。因為Nginx 處于整個系統非常重要的位置,Nginx的高可用影響到整個系統的穩定性。如果nginx伺服器當機後端web服務将無法提供服務,影響嚴重。是以,接下來就來介紹Nginx + keepalived 實作高可用的方案。

一、什麼是負載均衡高可用

nginx作為負載均衡器,所有請求都到了nginx,可見nginx處于非常重點的位置,如果nginx伺服器當機後端web服務将無法提供服務,影響嚴重。

為了屏蔽負載均衡伺服器的當機,需要建立一個備份機。主伺服器和備份機上都運作高可用(High Availability)監控程式,通過傳送諸如“I am alive”這樣的資訊來監控對方的運作狀況。當備份機不能在一定的時間内收到這樣的資訊時,它就接管主伺服器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的資訊時,它就釋放服務IP位址,這樣的主伺服器就開始再次提供負載均衡服務。

二、Nginx高可用方案

目前,比較流行的實作Nginx高可用方案就是:keepalived+nginx實作主備方案。

1、什麼是keepalived

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

Keepalived的作用是檢測web伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived将檢測到,并将有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動将web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的web伺服器。

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協定的。

3、keepalived+nginx實作主備過程

下圖是keepalived + nginx 實作主備的過程。

Nginx極簡實戰—如何實作Nginx負載均衡高可用

從上圖可以看到,主Nginx健康時,系統所有的請求通過主Nginx 轉發到Tomcat伺服器叢集。當主Nginx 當機後,會立馬切換到備Nginx ,由備Nginx 提供轉發服務。這樣就保證系統的正常運作。

三、環境準備

1、兩天Nginx伺服器和兩台web伺服器

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

兩台tomcat伺服器:192.168.101.5、192.168.101.6

2、安裝keepalived

分别在主備nginx上安裝keepalived,這裡就講解keepalived的安裝了。

3、配置虛拟IP(vip:192.168.101.100)

四、配置Nginx高可用

1、配置主nginx

修改主nginx下/etc/keepalived/keepalived.conf檔案,配置主Nginx。

#全局配置
global_defs {
   notification_email {  #指定keepalived在發生切換時需要發送email到的對象,一行一個
     [email protected]
   }
   notification_email_from [email protected]  #指定發件人
   #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,換行即可
    }
}      

2、配置備nginx

修改備nginx下/etc/keepalived/keepalived.conf檔案,配置備Nginx

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

#全局配置
global_defs {
   notification_email {  #指定keepalived在發生切換時需要發送email到的對象,一行一個
    [email protected]
   }
   notification_email_from [email protected]                  #指定發件人
   #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,換行即可
    }
}      

3、驗證測試

1、主備nginx都啟動keepalived及nginx。

service keepalived start
./nginx      

2、啟動之後,主Nginx正常工作,分别檢視主nginx和 備nginx的eth0設定,vip(192.168.101.100)綁定在主nginx的eth0上。

Nginx極簡實戰—如何實作Nginx負載均衡高可用

通路

http://192.168.101.100

,通路成功。

3、将主nginx的keepalived停止或将主nginx關機(相當于模拟當機),再次檢視主nginx和 備nginx的eth0設定,vip(192.168.101.100)已經漂移到備nginx 上。

Nginx極簡實戰—如何實作Nginx負載均衡高可用

再次通路

,發現系統依然可以通路。說明使用keepalived 成功實作了Nginx的高可用。

最後

以上,keepalived+nginx 系統高可用的解決方案介紹完了,看上去複雜,其實配置還是比較簡單的。

繼續閱讀