基於雲落地SLB+Tengine實現高可用叢集負載均衡 - 中

本次分享基於618慕課網直播,更多精彩可以關注:https://class。imooc。com/sale/javaarchitect

虛擬主機

如果不用nginx,僅僅只是tomcat,要想在同一個80埠下去開多個http服務是不行的,只能開一個,但是使用nginx後,可以開多個,並且可以針對不同的域名去進行訪問和配置,這就是虛擬主機的功能。而配置中的server就是一個虛擬主機。

基於雲落地SLB+Tengine實現高可用叢集負載均衡 - 中

如上圖,使用者如果需要配置3個域名的網站,那麼就得購買3臺伺服器。而如果使用了nginx的虛擬主機功能,那麼就只需要購買一臺伺服器,隨後透過nginx的虛擬主機功能開啟3個server即可,這麼一來可以節約成本,不會造成資源浪費,可以參考下圖。

基於雲落地SLB+Tengine實現高可用叢集負載均衡 - 中

以下是虛擬主機的配置,包含了反向代理:

修改幾個html,如下: /usr/local/tengine/html中的index。html複製多份進行修改,用以區別各個頁面

雲伺服器預先配置好二級域名,如下:

配置虛擬主機server server { listen 80;

server_name imooc。imoocdsp。com;

location / {

root html;

index imooc。html;

}

}

server {

listen 80;

server_name course。imoocdsp。com;

location / {

root html;

index course。html;

}

}

server {

listen 80;

server_name teacher。imoocdsp。com;

location / {

root html;

index teacher。html;

}

}

瀏覽器訪問如下三個域名得到的結果不同: http://imooc。imoocdsp。com/ http://course。imoocdsp。com/ http://teacher。imoocdsp。com/

反向代理

虛擬主機、叢集負載均衡基於反向代理,所以得理解反向代理。反向代理就是使用者的請求會被代理伺服器(nginx/tengine)進行轉發,由代理伺服器來決定使用者的請求訪問會到達哪個內網計算機節點,那麼這種代理稱之為反向代理。

基於雲落地SLB+Tengine實現高可用叢集負載均衡 - 中

如上圖,使用者請求會先到達nginx,然後再由nginx決定這個請求最終轉發到某些內網的計算機節點,轉發過程透明,使用者不知道,並且內網的節點是無法直接被外部訪問的,必須經過nginx。我們可以舉一個生活中的例子,比如開學去學校報到,學生分班不是由自己決定的,會由教務處來決定該學生去哪個班級報到,如下圖,學生就是使用者,報到上學這個過程就是發起的請求,反向代理伺服器就是教務處,具體的某個班級就是內網計算機節點,教務處怎麼分班的這個過程學生不知道,是透明的,學生分班必須經過教務處,無法直接去上課:

基於雲落地SLB+Tengine實現高可用叢集負載均衡 - 中

常見的反向代理場景:負載均衡,虛擬主機等

題外話,什麼是正向代理,使用者請求經過公網到達目標伺服器的過程,會經過正向代理,在家裡我們用路由器,路由器之上就是寬頻運營商,他們都給你做了一層限制,比如限制網速,限制埠等,他們的作用就是正向代理。可以參考如下圖:

基於雲落地SLB+Tengine實現高可用叢集負載均衡 - 中

圖中左側,我透過路由器為自己和媳婦分別設定了上網速度,因為媳婦經常購物,給他做一些限制,這就是正向代理的基本作用了,我們請求經過自己路由器到達公網再到達右側的目標伺服器,這裡的目標伺服器就是反向代理伺服器了。舉個生活中的例子,中考高考的時候我們填志願,學生就是上網使用者,填志願最終經過教務處,教務處會給我們一定的參考意見,隨後志願分發到全國。道理是一樣的。再舉一個例子,比如有些公司,會禁止對外網的訪問,如果你要訪問外網,那麼必須啟動vpn或者代理伺服器,你的所有請求會經過這個代理,你發了什麼資料他也知道,可能會限制你訪問網盤這類網站,這個就是正向代理。

配置叢集(用阿里雲1個nginx+2個tomcat)

下面的都用到了線上的阿里雲,已經購買5臺。其中3臺搭建了tomcat,另外2臺搭建tengine。我們使用其中一臺作為演示負載均衡的效果,最終結合阿里雲的SLB負載均衡器來演示高可用。

叢集就是人多力量大,目的可以分擔流量壓力,提升整體系統的併發能力。一人搬磚總沒有多個人幫你一起搬磚來的舒服嘛。

叢集需要配置上游模組upstream,www。abc。com為上游模組的名稱。

阿里雲的tengine-master配置:

upstream www。abc。com { server 172。19。36。76:8099 weight=1; server 172。19。36。77:8099 weight=1; keepalive 32; } server { listen 80; server_name 101。133。214。131; location / { proxy_pass http://www。abc。com;# root html;# index index。html index。htm; } }

server可以配置1個或者多個,代表使用者請求進來被反向代理到這個某個tomcat節點,

upstream www。abc。com { server 192。168。1。171:8080; server 192。168。1。172:8080; server 192。168。1。173:8080;}

使用者請求透過訪問www。123。com,反向代理到upstream所對應的3個tomcat節點,這個就是3臺tomcat組成的叢集,如果說1個tomcat能夠支援的併發為150,那麼3臺就差不多是450上下。

server { listen 80; server_name www。123。com; location / { # 把請求代理到upstream對應的tomcat叢集中 proxy_pass http://www。abc。com; }}

負載均衡 - 輪詢

配置叢集的時候其實預設就有負載均衡,預設的是輪詢。負載均衡演算法有如下幾種:

輪訓,如下所示,這是預設的三節點叢集使用了預設的輪詢負載均衡演算法。輪詢就是使用者請求進來會一個一個的分別分配到這三個節點去處理。

舉兩個例子:

就好比胖頭陀和瘦頭陀去食堂打飯,有30個饅頭,不論你胖瘦高矮,食堂阿姨一人分15個饅頭。

再舉個栗子,就好比皇宮佳麗三千,你應該要幹嘛?雨露均霑吧,7個不同的妃子,每天一個輪訓著平均分配資源,對吧。

upstream www。abc。com { server 192。168。1。171:8080; server 192。168。1。172:8080; server 192。168。1。173:8080;}

負載均衡 - 權重weight

按照一定的比率去分配流量的訪問,權重越大,被訪問到的機率也就越大。一般來說伺服器的硬體配置整體效能層次不齊,有的好有的不好,所以,相對來說效能不好的權重分配少一些,效能好的伺服器權重分配高一些,這樣不同節點承載的壓力也就不同了。

舉兩個例子:

就好比胖頭陀和瘦頭陀去食堂打飯,有30個饅頭,阿姨看胖頭陀很胖,分配20個饅頭,瘦頭陀很瘦,吃的少,分配10個饅頭。

再舉個栗子,就好比皇宮佳麗三千,你應該要幹嘛?每個人有不同的喜好,甄嬛長得漂亮一些,自然權重也會高一些,咖妃長得太黑了,自然權重少一些。

具體配置如下:

upstream www。abc。com { server 192。168。1。171:8080 weight=1; server 192。168。1。172:8080 weight=3; server 192。168。1。173:8080 weight=2;}

負載均衡 - ip_hash(不演示了)

根據使用者請求過來的ip做雜湊,ip一定是固定的,所以雜湊的值也是固定的,這樣使用者請求到的tomcat節點也是固定的,這種方式可以保證使用者會話不會丟失,永遠存在,但是如果使用者切換網路,比如從wifi到4g,則會導致會話丟失。

舉個例子,我人在上海,撥打110,由於我所在的地域是上海,那麼對方接通的肯定是上海公安局,如果我現在去了南京,這個時候撥打110,那麼運營商根據我所在地分配的接聽電話就是江蘇公安局了。對吧,這是一個道理,就是根據你的地址來源進行服務節點的分配處理。

配置程式碼示例:

upstream www。abc。com { ip_hash; server 192。168。1。171:8080 weight=1 max_conns=180; server 192。168。1。172:8080 weight=3; server 192。168。1。173:8080 weight=2;}

負載均衡 - url_hash(不演示了)

和iphash同理,使用者請求,在瀏覽器中訪問的url,根據這個做hash,分配到不同的節點。

小節

常用的負載均衡演算法為 加權輪詢,iphash是用的最少甚至不用,因為會造成請求併發量傾斜,容易導致固定的某個節點宕機。

提一下動靜分離,架構師課程中,把靜態程式碼釋出到nginx,實現動靜分離。當然也可以靜態程式碼(JS/CSS/HTML)放到CDN會更好。

加餐:什麼是動靜分離

提到動靜分離就會想到前後端分離,各種分,分分合合的。

前後端分離就是前後端開發人員所做的本質工作拆開,以前寫jsp的時候,前端後端都是由同一個程式設計師去做的,隨著網際網路的發展,工作職能開始拆分,那麼前端工作量比如js/css/html這些都會由前端去做,稱之為frontEnd,後端人員負責java程式碼開發,介面提供,稱之為backEnd。這就是前後端分離。

既然前後端分離了,那麼程式碼肯定是解耦的,是兩塊不一樣的程式碼,前端歸前端,後端歸後端。那麼這個時候我們就可以藉助nginx去實現動靜分離部署,其實也就是前端透過nginx靜態資源對映,後端透過nginx實現tomcat叢集部署,如此一來,使用者請求進來到達nginx,那麼前端請求訪問靜態頁面,後端介面呼叫會透過nginx來代理到各自的tomcat節點。那麼在架構師體系功課程中,我們就是採用的前後端分離開發外加動靜分離進行部署的。具體的結構圖如下: 附:如果nginx有2臺,那麼一臺負責虛擬靜態資源,另外一臺負責反向代理也可以。本質上就是使用了2個location來做了2個虛擬主機,一個做靜態資源,一個做tomcat反向代理,動靜分離可以把動靜請求分離,減少tomcat請求壓力。ok吧。