可擴展架構設計的三個維度


業界對於可擴展的系統架構設計有一個朴素的理念,就是:

通過加機器就可以解決容量和可用性問題

這一理念在“雲計算”概念瘋狂流行的今天,得到了廣泛的認可!對於一個規模迅速增長的系統而言,容量和性能問題當然是首當其沖的。但是隨着時間的向前,系統規模的增長,除了面對性能與容量的問題外,還需要面對功能與模塊數量上的增長帶來的系統復雜性問題以及業務的變化帶來的提供差異化服務問題。而許多系統,在架構設計時並未充分考慮到這些問題,導致系統的重構成為常態,從而影響業務交付能力,還浪費人力財力!

對此,《可擴展的藝術》一書提出了一個更加系統的可擴展模型—— AKF可擴展立方 (Scalability Cube)。這個立方體中沿着三個坐標軸設置分別為:X、Y、Z。

X軸擴展 —— 關注水平的數據和服務克隆,也就是前文提到的“加機器解決問題”
Y軸擴展 —— 關注應用中職責的划分,比如數據類型,交易執行類型的划分 
Z軸擴展 —— 關注服務和數據的優先級划分,如分地域划分

整個擴展模型,用下圖來表示,其中原點代表完全無擴展的狀態。

一.X軸擴展

X軸擴展與我們前面朴素理念是一致的,通過絕對平等地復制服務與數據,以解決容量和可用性的問題。我們以生產汽車的工廠來舉例:假設一個車間能完整的生產一輛汽車,為了短時間內生產更多的汽車,我們可以建設更多的車間,任何新增車間除了工作的效率可能不同之外,都是一個新的復制品,也能提供與原來車間相同的工作,生產出完整的汽車。給復制品分配工作就是一個X軸擴展的一個完美示例,說明了X軸擴展的思路,即把工作無偏向的分配給復制品,每個復制品在不考慮生產效率的情況下,誰來做這項工作是無偏向的, 各個復制品之間不共享任何內容 。

而在工程技術上來講,X軸擴展主要有以下兩種技術方案:

1.負載均衡

故名思議,負載均衡就是將用戶的訪問請求通過負載均衡器,均衡分配到由各個“復制品”組成的集群中去。當某個復制品出現故障,也能輕易地將相應“工作”轉移給其它的復制品來“代為完成”。這中間涉及到的工程技術點包括了反向代理,DNS輪詢,哈希負載均衡算法(一致性哈希),動態節點負載均衡(如按CPU,I/O)等。它的難點在於要求集群中的“復制品”是不共享任何內容,也就是我們常說的 無狀態 。

2.數據復制

數據復制是指在數據存儲層進行絕對平等地數據遷移,用於解決存儲層I/O瓶頸以及可用性上的問題。由於存在多個復制品存儲,為了使得每個復制品提供無差異的數據服務,我們需要在復制品之間同步或異步地復制數據。數據復制的方式包括了主從同步(常見的讀/寫分離),雙主同步等。因為數據存儲天生就是有狀態的,數據復制的難點在於 一致性 的保證上,為了一致性的保證,從而也衍生了很多復雜的技術,比如Paxos選舉算法等。

二.Y軸擴展

Y軸擴展表示的是根據數據的類型或者交易執行的類型(或者兩者都有)來划分工作職責。一般稱為面向服務或面向資源的擴展。我們再以生產汽車的工廠來舉例:如亨利.福特所做的一樣,將汽車制造的工序按專業性分成不同車間和流水線,不再是一個車間負責完成100%的任務,制造一輛完整的汽車,而是讓這每個車間都執行一些子任務,如安裝發動機,噴漆,安裝玻璃等等。這樣的分工,益處是明顯的,每個車間負責的 任務更簡單 ,從而能更專業更高效的完成生產。

與汽車工廠的分工類似,為了降低系統復雜度,Y軸擴展會將龐大的整體應用拆分為一組服務。每個服務實現一組相關的功能,如訂單管理、客戶管理等。在工程上常見的方案是 服務化架構(SOA) 。比如對於一個電子商務平台,我們可以拆分成不同的服務,組成下面這樣的架構:

但通過觀察上圖容易發現,當服務數量增多時,服務調用關系變得復雜。為系統添加一個新功能,要調用的服務數也變得不可控,由此引發了服務管理上的混亂。所以,一般情況下,需要采用服務注冊的機制形成服務網關來進行服務治理。系統的架構將變成下圖所示:

同時,為了提升單個服務的可用性和容量, 對每一個服務進行X軸擴展划分 。

三.Z軸擴展

Z軸擴展通常是指基於請求者或用戶獨特的需求,進行系統划分,並使得划分出來的子系統是相互隔離但又是完整的。繼續以生產汽車的工廠來舉例:福特公司為了發展在中國的業務,或者利用中國的廉價勞動力,在中國建立一個完整的子工廠,與美國工廠一樣,負責完整的汽車生產。這就是一種Z軸擴展。

對於系統而言,Z軸擴展一般是為了滿足差異性的需求或者是為了安全隔離而采取的擴展措施。比如為了提供VIP用戶服務,可以將系統完整地復制一份出來,與普通用戶所使用的系統完全隔離開來;再如,針對不同的地域用戶,系統自動切換到對應地域的子系統,為用戶提供服務,都可以認為是Z軸擴展。同時,在系統的灰度部署上,我們也通常使用Z軸擴展來完成。

工程領域常見的Z軸擴展有以下兩種方案:

1.單元化架構

在分布式服務設計領域,一個單元(Cell)就是滿足某個分區所有業務操作的自包含閉環。如上面我們說到的Y軸擴展的SOA架構,客戶端對服務端節點的選擇一般是隨機的,但是,如果在此加上Z軸擴展,那服務節點的選擇將不再是隨機的了,而是每個單元自成一體。如下圖:

2.數據分區

為了性能數據安全上的考慮,我們將一個完整的數據集按一定的維度划分出不同的子集。 一個分區(Shard),就是是整體數據集的一個子集。比如用尾號來划分用戶,那同樣尾號的那部分用戶就可以認為是一個分區。數據分區為一般包括以下幾種數據划分的方式:

數據類型(如:業務類型)
數據范圍(如:時間段,用戶ID)
數據熱度(如:用戶活躍度,商品熱度)
按讀寫分(如:商品描述,商品庫存)

當然,數據分區也是有代價的,它將增加數據運維的難度,關聯搜索的復雜度增加等。

總結:

一個在可擴展性上設計良好的系統,會充分考慮三個維度上的可擴展性。X軸上擴展處理的是平台或系統執行的交易量或工作量增長,雖然X軸擴展能夠很好處理交易量的增長,但當系統復雜度的大幅度增加,或用戶數量增加以及差異化服務需求出現,X軸擴展就難以應付了,如是我們可以通過Y軸擴展來處理系統復雜度增長的問題以及Z軸擴展來處理差異性化需求的問題。而當采用的擴展坐標軸不止一條時,那么 X軸擴展總是其它擴展方法的次級划分 。同時,這三個維度擴展性,使得系統性能上改善有了更多的方向,對於系統性能優化,也是至關重要。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM