之前講了Nginx 如何實作負載均衡,以及如何實作動靜分離。我們知道,Nginx服務在整個平台系統中, 處于非常重要的位置,Nginx的高可用影響到整個系統的穩定性。如果Nginx伺服器當機,整個後端web服務将無法提供服務,影響非常嚴重。
是以,接下來就來介紹Nginx + keepalived 實作高可用的方案。
一、什麼是高可用
高可用HA(High Availability)是分布式系統架構設計中必須考慮的因素之一,它通常是指,通過系統架構設計,減少系統不能提供服務的時間。如果一個系統能夠一直提供服務,那麼這個可用性則是百分之百,但是天有不測風雲。是以我們隻能盡可能的去減少服務的故障。Nginx作為系統的核心基礎服務,它的可用性至關重要。
為了屏蔽Nginx伺服器的當機,需要建立一個備份機。主伺服器和備份機上都運作高可用(High Availability)監控程式,通過傳送諸如“I am alive”這樣的資訊來監控對方的運作狀況。當備份機不能在一定的時間内收到這樣的資訊時,它就接管主伺服器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的資訊時,它就釋放服務IP位址,這樣的主伺服器就開始再次提供負載均衡服務。
二、Nginx高可用方案
目前,比較流行的實作Nginx高可用方案就是:keepalived+nginx實作主備方案。這是國内企業中最為普遍的一種高可用方案。
所謂,雙機熱備其實就是指一台伺服器在提供服務時,另一台為某服務的備用狀态;當主伺服器不可用時,另外備份伺服器會擷取到主伺服器的IP,自動頂替主伺服器的功能。
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,換行即可
}
}
五、測試驗證
配置完keepalived和nginx之後,接下來我們驗證Nginx的雙機備份設定是否成功。
1、啟動主備nginx,以及keepalived。
service keepalived start
./nginx
2、啟動之後,主Nginx正常工作,分别檢視主nginx和 備nginx的eth0設定,如下圖所示:
我們可以看到:vip(192.168.101.100)綁定在主nginx的eth0上。說明此時主Nginx 正常。通路
http://192.168.101.100,Nginx可以正常通路。
3、将主nginx服務停止或将主nginx關機(相當于模拟當機),再次檢視主nginx和備nginx的eth0設定,如下圖所示:
我們可以看到:vip(192.168.101.100)已經漂移到備nginx 伺服器上。再次通路
,發現雖然主Nginx單擊,但是系統依然可以通路。說明Nginx實作了雙機熱備份,達到了高可用的目的。
最後
以上,keepalived+nginx 系統高可用的解決方案介紹完了,看上去複雜,其實配置還是比較簡單的。
推薦閱讀:
Nginx極簡入門(九)Nginx實作動靜分離! Nginx極簡入門(八)Nginx性能監控及性能狀态參數詳解! Nginx極簡入門(七)Nginx的日志管理及配置 Nginx極簡入門(六)配置Nginx負載均衡,提高系統并發性能! Nginx極簡入門(五)配置Nginx反向代理 Nginx極簡入門(四)基于域名的虛拟主機配置 Nginx極簡入門(三)基于端口的虛拟主機配置 Nginx極簡入門(二)配置基于ip的虛拟主機 Nginx極簡入門(一)如何在Linux系統編譯安裝Nginx服務 Nginx極簡實戰—Nginx伺服器高性能優化配置,輕松實作10萬并發通路量