1. 程式人生 > >Nginx+Tomcat+lvs+Keepalived搭建的高可用架構

Nginx+Tomcat+lvs+Keepalived搭建的高可用架構

這裡寫圖片描述
上圖所示是用Nginx做前端伺服器,Tomcat做後端伺服器搭建的高可用架構,其中Memcache用來快取session,後端伺服器都從memcache中獲取session,避免了session不一致的問題。但是這個架構存在明顯的兩個問題:
一、如果前端的Nginx伺服器掛了,系統就掛了
二、因為上形、下形流量都要走前端Nginx伺服器,所以Nginx伺服器的頻寬和IO將會是系統的瓶頸所在。
解決問題一:新增一個Nginx的從伺服器,使用Keepalived來監聽主Nginx伺服器。若主Nginx掛機,則將虛擬IP“切換”到從伺服器。其核心是vrrp協議(虛擬IP漂移協議)。當然也可以編寫一個shell指令碼來監聽。
解決問題二:核心的思想是“分流”,如下圖:
這裡寫圖片描述


就是說,從後端伺服器響應的資料直接返回到客戶端瀏覽器,而不經過Nginx前端伺服器,瓶頸就不在Nginx前端伺服器了。但是這裡又有一個問題,就是,客戶端會接收直接從後端伺服器返回的資料嗎?答案是不會。因為http協議的底層是tcp協議,而tcp協議是基於握手的協議,第一次客戶端是與Nginx前端伺服器進行握手並提交請求的,所以,它只能接受Nginx前端伺服器的響應資料。所以,為了讓客戶端能夠接收後端伺服器的響應資料,我們採取一種“IP欺騙的技術”。
簡單地說就是響應資料包的包頭中會有目的IP和原IP,我們只需要將原IP改為Nginx前端伺服器中的虛擬IP即可(前端伺服器與客戶端是基於虛擬IP握手的)。但是為了達到這個目的,就需要在後端伺服器中都繫結那個虛擬IP,這樣就又會有新的問題,就是因為前端伺服器與後端伺服器是通過內部區域網通訊的,那麼由於後端伺服器有同樣的虛擬IP,就會導致前端伺服器的廣播出現紊亂,(因為所有機器的IP都一樣),為了解決這個問題,需要將後端伺服器中的繫結的虛擬IP“隱藏起來”。具體的方法可以在繫結虛擬IP時新增錯誤的子網掩碼,這樣就不會在路由器中註冊了,即“隱藏”了。
這個過程還是挺複雜的,而LVS就可以通過簡單的配置來達到IP欺騙的目的。
這裡寫圖片描述

這就是一個使用lvs的DR模式搭建的高可用架構。其中後端伺服器可以使用Tomcat、Nginx、Httpd等。具體的配置見lvs官網
其中LVS-BACKUP與LVS-ACTIVE仍然是通過Keepalived監聽的。這樣同時可以達到對後端伺服器的健康檢查的目的。