2003年,Google發表論文GFS,透露解決了索引地球的海量互聯網數據的存儲問題。2006年,亞馬遜推出劃時代的AWS雲計算服務EC2和S3,開啟了改變世界IT格局的雲計算時代。谷歌,微軟,阿裏雲等等。跟著走。
上面提到的A Bite os S3 Arch如何構建壹個分布式存儲系統來支持大規模S3對象存儲。雲計算還有另外兩個重要的基礎存儲基礎架構組件,EBS(彈性塊存儲)和EFS(彈性文件服務),分別對應傳統IT基礎架構中的本地磁盤和文件存儲服務。
雲計算很重要的壹點就是超售和靈活性,所以支持EBS和EFS方案的底層基礎存儲層的支持不太可能是本地本地化方案,必須是分布式的存儲資源管理和分配系統。
然而,與S3服務相比,EBS底層的分布式存儲系統提供的IO模型實際上有很大不同。S3的基本外部接口函數是PUT/GET/DELETE,它對底層分布式文件系統的要求是Append。EBS和EFS需要支持重寫用戶的隨機地址空間,那麽如何設計底層存儲系統來支持這兩類服務呢?
對於業務架構這壹塊,目前各大互聯網公司基本都是不開源的,基礎架構也不是或者很少正面。壹方面可能會被視為商業秘密,另壹方面可能會從安全、輿論等方面考慮。
當然可以參考壹些互聯網公司的開源系統和存儲系統的論文,比如ceph、Lustre、HDFS、GlusterFS、FastDFS、Window Azure Storage、GFS等等。這些都自稱是分布式文件系統,但是在具體場景和文件的定義上有很多不同。以下幾個方面差別較大。
EBS底層的分布式存儲系統至少要保證以下幾點。
EBS底層分布式存儲系統需要提供上述重要特性,還有壹些重要的核心需求。
那麽如何在EBS底層設計和構建壹個分布式存儲系統來滿足業務的需求,也就是如何設計壹個分布式存儲系統來為上層業務提供隨機IO能力。這裏有壹些可能的方法來建立它。
對於EBS服務來說,抽象來說,它需要底層分布式文件系統能夠提供可以隨機讀寫的文件的能力。最直接的方式,可以如下圖邏輯映射。1TB Vdisk /dev/sad對應底層分布式文件系統為/foo/sda的文件。1TB地址空間中的Chunk按需分配,分配的基本單位壹般是固定的,如下圖,4MB。
Qemu等等。提供了用於停靠塊設備驅動程序的API。只要實現API來對接分布式文件系統中相應的客戶端,塊設備就可以向上輸出。
網易從0到1實現了這種構造方法。CURVE現在是開源的(百度類似於這個方案),底層抽象為典型的分布式文件系統,向服務輸出具有隨機讀寫能力的文件,以支持上層塊設備的EBS類服務。架構基本類似於經典分布式文件系統的鼻祖GFS,如下圖所示。
基礎設施
數據表面核心
底層ChunkServer基於Raft狀態機實現副本壹致性。有關更多信息,請參見Raft對等復制狀態機。所有上層用戶的寫入都依靠壹致性協議來保證多個副本的壹致性,每個用戶的塊都被分配給這些復制組。
如上圖所示
這種架構方案優點是:
該方案的缺點:
上面的構造模式1是壹個0到1的架構設計和實現。第二種構造方法主要是和圈內的童鞋溝通,細節無法研究,但從整體結構層面解釋分析沒有大問題。
其基本架構類似於Window Azure Storage的架構。Stream層構建在底層,Partition層構建在Stream層的基礎上(類似GFS),EBS方案可以構建在Partition層的基礎上(類似BigTable)。
如何支持基於這種架構的服務,需要從另壹個角度思考如何解決這個問題。回到問題的出發點,EBS隨機地址空間讀寫方案的核心是什麽?
簡單地說,塊設備為每個地址空間(例如,4KB)提供原子讀寫(PUT/GET)。換句話說,如果為每個EBS實例的每個4KB內容定義了壹個全局可編碼的惟壹鍵,那麽它的內容就是壹個4KB的固定大小值。那麽底層的分布式存儲系統就是壹個專用的分布式鍵值系統。
施工方法2基本遵循這個思路。
作為上述基本邏輯視圖的壹個示例,底層物理層的結構如下圖所示。
StreamLayer:類似於GFS/HDFS層次結構,每個流類似於壹個文件,流只支持append。Stream由盤區組成(類似HDFS/GFS的chunk),盤區使用固定復制組的方案實現多副本/EC(參考微軟PacificA協議)。範圍支持可變長度。當區段不可用時,seal/new會創建壹個新區段,並繼續提供寫入,以確保寫入的高可用性。
分區服務器:提供壹個表(根據字典
序列拆分)kv存儲服務(添加/刪除/更改/檢查)。它通過WAL實現了數據的快速及時寫入,保證了數據的持久性;然後寫入MemStore(SkipList跳表實現)。當MemStore達到固定大小時,比如128MB,Dump就變成SSTable(排序字符串表),塊緩存負責讀取和緩存SStable熱點數據。壹個分區服務器負責多個分區。
更具體的架構參考請參考紙質的書籍和資料或者Window Azure Storage的BigTable開源實現,這裏就不展開了。
在實踐層面上,上EFS實例有相當多的映射關系:
壹般來說,為了實現EFS的快照和克隆功能,壹個EFS實例壹般選擇壹個表。如果只有壹個WAL,寫入的吞吐量很容易受到影響。在上層可以通過壹些間接的業務邏輯手段,將多個相鄰的地址空間切換到不同的區域,使得上層IO可以映射到更多的區域,利用多個WAL寫能力提高帶寬。例如,地址空間按照1MB的模數分為四個獨立的連續字典序區域。
這種架構方案的優點:
抗脆弱:我覺得這是這個方案最大的優點,也是相對於第壹個方案的絕對殺手鐧。實際上很多分布式存儲系統並沒有從基層很好的考慮這個問題,或者意識到這個方案的巨大優勢。也就是說,從讀取層面來看,基本上認識到印章數據的任何副本都是可讀的。寫數據的話,寫僅限於還沒封的區塊,也就是三個磁盤,萬壹失敗可以隨時轉移。這兩點使得上層壹個表的數據分散到下層那麽多磁盤上。但從爆炸半徑來說,基本可以算是本地盤方案的爆炸半徑,甚至在故障過載的情況下,也能實現快速轉移。從這個角度來看,這基本上為分布式存儲方案徹底幹掉本地存儲方案打下了極其堅實的基礎。
這種施工方案的缺點:
方案3是類似於方案2的變體。核心區別在於構造方案2的全局排序和垃圾收集依賴於後期的比較。然而,構造方法3傾向於盡可能地將塊分類到位。
它的基本原理是通過WAL寫來保證數據的持久性,然後在內存中使用。在後臺,寫入習慣於定期隨機讀寫文件(沒錯,底層不僅需要實現AppendFile,還需要實現弱壹致的隨機讀寫文件RandomFile,多本書的數據壹致性由客戶端負責,這就引入了壹個缺點,所以很難對隨機讀寫文件做EC)。wal使用seal-new保證寫入可用性,讀取使用合並更新數據(WAL)基線數據(隨機讀寫文件數據)讀取數據。在內存中建立整個WAL內容的索引,最新的數據將直接從WAL中的WAL中讀取,否則從隨機讀寫文件中讀取。基本讀寫流程圖如下。
寫:照常寫WAL,然後更新內存索引,將最新數據的使用指向WAL。但最終轉儲其實並不是以sstable的方式,而是直接在後臺異步轉儲到RandomFile對應的隨機地址空間。
PS 1: WAL也類似於Segment,定期做檢查點(RandomFile),所有WAL段的索引都會建在內存中。WAL采用Seal/New以確保可用性。
PS2: RandomFile是壹個隨機讀寫文件。為了保證WAL長度的收斂,後臺線程會將WAL數據寫入RandomFile。RandomFile無法使用Seal-New的可用性,但它是在後臺編寫的。因此,如果發現副本失敗,後臺轉儲機制將被阻塞(這種方案會導致後臺寫入在壞盤恢復場景中長時間停滯)。
讀取:讀取會先通過Memtable找出最新的數據是否在WAL中,如果不存在則讀取RandomFile。對於RandomFile沒有達到壹致性狀態的數據,將從WAL中讀取。(PS:由於從WAL(AppendFile)到RandomFile的寫入都是三個副本,而且總是卡死,所以RandomFile的恢復可以用非常健壯的方式完成,可以直接選擇復制組中的任意壹個副本作為復制的數據源。)
這個方案在壹定程度上是可以解決的。閱讀放大,空間利用等問題。不過在克隆、快照等方面會稍微差壹點。,而且隨機讀寫文件很難做EC(EC重寫比較麻煩)。
如上所述,簡要構造了三種構造方法,並說明了它們的優缺點。沒有絕對的孰優孰劣。在實踐過程中,要結合實際業務特點和所面臨的技術條件進行選擇,這樣才能快速跟上業務發展,對方案進行中長期評估並及時調整。
形而上學地分析問題的本質是非常重要的。只有這樣,才能集中精力解決現實問題,把好鋼用在刀刃上。
簡單來說,塊設備為每個地址空間(比如4KB)提供原子讀寫(PUT/GET)。另壹方面,如果為每個EBS實例的每個4KB內容定義了壹個全局可編碼的惟壹鍵,那麽它的內容就是壹個4KB的固定大小值。那麽底層的分布式存儲系統就是壹個專用的分布式鍵值系統。
以上不同的方案,邏輯上向上抽象,都可以認為是為服務提供KV存儲。最本質的區別可以認為是分類發生的時間。總體來說,構造方案1是立即全局排序。構造方案2采用局部有序方案。架構方案3使用架構方案1和方案2之間的折衷。
另壹個重要的區別是,從堆芯可靠性的角度來看,建設方案1采用多數方案(如Raft)處理分布式封頂問題。構造方案2和3采用PrimayBackup Master(多數)Append僅處理CAP問題的特性。
相關問答:EBS在PVC產品中的添加效果如何?急求解答!!!由於ebs分子帶有極性酰胺基團,與pvc樹脂有壹定的相容性。ebs可以在加工過程中插入pvc樹脂中,減少樹脂分子間的摩擦,防止糊料達到防粘效果。但壹般來說,ebs與pvc樹脂的相容性有限,它可以從樹脂內部拉到表面,主要作為外部潤滑劑,可以避免過大的剪切應力,降低剪切熱,減少材料與加工設備的摩擦,防止材料粘在設備上,從而提高產品的尺寸精度,提高產品的表面光澤度。