1. 程式人生 > >第五章 萬無一失:網站的高可用架構

第五章 萬無一失:網站的高可用架構

內容梳理

  網站可用性(Availability),描述網站可有效訪問的特性(Usability,也可為譯可用性,強調網站的有用性,體現對使用者的使用價值)。

5.1 網站可用性的度量與考核

  5.1.1 網站可用性度量

  通常用多少個9來衡量網站的可用性,

  網站不可用時間(故障時間) = 故障修復時間點 - 故障發現(報告)時間點

  網站年度可用性指標 = (1 - 網站不可用時間/年度總時間)*100%

  2個9基本可用,3個9較高可用,4個9是具有自動回覆能力的高可用。

  5.1.2 網站可用性考核

  可用性指標是網站架構設計的重要指標,對外是服務承諾,對內是考核指標,更多使用故障分考核。

  故障分是指對網站故障進行分類加權計算故障責任的方法。

  故障分 = 故障時間(分鐘)* 故障權重

5.2 高可用的網站架構

  硬體故障是常態,網站的高可用結構設計的主要目的就是保證伺服器硬體故障時服務毅然可用、資料依然儲存並能夠被訪問,實現高可用架構的主要手段是資料和服務的冗餘備份及失效轉移。

  大型網站的分層架構及物理伺服器的分散式部署使得位於不同層次的伺服器具有不同的可用性特點。關閉服務或伺服器宕機時產生的影響也不同,高可用的解決方案也差異甚大。  

5.3 高可用的應用

  應用層主要處理網站應用的業務邏輯,因此也稱為業務邏輯層,應用的一個顯著特點是應用的無狀態性。無狀態的應用指應用伺服器不儲存業務的上下文資訊,僅根據每次請求提交的資料進行相應的業務邏輯處理,多個服務例項(伺服器)之間完全對等,請求提交到任意伺服器,處理結果完全一樣。

  5.3.1 通過負載均衡進行無狀態服務的失效轉移

  在業務量和資料量較高的情況下,當單臺伺服器不能承擔所有負載壓力時,通過負載均衡手段,將流量和資料分攤到一個叢集組成多臺伺服器上,以提高整體的負載處理能力。

   

  當叢集中的伺服器都可用時,負載均衡伺服器會把使用者傳送的訪問請求分發到任意一臺伺服器上處理。當有伺服器宕機時,負載均衡伺服器會通過心跳檢測機制發現該伺服器失去響應,就會把它從伺服器列表中刪除,而將請求傳送到其他伺服器上。    

  5.3.2 應用伺服器叢集的Session管理

  應用伺服器的高可用架構設計主要基於服務無狀態這一特性,事實上,服務總是有狀態的。

  Web應用中將這些多次請求修改使用的上下文物件稱作回話(Session),單機情況下,Session可由部署在伺服器上的Web容器管理。在負載均衡的叢集環境中,請求有可能被髮送到任意一臺伺服器上,保證每次請求獲取正確的Session更加複雜。  

  叢集環境下,Session管理的主要手段:  

  1. Session複製

  在叢集中的幾臺伺服器之間同步Session物件,使得每臺伺服器上都儲存所有使用者的Session資訊。伺服器需要使用Session,只需在本機獲取即可。

     

  叢集規模較大時,叢集伺服器之間需要大量的通訊進行Session複製,佔用伺服器和網路大量資源。

   2. Session繫結

  利用負載均衡的源地址Hash演算法實現,負載均衡伺服器總是精來源於同一Ip的請求分發到同一臺伺服器上。將Session繫結在某臺特定的伺服器上,保證Session總能在這臺伺服器上獲取,成為會話粘滯。

  

   一臺伺服器宕機,該機器上的Session也就不復存在。

   3. 利用Cookie記錄Session

  將Session記錄在客戶端,每次請求伺服器時,將Session放在請求中傳送給伺服器,伺服器處理完請求後再將修改過的Session響應給客戶端。網站沒有客戶端,可用瀏覽器支援的Cookie記錄Session。

  

  受Cookie大小限制,能記錄的資訊有限;每次請求響應帶Cookie影響效能;關閉Cookie,訪問不能正常進行。

   4. Session伺服器

  利用獨立部署的Session伺服器(叢集)統一管理Session,應用伺服器每次讀寫Session時,都訪問Session伺服器。有高可用性、伸縮性好、效能不錯、對資訊大小沒限制的特點。

  

  將應用伺服器的狀態分離,分為無狀態的應用伺服器和有狀態的Session伺服器。有狀態的Session伺服器,利用分散式快取、資料庫等進行包裝,使其符合Session的儲存和訪問要求。

5.4 高可用的服務

  可複用的服務模組為業務產品提供基礎公共服務,這些服務通常獨立分散式部署,被具體應用遠端呼叫。可複用的服務和應用一樣,也是無狀態的服務。

  高可用的服務策略:

  1. 分級管理

  運維上將伺服器進行分級管理,核心應用和服務優先使用更好的硬體。服務部署上也要進行必要的隔離,防止故障的連鎖反應。

  2. 超時設定

  一旦請求超時,通訊框架就丟擲異常,應用伺服器根據服務排程策略,選擇重試或轉移請求到其他伺服器。

  3. 非同步呼叫

  使用訊息佇列,避免一個服務失敗導致整個應用請求失敗。

  4. 服務降級

  網站訪問高峰時,對服務進行降級,保證核心應用和服務正常執行。降級有兩種手段:拒絕服務和關閉服務。

  拒絕服務,拒絕低優先順序應用的呼叫,或者隨機拒絕部分請求呼叫。

  關閉功能,關閉不重要的服務,或者服務內部關閉不重要的功能。

  5. 冪等性設計

  保證服務重複呼叫和呼叫一次產生的結果相同。

5.5 高可用的資料

  保證資料儲存高可用的手段主要是資料備份和失效轉移機制。資料備份是保證資料有多個副本,失效轉移機制保證當一個數據副本不可訪問時,可以快速切換到其他副本。

  整個網站共享通一個分散式快取叢集,單獨的應用和產品不需要部署自己的快取伺服器,只需向共享快取叢集申請快取資源即可。

  5.5.1 CAP原理

  高可用資料要保證資料永續性。資料可訪問性和資料一致性。

  CAP原理認為,一個提供資料服務的儲存系統無法同時滿足資料一致性、資料可用性、分割槽耐受性這三個條件。在大型網站中,通常會選擇強化分散式儲存系統的可用性(A)和伸縮性(P),在某種程度上放棄一致性(C)。

  資料一致性又可分為資料強一致、資料使用者一致和資料最終一致。 

  5.5.2 資料備份

  冷備份是定期將資料複製到某種介質上並物理存檔保管,備份時無法訪問資料。

  實時線上業務中使用資料熱備份,主要有非同步熱備和同步熱備兩種方式。  

  5.5.3 失效轉移

  當資料伺服器叢集中任一臺伺服器宕機,應用程式針對這臺伺服器的所有讀寫操作都需要重新路由到其他伺服器,保證資料訪問不會失敗。

  失效轉移操作包括失效確認、訪問轉移和資料恢復三部分。  

  1. 失效確認

  檢測伺服器宕機有心跳檢測和應用程式訪問失敗報告兩種。應用程式傳送訪問失敗報告後,控制中心還要再發送心跳檢測進行確認。

  2. 訪問轉移

  完全對等的儲存伺服器,一臺宕機後,應用程式根據配置直接切換到對等的伺服器上。

  儲存不對等時,重新計算路由,選擇儲存伺服器。

  3. 資料恢復

  從健康的伺服器複製資料。

5.6 高可用網站的軟體質量保證

  5.6.1 網站釋出

  網站釋出過程和伺服器宕機效果相當,釋出過程中,每次關閉叢集中一小部分伺服器,釋出完成後立即可以訪問,不影響使用者使用。  

  5.6.2 自動化測試

  使用自動化測試工具或指令碼完成測試,一鍵完成系統部署、測試資料生成、測試執行、測試報告生成等全部測試過程。

  5.6.3 預釋出驗證

  網站釋出時,先發布到預釋出機器上,確認沒有問題後再正式釋出。

  預釋出伺服器是一種特殊用途的伺服器,它和線上正式伺服器唯一不同就是沒有配置在負載均衡伺服器上,外部使用者無法訪問。  

  5.6.4 程式碼控制

  使用核心問題是如何進行程式碼管理,技能保證程式碼釋出版本的穩定正確,又能保證不同團隊的開發互不影響。

  版本控制工具SVN有主幹開發、分支釋出和分支開發、主幹釋出兩種方式。目前網站開發中主要使用分支開發、主幹釋出的方式。

  Git也是很好的版本控制工具。

  5.6.5 自動化釋出

  人的干預越少,自動化程度越高,引入故障的可能性就越小。‘’    

  火車釋出模型,基於規則驅動的流程。將每個應用看做一次火車旅行,火車定點執行,期間有若干站點,每一站都進行例行檢查,不通過的專案下車,剩下的專案繼續坐著火車旅行,知道火車到達終點(應用釋出成功)。

  5.6.6 自灰度釋出

  將叢集伺服器分成若干部分,每天只發布一部分伺服器,觀察是否穩定執行沒有故障,第二天繼續釋出一部分伺服器,持續幾天才把整個叢集全部發布完,期間如果發現問題,只需回滾已釋出的一部分伺服器即可。

5.7 網站執行監控

  “不允許沒有監控的系統上線”

  5.7.1 監控資料採集

 

  涵蓋所有非直接業務行為的資料採集和管理,包括供資料分析師和產品設計師使用的網站使用者行為日誌、業務執行資料,以及供運維工程師和開發工程師使用的系統性能資料等。

  1. 使用者行為日誌收集

  使用者行為日誌指使用者在瀏覽器上所做的所有操作及其所在的操作環境,主要有伺服器端日誌收集和客戶端瀏覽器日誌收集兩種。  

  2. 伺服器效能監控

  收集伺服器效能指標,及時判斷應用狀況,防患於未然,在初始化系統時統一部署,應用程式開發不需要關心伺服器效能監控。

  3. 執行資料報告

  監控與具體業務場景相關的技術和業務指標,執行資料要在具體程式中採集並報告。  

  5.7.2 監控管理

  根據監控資料做系統性能評估和叢集規模伸縮性預測,還可以進行風險預警、自動化負載調整,最大化利用叢集所有機器的資源。

  1. 系統報警

  某些指標超過閾值,對相關人員報警,及時採取措施。  

  2. 失效轉移

  監控系統在發現故障時主動通知應用,進行失效轉移。

  3. 自動優雅降級

  應對突然爆發的訪問高峰,主動關閉部分功能,釋放部分系統資源,保證網站核心更能正常訪問。

本章結構