1. 程式人生 > >jeesz分布式架構-分布式高可用

jeesz分布式架構-分布式高可用

html 存儲 使用 ava -s 基礎 客戶端 ice 透明

什麽是高可用
高可用HA(High Availability)是分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供服務的時間。

常見互聯網分布式架構如上,分為:
(1)客戶端層:典型調用方是瀏覽器browser或者手機應用APP
(2)反向代理層:系統入口,反向代理
(3)站點應用層:實現核心應用邏輯,返回html或者json
(4)服務層:如果實現了服務化,就有這一層
(5)數據-緩存層:緩存加速訪問存儲
(6)數據-數據庫層:數據庫固化數據存儲

分層高可用架構實踐

【客戶端層->反向代理層】的高可用
客戶端層到反向代理層的高可用,是通過反向代理層的冗余來實現的。以nginx為例:有兩臺nginx,一臺對線上提供服務,另一臺冗余以保證高可用,常見的實踐是keepalived存活探測,相同virtual IP提供服務。

自動故障轉移:當nginx掛了的時候,keepalived能夠探測到,會自動的進行故障轉移,將流量自動遷移到shadow-nginx,由於使用的是相同的virtual IP,這個切換過程對調用方是透明的。
【反向代理層->站點層】的高可用
反向代理層到站點層的高可用,是通過站點層的冗余來實現的。假設反向代理層是nginx,nginx.conf裏能夠配置多個web後端,並且nginx能夠探測到多個後端的存活性。
自動故障轉移:當web-server掛了的時候,nginx能夠探測到,會自動的進行故障轉移,將流量自動遷移到其他的web-server,整個過程由nginx自動完成,對調用方是透明的。
【站點層->服務層】的高可用
站點層到服務層的高可用,是通過服務層的冗余來實現的。“服務連接池”會建立與下遊服務多個連接,每次請求會“隨機”選取連接來訪問下遊服務。
自動故障轉移:當service掛了的時候,service-connection-pool能夠探測到,會自動的進行故障轉移,將流量自動遷移到其他的service,整個過程由連接池自動完成,對調用方是透明的(所以說RPC-client中的服務連接池是很重要的基礎組件)。
【服務層>緩存層】的高可用
服務層到緩存層的高可用,是通過緩存數據的冗余來實現的。

【服務層>數據庫層】的高可用
大部分互聯網技術,數據庫層都用了“主從同步,讀寫分離”架構,所以數據庫層的高可用,又分為“讀庫高可用”與“寫庫高可用”兩類。

【服務層>數據庫層“讀”】的高可用
服務層到數據庫讀的高可用,是通過讀庫的冗余來實現的。
既然冗余了讀庫,一般來說就至少有2個從庫,“數據庫連接池”會建立與讀庫多個連接,每次請求會路由到這些讀庫。

【服務層>數據庫層“寫”】的高可用
服務層到數據庫寫的高可用,是通過寫庫的冗余來實現的。

方法論上,高可用是通過冗余+自動故障轉移來實現的。
整個互聯網分層系統架構的高可用,又是通過每一層的冗余+自動故障轉移來綜合實現的,具體的:
(1)【客戶端層】到【反向代理層】的高可用,是通過反向代理層的冗余實現的,常見實踐是keepalived + virtual IP自動故障轉移
(2)【反向代理層】到【站點層】的高可用,是通過站點層的冗余實現的,常見實踐是nginx與web-server之間的存活性探測與自動故障轉移
(3)【站點層】到【服務層】的高可用,是通過服務層的冗余實現的,常見實踐是通過service-connection-pool來保證自動故障轉移
(4)【服務層】到【緩存層】的高可用,是通過緩存數據的冗余實現的,常見實踐是緩存客戶端雙讀雙寫,或者利用緩存集群的主從數據同步與sentinel保活與自動故障轉移;更多的業務場景,對緩存沒有高可用要求,可以使用緩存服務化來對調用方屏蔽底層復雜性
(5)【服務層】到【數據庫“讀”】的高可用,是通過讀庫的冗余實現的,常見實踐是通過db-connection-pool來保證自動故障轉移
(6)【服務層】到【數據庫“寫”】的高可用,是通過寫庫的冗余實現的,常見實踐是keepalived + virtual IP自動故障轉移

jeesz分布式架構-分布式高可用