Windows Azure Storage設計原理,微軟azure存儲架構Windows Azure Storage設計原理Windows Azure Storage(WAS)是微軟提供的云存儲服務。WAS設計的主要目標強一致性,號稱CAP都能滿足提供全球統一的存儲服務提供完善的異地容災支持WAS的名字空間WAS提供三......
Windows Azure Storage(WAS)是微軟提供的云存儲服務。
WAS設計的主要目標
強一致性,號稱CAP都能滿足
提供全球統一的存儲服務
提供完善的異地容災支持
WAS的名字空間
WAS提供三種存儲抽象,分別是表格(Table)、消息隊列(Queue)、文件(Blob),WAS存儲的每個對象(表格里的一行、隊列里的一條消息、一個文件)都對應一個全局唯一的資源URI,其中AccountName為用戶賬戶,service為存儲服務類型(table、queue、blob中的一種)。
http(s)://https://AccountName.1.core.windows.net/PartitionName/ObjectName
對于Table,PartitionName為表名,ObjectName為表內行的primary key
對于Queue,PartitioinName為隊列名字,ObjectName為隊列里消息的id
對于Blob,ObjectName為文件名,PartitionName與ObjectName相同
WAS總體架構
WAS借助DNS服務來實現全局存儲服務,Location Service負責管理用戶的賬戶信息,當用戶注冊了一個WAS賬戶后,Location Service會為用戶分配一或多個stamp來提供存儲服務,同時更新DNS里的記錄,將https://AccountName.1.core.windows.net解析到stamp對應的訪問入口。
WAS里stamp類似于集群的概念,請看下圖,MS在全球有多個機房,每個機房會部署多個WAS存儲集群(stamp),stamp內部通過副本機制來保證數據安全性,stamp間會有數據備份機制,用于異地容災,比如stamp001在美國、歐洲、亞洲的機房各有一份數據,任意一個機房故障,都能從其他機房的對等stamp里讀到用戶數據。
一個stamp典型的規模,1020個機架,每個機架18個存儲節點,約提供2PB的存儲空間;下一代WAS,每個stamp將提供30PB的存儲空間(猜想主要是單塊盤存儲空間增加)。
Stamp內部架構
單個stamp內部,主要分為三個層次
Stream Layer:提供可靠的文件存儲(類比GFS)
Partion Layer:提供Table、Queue、Blob存儲的邏輯抽象,實際數據存儲依賴Stream Layer(類比bigtable)
Front End:存儲資源訪問代理,接受用戶的請求,通過Partition Layer獲取到數據,返回給用戶
Stream Layer設計
Stream Layer可以理解為提供可靠存儲的分布式文件系統,提供層次性的命名空間,如下圖,Stream Layer存儲的Foo文件。
Foo文件由多個extent組成(類似GFS里的block的概念,但非定長,每個extent存儲時對應一個NTFS文件),extent由多個block組成。extent創建時,會對應多個副本,客戶端可以不斷以block為單位(1或多個block)向extent追加數據,每個block會計算一份校驗信息用于檢查數據完整性,每次從extent讀取數據時,都需要讀取整個block的數據來校驗數據完整性;每個extent還對應一個index文件,用于映射[extent,offset]到block。(partition layer來說,它會維護每個對象存儲在stream layer的[文件,extent,offset]作為對象的位置索引信息。)
Stream Layer主要包含Stream Manager(SM,相當于元數據服務器)和Extent Node(EN,相當于存儲節點)。
SM的主要職責:
維護名字空間以及所有文件及extent的狀態
管理所有EN的運行狀態
為EN創建和分配extent
當有EN宕機時,復制缺少副本的extent
對只讀的extent進行earsure code編碼
extent一旦創建,便不可更改,只能追加數據,當extent到達一定長度時,客戶端(Partition Layer)可以將extent封裝(seal)起來,封裝后的extent不能再被更新,如果文件要繼續追加數據,客戶端可以向SM請求創建新的extent,然后往新的extent里追加數據,在SM看來,文件就是由多個extent順序連接而成。
extent的多個副本中,有一個是master,其它的副本是slave,每次針對extent的追加操作,客戶端都會將請求發快遞至master,由master完成整個追加過程,master負責對所有的追加操作進行排序,然后決定追加操作在extent上的偏移(offset信息),同時請求多個slave在同樣的offset上往extent追加數據,當所有副本都追加成功時,才認為追加操作成功。
如果在追加的過程種出現錯誤(只有部分副本追加成功),Stream Layer與客戶端(Partition Layer)的約定是,客戶端進行重試或是封裝當前extent(以多個副本中extent的commit length最小的為準,commit length表示當前extent追加了多少數據),創建新的extent來追加數據。這個約定也意味著,同一個條記錄可能在extent上追加多次,這就要求上層業務能夠處理這種重復的記錄。
Stream Layer的一些優化:
對封裝后的extent(只讀)進行earsure code編碼,用于節省存儲空間。
接收到讀請求時,如果當前EN有很多請求在排隊,或是有請求排隊超過一定時間,則直接拒絕服務,讓客戶端重試其它副本
每個EN使用一塊單獨的盤(通常是ssd)做日志盤(cache),當EN執行追加操作時,會將請求的數據先追加到日志盤,同時寫到EN上的數據盤(不刷盤,等待OS后臺刷盤)。
Partition Layer設計
Partition Layer在Stream Layter的基礎上抽象出Table、Queue存儲邏輯,主要由Partition Manager(PM)和Partition Server(PS)組成,PM是管理節點,負責維護一個全局的試圖,而實際的讀寫操作都由PS完成。
為了方便描述,這里以存儲Table為例說明。為了向用戶提供表格的語義,在Partition layer會有一個有序的大表,存儲所有用戶的所有數據,每一行對應用戶存儲的一條表記錄,考慮這張表非常大,單個server不可能服務過來,這張表被劃分成很多個Range,然后均分到多個PS上,而PM維護一張Range==gt;PS的映射表,Front End接受到用戶請求時,會先從PM拿到映射表,然后將請求定向至負責對應range的PS上,Front End拿到映射表后會緩存在本地,并在映射表變化時更新。
每個PS會負責多個Range的數據,PS實際不存儲數據,數據存儲是由底層的Stream Layer完成,每個Range包含一個用于存儲操作日志的Commit Log文件和一個存儲行數據的Row Data文件;同時Range被加載后,還會產生一些內存的數據結構。
Memory Table:內存表,記錄對于該range的每一次更新。
Index Cache:表索引的緩存,索引每行數據在Row Data文件里的偏移位置。
Row Data Cache:行緩存,緩存行數據,與Index Cache分離的原因主要是盡量讓所有Index的數據都能加載到內存。
當有新的行要寫到某個Range時,首先會將行數據追加到Commit Log里,然后將行數據寫到Memory Table,這時就可以向客戶端(Front End)返回寫成功。當Memory Table使用的內存超出閾值時,會做一次checkpoint操作,將Memory Table里的數據寫至Row Data文件。
當Range里的數據太多時,會導致負責該Range的PS負載很高,這時PM可以將一些大的Range進行分裂,就部分Range交由負載較低的PS負責(PS本身不持久化數據,PS只需要加載Range對應的元數據即可服務針對該Range的請求);相反,當某些Range由于數據刪除導致數據很少時,PM可以將相鄰的Range進行合并;最終使得各個PS的負載盡量均衡。
特別聲明:以上文章內容僅代表作者本人觀點,不代表ESG跨境電商觀點或立場。如有關于作品內容、版權或其它問題請于作品發表后的30日內與ESG跨境電商聯系。
二維碼加載中...
使用微信掃一掃登錄
使用賬號密碼登錄
平臺顧問
微信掃一掃
馬上聯系在線顧問
小程序
ESG跨境小程序
手機入駐更便捷
返回頂部