Windows Azure Storage設(shè)計(jì)原理

來(lái)源:知乎
作者:張友東
時(shí)間:2020-07-13
2903
Windows Azure Storage(WAS)是微軟提供的云存儲(chǔ)服務(wù)。下面簡(jiǎn)單談?wù)勊脑O(shè)計(jì)原理。

Windows Azure Storage(WAS)是微軟提供的云存儲(chǔ)服務(wù)。

WAS設(shè)計(jì)的主要目標(biāo)

強(qiáng)一致性,號(hào)稱CAP都能滿足

提供全球統(tǒng)一的存儲(chǔ)服務(wù)

提供完善的異地容災(zāi)支持

WAS的名字空間

WAS提供三種存儲(chǔ)抽象,分別是表格(Table)、消息隊(duì)列(Queue)、文件(Blob),WAS存儲(chǔ)的每個(gè)對(duì)象(表格里的一行、隊(duì)列里的一條消息、一個(gè)文件)都對(duì)應(yīng)一個(gè)全局唯一的資源URI,其中AccountName為用戶賬戶,service為存儲(chǔ)服務(wù)類型(table、queue、blob中的一種)。

http(s)://https://AccountName.1.core.windows.net/PartitionName/ObjectName

對(duì)于Table,PartitionName為表名,ObjectName為表內(nèi)行的primary key

對(duì)于Queue,PartitioinName為隊(duì)列名字,ObjectName為隊(duì)列里消息的id

對(duì)于Blob,ObjectName為文件名,PartitionName與ObjectName相同

WAS總體架構(gòu)

ia_300000002.jpg

WAS借助DNS服務(wù)來(lái)實(shí)現(xiàn)全局存儲(chǔ)服務(wù),Location Service負(fù)責(zé)管理用戶的賬戶信息,當(dāng)用戶注冊(cè)了一個(gè)WAS賬戶后,Location Service會(huì)為用戶分配一或多個(gè)stamp來(lái)提供存儲(chǔ)服務(wù),同時(shí)更新DNS里的記錄,將https://AccountName.1.core.windows.net解析到stamp對(duì)應(yīng)的訪問入口。

WAS里stamp類似于集群的概念,請(qǐng)看下圖,MS在全球有多個(gè)機(jī)房,每個(gè)機(jī)房會(huì)部署多個(gè)WAS存儲(chǔ)集群(stamp),stamp內(nèi)部通過(guò)副本機(jī)制來(lái)保證數(shù)據(jù)安全性,stamp間會(huì)有數(shù)據(jù)備份機(jī)制,用于異地容災(zāi),比如stamp-001在美國(guó)、歐洲、亞洲的機(jī)房各有一份數(shù)據(jù),任意一個(gè)機(jī)房故障,都能從其他機(jī)房的對(duì)等stamp里讀到用戶數(shù)據(jù)。

ia_300000003.jpg

一個(gè)stamp典型的規(guī)模,10-20個(gè)機(jī)架,每個(gè)機(jī)架18個(gè)存儲(chǔ)節(jié)點(diǎn),約提供2PB的存儲(chǔ)空間;下一代WAS,每個(gè)stamp將提供30PB的存儲(chǔ)空間(猜想主要是單塊盤存儲(chǔ)空間增加)。

Stamp內(nèi)部架構(gòu)

單個(gè)stamp內(nèi)部,主要分為三個(gè)層次

Stream Layer:提供可靠的文件存儲(chǔ)(類比GFS)

Partion Layer:提供Table、Queue、Blob存儲(chǔ)的邏輯抽象,實(shí)際數(shù)據(jù)存儲(chǔ)依賴Stream Layer(類比bigtable)

Front End:存儲(chǔ)資源訪問代理,接受用戶的請(qǐng)求,通過(guò)Partition Layer獲取到數(shù)據(jù),返回給用戶

Stream Layer設(shè)計(jì)

Stream Layer可以理解為提供可靠存儲(chǔ)的分布式文件系統(tǒng),提供層次性的命名空間,如下圖,Stream Layer存儲(chǔ)的Foo文件。

ia_300000004.jpg

Foo文件由多個(gè)extent組成(類似GFS里的block的概念,但非定長(zhǎng),每個(gè)extent存儲(chǔ)時(shí)對(duì)應(yīng)一個(gè)NTFS文件),extent由多個(gè)block組成。extent創(chuàng)建時(shí),會(huì)對(duì)應(yīng)多個(gè)副本,客戶端可以不斷以block為單位(1或多個(gè)block)向extent追加數(shù)據(jù),每個(gè)block會(huì)計(jì)算一份校驗(yàn)信息用于檢查數(shù)據(jù)完整性,每次從extent讀取數(shù)據(jù)時(shí),都需要讀取整個(gè)block的數(shù)據(jù)來(lái)校驗(yàn)數(shù)據(jù)完整性;每個(gè)extent還對(duì)應(yīng)一個(gè)index文件,用于映射[extent,offset]到block。(partition layer來(lái)說(shuō),它會(huì)維護(hù)每個(gè)對(duì)象存儲(chǔ)在stream layer的[文件,extent,offset]作為對(duì)象的位置索引信息。)

Stream Layer主要包含Stream Manager(SM,相當(dāng)于元數(shù)據(jù)服務(wù)器)和Extent Node(EN,相當(dāng)于存儲(chǔ)節(jié)點(diǎn))。

ia_300000005.jpg

SM的主要職責(zé):

維護(hù)名字空間以及所有文件及extent的狀態(tài)

管理所有EN的運(yùn)行狀態(tài)

為EN創(chuàng)建和分配extent

當(dāng)有EN宕機(jī)時(shí),復(fù)制缺少副本的extent

對(duì)只讀的extent進(jìn)行earsure code編碼

extent一旦創(chuàng)建,便不可更改,只能追加數(shù)據(jù),當(dāng)extent到達(dá)一定長(zhǎng)度時(shí),客戶端(Partition Layer)可以將extent封裝(seal)起來(lái),封裝后的extent不能再被更新,如果文件要繼續(xù)追加數(shù)據(jù),客戶端可以向SM請(qǐng)求創(chuàng)建新的extent,然后往新的extent里追加數(shù)據(jù),在SM看來(lái),文件就是由多個(gè)extent順序連接而成。

extent的多個(gè)副本中,有一個(gè)是master,其它的副本是slave,每次針對(duì)extent的追加操作,客戶端都會(huì)將請(qǐng)求發(fā)送至master,由master完成整個(gè)追加過(guò)程,master負(fù)責(zé)對(duì)所有的追加操作進(jìn)行排序,然后決定追加操作在extent上的偏移(offset信息),同時(shí)請(qǐng)求多個(gè)slave在同樣的offset上往extent追加數(shù)據(jù),當(dāng)所有副本都追加成功時(shí),才認(rèn)為追加操作成功。

如果在追加的過(guò)程種出現(xiàn)錯(cuò)誤(只有部分副本追加成功),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來(lái)追加數(shù)據(jù)。這個(gè)約定也意味著,同一個(gè)條記錄可能在extent上追加多次,這就要求上層業(yè)務(wù)能夠處理這種重復(fù)的記錄。

Stream Layer的一些優(yōu)化:

對(duì)封裝后的extent(只讀)進(jìn)行earsure code編碼,用于節(jié)省存儲(chǔ)空間。

接收到讀請(qǐng)求時(shí),如果當(dāng)前EN有很多請(qǐng)求在排隊(duì),或是有請(qǐng)求排隊(duì)超過(guò)一定時(shí)間,則直接拒絕服務(wù),讓客戶端重試其它副本

每個(gè)EN使用一塊單獨(dú)的盤(通常是ssd)做日志盤(cache),當(dāng)EN執(zhí)行追加操作時(shí),會(huì)將請(qǐng)求的數(shù)據(jù)先追加到日志盤,同時(shí)寫到EN上的數(shù)據(jù)盤(不刷盤,等待OS后臺(tái)刷盤)。

Partition Layer設(shè)計(jì)

Partition Layer在Stream Layter的基礎(chǔ)上抽象出Table、Queue存儲(chǔ)邏輯,主要由Partition Manager(PM)和Partition Server(PS)組成,PM是管理節(jié)點(diǎn),負(fù)責(zé)維護(hù)一個(gè)全局的試圖,而實(shí)際的讀寫操作都由PS完成。

ia_300000006.jpg

為了方便描述,這里以存儲(chǔ)Table為例說(shuō)明。為了向用戶提供表格的語(yǔ)義,在Partition layer會(huì)有一個(gè)有序的大表,存儲(chǔ)所有用戶的所有數(shù)據(jù),每一行對(duì)應(yīng)用戶存儲(chǔ)的一條表記錄,考慮這張表非常大,單個(gè)server不可能服務(wù)過(guò)來(lái),這張表被劃分成很多個(gè)Range,然后均分到多個(gè)PS上,而PM維護(hù)一張Range==>PS的映射表,F(xiàn)ront End接受到用戶請(qǐng)求時(shí),會(huì)先從PM拿到映射表,然后將請(qǐng)求定向至負(fù)責(zé)對(duì)應(yīng)range的PS上,F(xiàn)ront End拿到映射表后會(huì)緩存在本地,并在映射表變化時(shí)更新。

ia_300000007.jpg

每個(gè)PS會(huì)負(fù)責(zé)多個(gè)Range的數(shù)據(jù),PS實(shí)際不存儲(chǔ)數(shù)據(jù),數(shù)據(jù)存儲(chǔ)是由底層的Stream Layer完成,每個(gè)Range包含一個(gè)用于存儲(chǔ)操作日志的Commit Log文件和一個(gè)存儲(chǔ)行數(shù)據(jù)的Row Data文件;同時(shí)Range被加載后,還會(huì)產(chǎn)生一些內(nèi)存的數(shù)據(jù)結(jié)構(gòu)。

Memory Table:內(nèi)存表,記錄對(duì)于該range的每一次更新。

Index Cache:表索引的緩存,索引每行數(shù)據(jù)在Row Data文件里的偏移位置。

Row Data Cache:行緩存,緩存行數(shù)據(jù),與Index Cache分離的原因主要是盡量讓所有Index的數(shù)據(jù)都能加載到內(nèi)存。

ia_300000008.jpg

當(dāng)有新的行要寫到某個(gè)Range時(shí),首先會(huì)將行數(shù)據(jù)追加到Commit Log里,然后將行數(shù)據(jù)寫到Memory Table,這時(shí)就可以向客戶端(Front End)返回寫成功。當(dāng)Memory Table使用的內(nèi)存超出閾值時(shí),會(huì)做一次checkpoint操作,將Memory Table里的數(shù)據(jù)寫至Row Data文件。

當(dāng)Range里的數(shù)據(jù)太多時(shí),會(huì)導(dǎo)致負(fù)責(zé)該Range的PS負(fù)載很高,這時(shí)PM可以將一些大的Range進(jìn)行分裂,就部分Range交由負(fù)載較低的PS負(fù)責(zé)(PS本身不持久化數(shù)據(jù),PS只需要加載Range對(duì)應(yīng)的元數(shù)據(jù)即可服務(wù)針對(duì)該Range的請(qǐng)求);相反,當(dāng)某些Range由于數(shù)據(jù)刪除導(dǎo)致數(shù)據(jù)很少時(shí),PM可以將相鄰的Range進(jìn)行合并;最終使得各個(gè)PS的負(fù)載盡量均衡。

原文鏈接:點(diǎn)擊前往 >
版權(quán)說(shuō)明:本文內(nèi)容來(lái)自于知乎,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
相關(guān)文章
Azure Arc為企業(yè)構(gòu)建安全的云基礎(chǔ)
Azure Arc為企業(yè)構(gòu)建安全的云基礎(chǔ)
隨著人工智能技術(shù)持續(xù)重塑企業(yè)運(yùn)營(yíng)方式,企業(yè)需要能夠處理海量數(shù)據(jù)的系統(tǒng),以支持實(shí)時(shí)洞察,同時(shí)幫助他們應(yīng)對(duì)跨IT和OT環(huán)境(包括云端、邊緣和本地)中運(yùn)營(yíng)、應(yīng)用、數(shù)據(jù)和基礎(chǔ)設(shè)施的協(xié)作難題。
Azure
微軟云
云服務(wù)
2024-12-17
釋放.NET 9和Azure的AI技術(shù)與云計(jì)算潛力:更快、更智能、面向未來(lái)
釋放.NET 9和Azure的AI技術(shù)與云計(jì)算潛力:更快、更智能、面向未來(lái)
.NET 9現(xiàn)已正式發(fā)布,它為.NET平臺(tái)的發(fā)展掀開了嶄新的一頁(yè),突破了性能、云原生開發(fā)和AI技術(shù)集成的邊界。
Azure
微軟云
云服務(wù)
2024-12-16
Azure網(wǎng)絡(luò)管理現(xiàn)已具備智能Microsoft Copilot副駕駛能力
Azure網(wǎng)絡(luò)管理現(xiàn)已具備智能Microsoft Copilot副駕駛能力
智能Microsoft Copilot副駕駛for Azure網(wǎng)絡(luò)服務(wù)現(xiàn)已推出公共預(yù)覽版。
Azure
微軟云
云服務(wù)
2024-12-10
Microsoft Fabric功能更新,借助AI驅(qū)動(dòng)的數(shù)據(jù)平臺(tái)加速應(yīng)用創(chuàng)新
Microsoft Fabric功能更新,借助AI驅(qū)動(dòng)的數(shù)據(jù)平臺(tái)加速應(yīng)用創(chuàng)新
一年前,我們正式推出了一款端到端數(shù)據(jù)平臺(tái),旨在幫助組織推動(dòng)人工智能轉(zhuǎn)型,并重新定義數(shù)據(jù)的連接、管理和分析方式。
Azure
微軟云
云服務(wù)
2024-12-09
個(gè)人VIP
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家