之前講了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 轉發到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上。
通路
http://192.168.101.100,通路成功。
3、将主nginx的keepalived停止或将主nginx關機(相當于模拟當機),再次檢視主nginx和 備nginx的eth0設定,vip(192.168.101.100)已經漂移到備nginx 上。
再次通路
,發現系統依然可以通路。說明使用keepalived 成功實作了Nginx的高可用。
最後
以上,keepalived+nginx 系統高可用的解決方案介紹完了,看上去複雜,其實配置還是比較簡單的。