上一篇談了一些基本觀念,現在我們要來進入主題了。

什麼是大架構,簡單的說,例如我今天一台機器,可以服務200人同時連線,但因為公司要辦活動,所以預計這一段時間會有1000人同時連線進來,為了可以同時服務這100人,所以我們啟動了五台機器同時運作,來解決這個問題。

聽起來似乎很簡單、也很合理,不過我們仔細來研究,就會發現,問題不是想像中的那麼簡單,讓我們一個一個來討論問題與解決方法。

Load Balance(又叫分流、負載平衝)設計

假設我們今天同時啟動了五台機器,不可能讓相同的DNS同時對到五台機器的IP,所以為了讓五台機器可以平均被活用,我們必須在五台機器前,架設一台Load Balance的機器,來達到分流的效果,可以參考下圖。

Untitled.png

從上圖可以看得出來,我們多了一台Load Balance機器,來管理後方的五台機器。在Load Balance上有幾個必須做的設定:

  1. 設定後端機器的IP,這樣Load Balance才知道要管理那幾台機器。

  2. 設定判斷後端機器是否正常的方法。通常有幾種方式來判斷後端的機器是否處於正常服務狀態,例如透過SSH、HTTP(S)等,來判斷後端是否是處於一個正常狀態。在Web開發時,建議使用HTTP(S)方式來判斷,畢竟機器正常(SSH可連入),不代表我們的Server程式也正常(HTTP可連入)。

因應檢測結果,不正常的後端機器,Load Balance會將其排除於服務外,並持續檢測,直到判斷為正常後,再重新加入到服務內。

  1. HTTPS的設定,因為HTTPS不單單是放在後端機器了,所以在Load Balance上,也必需針對HTTPS做設定。

  2. 設定分流的基準,可以用CPU或記憶體的用量(usage),來判斷這台後端機器是否是忙錄,決定要不要將使用者導向這台後端機器。

分流與程式的變更

大概瞭解Load Balance後,再回來從程式設計的角度來看,需要變更的只有:

  • 可讓Load Balance判斷後端服務器是否正常的簡單網頁,建議儘量簡單,以減少內部網路的流量。

Load Balance的功能與使用者的互動

接下來我們再來看看,如果今天「使用者A」進行了「登入」、「查詢資料」二件事情時,Load Balance可能會有什麼做法:

Load Balance 作法一:persistence-導到相同的機器

大架構-負載平衝(persistence).png

這個作法我們比較可以瞭解,因為當初我們在寫程式時,都是以使用者會連到同一台機器上的前提下,來寫程式的,所以當這個使用者的Session仍存在時,我們會一直將它導到同一台主機上,直到Session失效。

不過這樣的分流作法,有可能會產生的問題是:

  1. 當公司活動的參加人數比想像中的人多時,假設現在已經有1200人連到機器上,我們為了分流時,加了第六台機器,那麼這1200人,會有人被分流到這六台機器上嗎?答案是不會,因為在Load Balance上已經記憶了這1200人應該連到這五台機器上了,只有1201及之後的人,才有可能被導到第六台機器上服務。

  2. 因為Session的資料在固定的機器上,所以如果使用者今天登入到第三台機器後,結果第三台機器因故無法運作,所以使用者又被導到第四台機器上時,使用者儲存在Session的資料都會不見,造成使用者必須重新登入。

 

Load Balance 作法二:affinity-任意導到某一台機器

大架構-負載平衝(affinity).png

這個作法的彈性比較大,由Load Balance根據後端機器的忙錄程度,來決定要將使用者導到那一台機器。但這種作法不會有問題呢?答案是會的。

根據圖像來看,很明顯的,使用者登入的Session記錄是儲在Server1上頭,而使用者被導到Server5去查詢資料時,Server5在本機上查不到使用者Server1上的Session,所以Server5會判斷為使用者未登入,而重新將使用者導到導入頁面。

很明顯的,各台機器有各自的Session,因為Session根據伺服器的預設,是存放在本機上的;而為了解決這個問題,所以前人們發展了一套「共有Session」的機制。

arrow
arrow

    JAVA Programmer 發表在 痞客邦 留言(2) 人氣()