導(dǎo)讀:近日淘寶架構(gòu)師chuanhui撰寫了一篇關(guān)于“Microsoft Azure Storage架構(gòu)分析”的文章,全文如下:
Microsoft云存儲服務(wù)分為兩個部分,SQL Azure和Azure Storage。云存儲系統(tǒng)的可擴(kuò)展性和功能不可兼得,必須犧牲一定的關(guān)系數(shù)據(jù)庫功能換取可擴(kuò)展性。Microsoft實(shí)現(xiàn)云存儲的思路有兩種:
1.做減法。SQL Azure直接在原有的SQL Server上引入分布式的因素,在滿足一定可擴(kuò)展性的前提下盡可能不犧牲原有的關(guān)系型數(shù)據(jù)庫功能。SQL Azure的可擴(kuò)展性是有限的,單個SQL Azure實(shí)例不允許超過50GB,這是因?yàn)镾QL Azure不支持子表動態(tài)分裂,單個SQL Azure實(shí)例必須足夠小從而可以被一個節(jié)點(diǎn)服務(wù)。
2.做加法。Azure Storage先做好底層可擴(kuò)展性,然后再逐步加入功能,這與Google GFS & Bigtable的思路比較一致。Azure Storage分為Blob, Queue和Table三個部分,其中Azure Table Storage最具有代表性,由于底層系統(tǒng)支持子表分裂,單個用戶的最大數(shù)據(jù)量可以達(dá)到100TB。然而Table Storage支持的功能有限,甚至不支持索引功能。具體信息可以參考msdn的一篇文章:Azure Storage架構(gòu)介紹。
Microsoft Azure Storage 邏輯上分為三層:
1.前端(Front-End Layer):類似互聯(lián)網(wǎng)公司的Web服務(wù)器層,可采用LVS + Nginx的設(shè)計,主要做一些雜事,比如權(quán)限驗(yàn)證。由于前端服務(wù)器沒有狀態(tài),因此很容易實(shí)現(xiàn)可擴(kuò)展。
2.存儲層 (Partition Layer):類似Bigtable,分為Partition Master和Partition Server兩種角色,分別對應(yīng)Bigtable Master和Tablet Server。每一個Partition(相當(dāng)于Bigtable中的Tablet)同時只能被一個Partition Server服務(wù),Partition Master會執(zhí)行負(fù)載均衡等工作。Bigtable中分為Root Table, Meta Table和User Table,Azure Table Storage可能會為了簡單起見消除Meta Table,所有的元數(shù)據(jù)操作全部放到Partition Master上。
3.文件系統(tǒng)層(DFS Layer):類似GFS,數(shù)據(jù)按照extent(相當(dāng)于GFS中的chunk)劃分,每個extent大小在100MB至1GB之間。數(shù)據(jù)存儲三份,寫操作經(jīng)過Primary同步到多個Secondary,讀操作可以選擇負(fù)載較輕的某個Primary或者Secondary副本。當(dāng)發(fā)生機(jī)器故障時,需要選擇其它機(jī)器上的Secondary切換為Primary繼續(xù)提供寫服務(wù),另外需要通過增加副本操作使得每個extent的副本數(shù)維持在安全值,比如三份。為了簡單起見,DFS Layer對上層Partition Layer可以不提供文件系統(tǒng)接口,只提供類似塊設(shè)備的訪問方式。
Azure Storage的主鍵包括Partition Key + Row Key兩部分,其中,Partition Key用于數(shù)據(jù)劃分,規(guī)定相同的Partition Key只屬于同一個Partition,從而被一臺Partition Server服務(wù),這就使得Partition Key相同的多個行之間能夠支持事務(wù)。與SQL Azure不同,Azure Storage的并發(fā)操作通過樂觀鎖的方式實(shí)現(xiàn)。Azure Storage包含三個不同的產(chǎn)品,其中Azure Table Storage支持用戶設(shè)置Schema,支持byte[], bool, DataTime, double, Guid, Int32, Int64, String這幾種列類型;Azure Blob Storage將Blob數(shù)據(jù)存放到底層的DFS Layer中,Blob過大時可能存放到多個extent中,Partition Layer存儲每個Blob的編號到Blob所在的多個extent位置之間的映射關(guān)系;Azure Queue Storage將Partition Key設(shè)置為Queue的編號,Row Key設(shè)置為消息的編號,從而保證屬于同一個Queue的消息連續(xù)存放。
總之,Microsoft Azure Storage和早期的Bigtable總體架構(gòu)是很類似的,可能做了一些簡化,這也間接說明了一點(diǎn):如果不發(fā)生重大硬件變革,工程上要實(shí)現(xiàn)高可擴(kuò)展的分布式B+樹,將云存儲系統(tǒng)分成文件+表格兩層還是比較靠譜的。開發(fā)人員更多地需要在實(shí)現(xiàn)細(xì)節(jié)上下功夫,落實(shí)到線上的每行代碼上。