jeesz分散式架構-分散式高可用
什麼是高可用
高可用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自動故障轉移