作者:陳啟煌 / 臺灣大學計算機及資訊網路中心程式設計組程式設計師兼副組長
面對雲時代的來臨,網頁系統設計朝向高可用性的雲端架構已是主流趨勢, 如何將傳統網頁系統改為高可用性系統架構,提供使用者全天候不中斷的服務?
每個使用者都希望在他們使用系統的時候,系統能很快的回應,平順的完成他們想的做的事務;相同的,IT工程師願望也是可以達成這樣的任務。但要達成這個任務其實要克服不少問題,例如:網頁交易是否很複雜?同時間是否有很多人在使用系統?硬體設備會不會臨時有意外狀態?有沒有人會惡意攻擊你?老闆肯出多少預算做這件事?…等等,一連串的問號等著工程師去解決。
過去的一般的資訊系統架構大致如圖一所示,使用者存取一個網頁,會通過防火牆、由網頁伺服器回應使用者需求去後端資料庫存取資料,呈現網頁回傳給使用者。如圖所示如果有三個使用者A、B、C,同時使用系統,其系統路徑會是相同的。如圖所示,這個系統路徑上:防火牆、網頁伺服器、資料庫伺服器,都是只有配置一台設備;如果任何一台設備忙不過來或當機會造成系統瓶頸或是系統停擺、服務中斷、客服電話湧入,填不完的資安表單等等…
圖一 單一路徑系統架構
為了解決這個問題,最直覺的方法是每個系統路徑上的機器都多設置至少一台,讓機器不再發生單點故障(Single Failure Point)的問題;不過事情並沒有這麼單純,如果只是純查詢的系統,資料庫放同樣的資料,網頁伺服器放同樣的程式,資料只讀不寫;基本上,走哪個路徑查詢結果都會一樣。但事實上沒幾個系統是這麼單純的,大部分會有寫入的動作,包含上傳檔和或更新資料庫,如果未妥善處理,會造成檔案/資料庫不一致或破壞系統資料的唯一性。如此,雖然達成高可用性,但卻破壞了資訊系統的一致性。
圖二 高可用性系統架構
高可用性的系統架構,以圖二簡單描述容錯的情境,使用者A原本被分配到第一台網頁伺服器服務,使用期間萬一第一台網頁伺服器突然故障,系統會幫忙把使用者A導引到其他台網頁伺服器,達成服務不中斷的目的。
比較圖一和圖二,除了把多建置幾套設備外,需要這些設備能合作無間,一起達成高可用性的:
1. 系統硬體設置:
網路設備的備援設定,防火牆、Layer4 Switch 這些設備可以設定成雙主動式(Active-Active mode),兩套設備同時運作著,平均處理網路流量,也可防止單點故障。不過前提是兩套設備的設定要一致,且可以主動偵測另一套機器的狀態,在異常時接手取代其功能。 網站伺服器群依照系統流量決定伺服器數量,近年來大部分已經將伺服器虛擬化了,方便動態調整伺服器數量,節省成本。 關於資料庫硬體設置,如果預算允許可以建立成雙主動式架構(如Oracle RAC),如此百分之百發揮兩台資料伺服器的運算能力;否則可以建置成Active/Standby叢集架構,如MS SQL Server,將Database 設定成叢集保護的服務,實現容錯機制也可防止單點故障的意外。
2. 系統軟體設置及變更:
如果負擔不起Layer4 Switch硬體費用,目前作業系統也有其他高可用性的方案,可參考Windows 2012 R2 網路負載平衡(Network Load Balancing)或Linux 的負載平衡套件(HAProxy)由網頁伺服器群去實現負載平衡的機制。網頁伺服器群的系統設定及存檔需保持一致,解決方法除了共享硬碟外,最常用的方式是用Rsync 之類的遠端同步軟體讓所有伺服器的檔案系統維持一致。 除此此外,多台網頁伺服器一起服務常會衍生出同時(Concurrent)的問題,舉例來說,原本單一台伺服器,很容易在應用程式層設計Semaphore 機制保護Critical Section 中的程式不被多個程序(Process)或執行緒(Thread)同時執行,造成像售票系統一票兩賣的問題。要確保多台伺服器各自執行程式不發生同時性的問題,一般會將保持唯一性的工作移至資料庫的Transaction 上,利用資料庫Transaction 維持一致性狀態(consistency state)機制來確保多個伺服器同時執行,也不會發生不一致的狀態。
3. 硬體間的互動設置:
如圖二所示,使用者的的系統路徑是由Layer 4 Switch調配的,Layer 4 Switch要設定成能監測後端網頁伺服器群的每台伺服器狀況,才能在某一台網頁伺服器出問題時,適時將故障伺服器的流量重新平均配置到其他正常的伺服器上,達到負載平衡的效果。
4. 軟硬體間的互動設置:
一般連續性網頁交易的結果會存在伺服器上的Session服務,上傳的檔案也會放在那台網頁伺服器上的硬碟中;不過這樣的設計如果那台網頁伺服器故障,使用者重新被配置到其他台網頁伺服器,會找不到原來的Session 或檔案,輕則造成交易失敗重來,嚴重的會導致資料不一致。解決方法為建置共用的Session Server或網路硬碟(NAS or SAN 成本不同),如此就可以解決重配路徑時導致的資料不一致。
資料庫叢集(Database Cluster),在兩台叢集主機上都有資料庫服務,透過Windows Server 容錯轉移叢集(Failover Clustering),必要時將資料庫服務轉移到另一個可用的節點上,達到容錯的效果,提供不中斷的資料庫服務。
改採高可用性的系統架構,遇到複雜的網頁交易,可以將部分結果存到共用的Session Server,避免機器故障時需要整個重來;遇到同時間很多人來使用系統,瓶頸會發生在網頁伺服器,可以動態調整伺服器數量,維持服務品質;每個環節都已經避開單點故障的問題,臨時硬體出狀況,系統會自動備援不至停擺;遇到惡意攻擊如分散式阻斷服務攻擊(DDOS),可在防火牆上設定阻擋;建置成本一定比原來的架構多,如果預算不夠可以視風險大的部分改善,或是改採較便宜的方案施做。如此之前所有的問號都有了解決方法,使用者的期望也不會造成IT人員的夢魘,在軟硬體合作無間下提供高可用性及一致性的優質服務。