概述
Azure Blob存儲是一個(gè)云對象存儲系統(tǒng),它為客戶提供了在任何時(shí)間段內(nèi)存儲無限量的數(shù)據(jù)的能力??蛻艨梢噪S時(shí)從任何地方訪問他們的數(shù)據(jù),并且只為他們使用和存儲的數(shù)據(jù)付費(fèi)。在Azure Blob中,數(shù)據(jù)可以選擇本地和地理復(fù)制進(jìn)行持久存儲,以便于災(zāi)難恢復(fù)。在本文中,我們描述了Azure Blob存儲的體系結(jié)構(gòu)、全局名稱空間和數(shù)據(jù)模型,以及它的資源調(diào)配、負(fù)載平衡和復(fù)制系統(tǒng)。 01、簡介 Azure Blob 存儲是一個(gè)可擴(kuò)展的云存儲系統(tǒng),自2008年11月開始發(fā)布以來。它在Microsoft內(nèi)部用于社交網(wǎng)絡(luò)搜索、提供視頻、音樂和游戲內(nèi)容、管理醫(yī)療記錄等應(yīng)用程序。此外,有成千上萬的微軟以外的客戶在使用 Azure Blob 存儲,任何人都可以通過互聯(lián)網(wǎng)注冊使用該系統(tǒng)。在 Azure Blob的構(gòu)建過程中,來自潛在內(nèi)部和外部客戶的反饋推動了許多設(shè)計(jì)決策。這些反饋產(chǎn)生的一些關(guān)鍵設(shè)計(jì)特性包括: 強(qiáng)一致性 許多客戶需要強(qiáng)一致性:尤其是企業(yè)客戶將其業(yè)務(wù)線應(yīng)用程序移動到云端。他們還希望能夠?qū)?qiáng)一致性數(shù)據(jù)執(zhí)行條件讀、寫和刪除,以實(shí)現(xiàn)樂觀并發(fā)控制。為此,Azure Blob 盡可能提供了CAP定理聲稱難以同時(shí)實(shí)現(xiàn)的三個(gè)屬性:強(qiáng)一致性、高可用性和分區(qū)容限。 全局和可擴(kuò)展的命名空間 為便于使用,Azure Blob存儲實(shí)現(xiàn)了一個(gè)全局命名空間,允許從世界上任何位置以一致的方式存儲和訪問數(shù)據(jù)。由于Blob的一個(gè)主要目標(biāo)是支持存儲大量數(shù)據(jù),因此這個(gè)全局名稱空間必須能夠處理超過EB的數(shù)據(jù)。 容災(zāi) Blob跨相距數(shù)百英里的多個(gè)數(shù)據(jù)中心存儲客戶數(shù)據(jù)。這種冗余為災(zāi)難(如地震、野火、龍卷風(fēng)等)提供了必要的數(shù)據(jù)恢復(fù)保護(hù)。 多租戶和存儲成本 為降低存儲成本,許多客戶都使用相同的共享存儲基礎(chǔ)架構(gòu)。Blob將具有不同資源需求的許多不同客戶的工作負(fù)載組合在一起,因此在任何一個(gè)時(shí)間點(diǎn)所需的存儲量都比在其專用硬件上運(yùn)行的服務(wù)要少得多。 02、全局分區(qū)名稱空間 我們存儲系統(tǒng)的一個(gè)關(guān)鍵目標(biāo)是提供一個(gè)單一的全局名稱空間,允許客戶端尋址云中的所有存儲,并隨時(shí)間擴(kuò)展到所需的任意數(shù)量的存儲。為了提供這一功能,我們利用DNS作為存儲名稱空間的一部分,并將存儲名稱空間分為三個(gè)部分:帳戶名、分區(qū)名和對象名。因此,所有數(shù)據(jù)都可以通過入以下URI進(jìn)行訪問:http(s): //AccountName. blob.core.chinacloudapi.cn/PartitionName/ObjectName (國外的Azure Blob的domian name 略有區(qū)別)。 AccountName 是客戶選擇的用于訪問存儲的帳戶名,是DNS主機(jī)名的一部分。AccountName DNS轉(zhuǎn)換用于定位存儲數(shù)據(jù)的主存儲群集和數(shù)據(jù)中心。此主要位置是所有請求到達(dá)該帳戶數(shù)據(jù)的位置。應(yīng)用程序可以使用多個(gè)帳戶名跨不同位置存儲其數(shù)據(jù)。當(dāng)請求到達(dá)存儲集群時(shí), PartitionName(對于Blob存儲來講就是Container name) 與AccountName一起定位數(shù)據(jù)。PartitionName用于當(dāng)數(shù)據(jù)需要跨存儲節(jié)點(diǎn)擴(kuò)展對數(shù)據(jù)的訪問。 ObjectName 標(biāo)識該分區(qū)中的各個(gè)對象。系統(tǒng)支持跨具有相同PartitionName值的對象的原子事務(wù)。 03、高層體系結(jié)構(gòu) Azure云平臺 Azure云該平臺跨不同的數(shù)據(jù)中心和不同的地理區(qū)域運(yùn)行許多云服務(wù)。Azure Fabric 控制器是一個(gè)資源調(diào)配和管理層,它為Azure平臺上的云服務(wù)提供資源分配、部署/升級和管理。Azure存儲服務(wù)就是這樣一個(gè)在Fabric控制器上運(yùn)行的服務(wù)。Fabric控制器為Azure 存儲系統(tǒng)提供節(jié)點(diǎn)管理、網(wǎng)絡(luò)配置、運(yùn)行狀況監(jiān)視、服務(wù)實(shí)例的啟動/停止以及服務(wù)部署。此外,Azure 存儲從Fabric控制器檢索網(wǎng)絡(luò)拓?fù)湫畔?、群集的物理布局以及存儲?jié)點(diǎn)的硬件配置。Azure存儲服務(wù)負(fù)責(zé)管理跨磁盤的復(fù)制和數(shù)據(jù)放置,并在存儲群集中對數(shù)據(jù)和應(yīng)用程序通信進(jìn)行負(fù)載平衡。 Azure Blob 存儲體系結(jié)構(gòu)及其組件 Azure Blob存儲的一個(gè)重要特性是能夠存儲和提供對大量存儲(EB及以上)的訪問。Azure Blob存儲生產(chǎn)系統(tǒng)由存儲stamp和位置服務(wù)組成(如下圖所示)。 存儲stamp 存儲stamp是由N個(gè)存儲節(jié)點(diǎn)機(jī)架組成的群集,其中每個(gè)機(jī)架構(gòu)建為具有冗余網(wǎng)絡(luò)和電源的獨(dú)立容錯(cuò)域。集群通常在20以上個(gè)機(jī)架之間,每個(gè)機(jī)架有N個(gè)磁盤密集型存儲節(jié)點(diǎn)。為了提供低成本的云存儲,我們需要使生產(chǎn)中配置的存儲盡可能高利用率。我們的目標(biāo)是使存儲stamp在容量、事務(wù)和帶寬方面的利用率保持在70%左右。我們盡量避免超過80%,因?yàn)槲覀兿MA?0%的備用空間,以便支持(1)磁盤短行程,通過利用磁盤的外部磁道通過利用磁盤的外部磁道獲得更好的尋道時(shí)間和更高的吞吐量,以及(2)在內(nèi)存中出現(xiàn)機(jī)架故障時(shí)繼續(xù)提供存儲容量和可用性。當(dāng)存儲戳記的利用率達(dá)到70%時(shí),位置服務(wù)使用戳記間復(fù)制將帳戶遷移到不同的stamp。 位置服務(wù)(LS) 位置服務(wù)管理所有存儲stamp。它還負(fù)責(zé)跨所有stamp管理帳戶命名空間。LS將帳戶分配給存儲stamp,并跨存儲stamp對其進(jìn)行管理,以實(shí)現(xiàn)災(zāi)難恢復(fù)和負(fù)載平衡。一般來講位置服務(wù)本身分布在兩個(gè)地理位置上,用于自己的災(zāi)難恢復(fù)。Azure存儲從多個(gè)地理區(qū)域(如中國的北一,北二,東一,東二,北美、歐洲和其他亞洲非洲國家)的多個(gè)位置提供存儲。每個(gè)位置都是多個(gè)數(shù)據(jù)中心,在其中任意一個(gè)DC位置有一個(gè)或多個(gè)建筑物,每個(gè)位置都有多個(gè)存儲stamp。為了提供額外的容量,LS能夠輕松地向區(qū)域添加新區(qū)域、新位置或向位置添加新標(biāo)記。因此,為了增加存儲量,我們在所需位置的數(shù)據(jù)中心部署一個(gè)或多個(gè)存儲stamp,并將它們添加到LS中。然后,LS可以為客戶將新的存儲帳戶分配給這些新的stamp,并將現(xiàn)有存儲帳戶從舊的stamp負(fù)載平衡(遷移)到新的stamp。對于具有兩個(gè)存儲stmap的位置服務(wù)和存儲stamp中的邏輯層,LS跨所有位置跟蹤生產(chǎn)中每個(gè)存儲stamp使用的資源。當(dāng)應(yīng)用程序請求一個(gè)新帳戶來存儲數(shù)據(jù)時(shí),它會指定存儲的位置相關(guān)性(例如,中國北二)。然后,LS使用基于所有stamp的負(fù)載信息的啟發(fā)式算法(該算法考慮戳的完整性和其他度量,例如網(wǎng)絡(luò),事務(wù)利用率)選擇該位置內(nèi)的存儲stamp作為帳戶的主stamp。LS然后將帳戶元數(shù)據(jù)信息存儲在所選的存儲stamp中,更新DNS以允許請求從https://. blob.core.chinacloudapi.cn /到該存儲stamp的虛擬IP(VIP,存儲stamp為外部通信公開的IP地址)。 存儲stamp中的三層結(jié)構(gòu) 自下而上,這些分別是: 1、stream層 這一層對于Blob存儲的操作主要位在磁盤上,也相當(dāng)于存儲的最底層,并負(fù)責(zé)分布和復(fù)制跨許多服務(wù)器的數(shù)據(jù),以保持?jǐn)?shù)據(jù)持久性。stream層可以被認(rèn)為是stamp中的分布式文件系統(tǒng)層。它是被稱為“流”(即稱為“擴(kuò)展數(shù)據(jù)塊”的大型存儲塊的有序列表)的文件、如何存儲它們、如何復(fù)制它們等等,這一層他都理解,但它不理解更高級別的對象構(gòu)造或它們的語義。數(shù)據(jù)存儲在stream層,但可以從Partition層訪問。事實(shí)上,Partition服務(wù)器(分區(qū)層中的守護(hù)進(jìn)程)和stream服務(wù)器在一個(gè)stamp中共同位于每個(gè)存儲節(jié)點(diǎn)上。 2、Partition層 Partition層用于(1)管理和理解更高級別的數(shù)據(jù)抽象,如Blob對象,(2)提供可伸縮的對象名稱空間,(3)為對象提供事務(wù)排序和強(qiáng)一致性,(4)在stream層上存儲對象數(shù)據(jù),以及(5)緩存對象數(shù)據(jù)以減少磁盤I/O。該層的另一個(gè)職責(zé)是通過在一個(gè)stamp中劃分所有數(shù)據(jù)對象來實(shí)現(xiàn)可伸縮性。 如前所述,所有對象都有一個(gè)PartitionName;基于PartitionName值,它們被分解為不相交的范圍,并由不同的分區(qū)服務(wù)器提供服務(wù)。該層管理哪個(gè)分區(qū)服務(wù)器為blob的 PartitionName范圍提供服務(wù)。此外,它還提供跨分區(qū)服務(wù)器的分區(qū)名稱的自動負(fù)載平衡,以滿足對象的流量需求。 3、前端(Front-End)層 前端(FE)層由一組接收傳入請求的無狀態(tài)服務(wù)器組成。在接收到請求后,F(xiàn)E查找AccountName,對請求進(jìn)行身份驗(yàn)證和授權(quán),然后將請求路由到分區(qū)層中的分區(qū)服務(wù)器(基于PartitionName)。系統(tǒng)維護(hù)一個(gè)分區(qū)映射,該映射跟蹤分區(qū)名稱范圍以及哪個(gè)分區(qū)服務(wù)器為哪個(gè)分區(qū)名稱提供服務(wù)。FE服務(wù)器緩存分區(qū)映射,并使用它來確定將每個(gè)請求轉(zhuǎn)發(fā)到哪個(gè)分區(qū)服務(wù)器。FE服務(wù)器還直接從stream層stream化大型對象,并緩存頻繁訪問的數(shù)據(jù)以提高效率。 兩個(gè)復(fù)制引擎 在詳細(xì)描述Stream流和Partition層之前,我們首先簡要概述系統(tǒng)中的兩個(gè)復(fù)制引擎及其各自的職責(zé)。 1、內(nèi)部stamp復(fù)制(stream層) 此系統(tǒng)提供同步復(fù)制,并側(cè)重于確保寫入stamp的所有數(shù)據(jù)在該stamp中保持持久性。它在不同故障域中的不同節(jié)點(diǎn)之間保留足夠的數(shù)據(jù)副本,以便在磁盤、節(jié)點(diǎn)和機(jī)架出現(xiàn)故障時(shí)保持?jǐn)?shù)據(jù)在stamp的持久性。stamp內(nèi)復(fù)制完全由stream層完成,位于客戶寫請求的關(guān)鍵路徑上。一旦通過內(nèi)部stamp復(fù)制成功復(fù)制了事務(wù),就可以將成功返回給客戶。 2、Stamp間復(fù)制(Partition層) 此系統(tǒng)提供異步復(fù)制,重點(diǎn)是跨stamp復(fù)制數(shù)據(jù)。stamp間復(fù)制是在后臺完成的,不在客戶請求的關(guān)鍵路徑上。此復(fù)制是在對象級別進(jìn)行的,在該級別上,可以復(fù)制整個(gè)對象,也可以復(fù)制給定帳戶的最近增量更改。stamp間復(fù)制用于(1)在兩個(gè)位置保留帳戶數(shù)據(jù)的副本以進(jìn)行災(zāi)難恢復(fù),以及(2)在stamp之間遷移帳戶數(shù)據(jù)。stamp間復(fù)制由位置服務(wù)為帳戶配置,并由Partition層執(zhí)行。stamp間復(fù)制的重點(diǎn)是復(fù)制對象和應(yīng)用于這些對象的事務(wù),而stamp內(nèi)復(fù)制的重點(diǎn)是復(fù)制用于組成對象的磁盤存儲塊。 (未完待續(xù))
stamp內(nèi)復(fù)制提供了對硬件故障的持久性,這種故障在大規(guī)模系統(tǒng)中經(jīng)常發(fā)生,而stamp間復(fù)制提供了對地理災(zāi)害的地理冗余,這種情況很少見。提供低延遲的stamp內(nèi)復(fù)制是至關(guān)重要的,因?yàn)檫@是在用戶請求的關(guān)鍵路徑上;而stamp間復(fù)制的重點(diǎn)是在達(dá)到可接受的復(fù)制延遲水平的同時(shí),優(yōu)化利用stamp間的網(wǎng)絡(luò)帶寬。這兩種復(fù)制方案解決的問題不同。創(chuàng)建這兩個(gè)獨(dú)立復(fù)制層的另一個(gè)原因是這兩個(gè)層中的每個(gè)層都必須維護(hù)的名稱空間。在stream層執(zhí)行stamp內(nèi)復(fù)制允許將需要維護(hù)的信息量限定為單個(gè)存儲stamp的大小。
這一重點(diǎn)允許將所有stamp內(nèi)復(fù)制的元狀態(tài)緩存在內(nèi)存中以提高性能, 從而使Azure Blob存儲系統(tǒng)能夠通過在單個(gè)stamp內(nèi)快速提交事務(wù)以滿足客戶請求,從而提供具有強(qiáng)一致性的快速復(fù)制。與此相反,Partition層與位置服務(wù)相結(jié)合,控制并理解跨stamp的全局對象名稱空間,從而允許它跨數(shù)據(jù)中心高效地復(fù)制和維護(hù)對象狀態(tài)。