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