與單機(jī)環(huán)境下的編程相比齐媒,分布式環(huán)境下的編程有兩個(gè)明顯的不同:首先,分布式環(huán)境下會(huì)出現(xiàn)一部分計(jì)算機(jī)工作正常畅蹂,另一部分計(jì)算機(jī)工作不正常的情況童漩,程序需要在這種情況下盡可能地正常工作,這個(gè)挑戰(zhàn)非常大。其次侥袜,單機(jī)環(huán)境下的函數(shù)調(diào)用常瞅蚬睿可以在微秒級(jí)內(nèi)返回,所以除了少數(shù)訪問(wèn)外部設(shè)備(例如磁盤枫吧、網(wǎng)卡等)的函數(shù)采用異步方式調(diào)用外浦旱,大部分函數(shù)采用同步調(diào)用的方式,編譯器和操作系統(tǒng)在調(diào)用前后自動(dòng)保存與恢復(fù)程序的上下文九杂;在分布式環(huán)境下颁湖,計(jì)算機(jī)之間的函數(shù)調(diào)用(遠(yuǎn)程調(diào)用,即RPC)的返回時(shí)間通常是毫秒或亞毫秒(0.1~1.0毫秒)級(jí)例隆,差不多是單機(jī)環(huán)境的100倍甥捺,使用同步方式遠(yuǎn)遠(yuǎn)不能發(fā)揮現(xiàn)代CPU處理器的性能,所以分布式環(huán)境下的RPC通常采用異步調(diào)用方式镀层,程序需要自己保存和恢復(fù)調(diào)用前后的上下文镰禾,并需要處理更多的異常。
分布式存儲(chǔ)定義
大規(guī)模分布式存儲(chǔ)系統(tǒng)的定義如下:
“分布式存儲(chǔ)系統(tǒng)是大量普通PC服務(wù)器通過(guò)Internet互聯(lián)唱逢,對(duì)外作為一個(gè)整體提供存儲(chǔ)服務(wù)吴侦。”
分布式存儲(chǔ)系統(tǒng)具有如下幾個(gè)特性:
可擴(kuò)展坞古。分布式存儲(chǔ)系統(tǒng)可以擴(kuò)展到幾百臺(tái)甚至幾千臺(tái)的集群規(guī)模备韧,而且,隨著集群規(guī)模的增長(zhǎng)痪枫,系統(tǒng)整體性能表現(xiàn)為線性增長(zhǎng)织堂。
低成本。分布式存儲(chǔ)系統(tǒng)的自動(dòng)容錯(cuò)奶陈、自動(dòng)負(fù)載均衡機(jī)制使其可以構(gòu)建在普通PC機(jī)之上易阳。另外,線性擴(kuò)展能力也使得增加吃粒、減少機(jī)器非常方便闽烙,可以實(shí)現(xiàn)自動(dòng)運(yùn)維。
高性能声搁。無(wú)論是針對(duì)整個(gè)集群還是單臺(tái)服務(wù)器,都要求分布式存儲(chǔ)系統(tǒng)具備高性能捕发。
易用疏旨。分布式存儲(chǔ)系統(tǒng)需要能夠提供易用的對(duì)外接口,另外扎酷,也要求具備完善的監(jiān)控檐涝、運(yùn)維工具,并能夠方便地與其他系統(tǒng)集成,例如谁榜,從Hadoop云計(jì)算系統(tǒng)導(dǎo)入數(shù)據(jù)幅聘。
分布式存儲(chǔ)技術(shù)難點(diǎn)
數(shù)據(jù)分布:如何將數(shù)據(jù)分布到多臺(tái)服務(wù)器才能夠保證數(shù)據(jù)分布均勻?數(shù)據(jù)分布到多臺(tái)服務(wù)器后如何實(shí)現(xiàn)跨服務(wù)器讀寫操作窃植?
一致性:如何將數(shù)據(jù)的多個(gè)副本復(fù)制到多臺(tái)服務(wù)器帝蒿,即使在異常情況下,也能夠保證不同副本之間的數(shù)據(jù)一致性巷怜?
容錯(cuò):如何檢測(cè)到服務(wù)器故障葛超?如何自動(dòng)將出現(xiàn)故障的服務(wù)器上的數(shù)據(jù)和服務(wù)遷移到集群中其他服務(wù)器?
負(fù)載均衡:新增服務(wù)器和集群正常運(yùn)行過(guò)程中如何實(shí)現(xiàn)自動(dòng)負(fù)載均衡延塑?數(shù)據(jù)遷移的過(guò)程中如何保證不影響已有服務(wù)绣张?
事務(wù)與并發(fā)控制:如何實(shí)現(xiàn)分布式事務(wù)?如何實(shí)現(xiàn)多版本并發(fā)控制关带?
易用性:如何設(shè)計(jì)對(duì)外接口使得系統(tǒng)容易使用侥涵?如何設(shè)計(jì)監(jiān)控系統(tǒng)并將系統(tǒng)的內(nèi)部狀態(tài)以方便的形式暴露給運(yùn)維人員?
壓縮/解壓縮:如何根據(jù)數(shù)據(jù)的特點(diǎn)設(shè)計(jì)合理的壓縮/解壓縮算法宋雏?如何平衡壓縮算法節(jié)省的存儲(chǔ)空間和消耗的CPU計(jì)算資源芜飘?
分布式存儲(chǔ)分類
分布式存儲(chǔ)面臨的數(shù)據(jù)需求比較復(fù)雜,大致可以分為三類:
非結(jié)構(gòu)化數(shù)據(jù):包括所有格式的辦公文檔好芭、文本燃箭、圖片、圖像舍败、音頻和視頻信息等招狸。
結(jié)構(gòu)化數(shù)據(jù):一般存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中,可以用二維關(guān)系表結(jié)構(gòu)來(lái)表示邻薯。結(jié)構(gòu)化數(shù)據(jù)的模式(Schema裙戏,包括屬性、數(shù)據(jù)類型以及數(shù)據(jù)之間的聯(lián)系)和內(nèi)容是分開的厕诡,數(shù)據(jù)的模式需要預(yù)先定義累榜。
半結(jié)構(gòu)化數(shù)據(jù):介于非結(jié)構(gòu)化數(shù)據(jù)和結(jié)構(gòu)化數(shù)據(jù)之間,HTML文檔就屬于半結(jié)構(gòu)化數(shù)據(jù)灵嫌。它一般是自描述的壹罚,與結(jié)構(gòu)化數(shù)據(jù)最大的區(qū)別在于,半結(jié)構(gòu)化數(shù)據(jù)的模式結(jié)構(gòu)和內(nèi)容混在一起寿羞,沒(méi)有明顯的區(qū)分猖凛,也不需要預(yù)先定義數(shù)據(jù)的模式結(jié)構(gòu)。
不同的分布式存儲(chǔ)系統(tǒng)適合處理不同類型的數(shù)據(jù)绪穆,分布式存儲(chǔ)系統(tǒng)分為四類:分布式文件系統(tǒng)辨泳、分布式鍵值(Key-Value)系統(tǒng)虱岂、分布式表格系統(tǒng)和分布式數(shù)據(jù)庫(kù)。
1.分布式文件系統(tǒng)
互聯(lián)網(wǎng)應(yīng)用需要存儲(chǔ)大量的圖片菠红、照片第岖、視頻等非結(jié)構(gòu)化數(shù)據(jù)對(duì)象,這類數(shù)據(jù)以對(duì)象的形式組織试溯,對(duì)象之間沒(méi)有關(guān)聯(lián)蔑滓,這樣的數(shù)據(jù)一般稱為Blob(Binary Large Object,二進(jìn)制大對(duì)象)數(shù)據(jù)耍共。
分布式文件系統(tǒng)用于存儲(chǔ)Blob對(duì)象烫饼,典型的系統(tǒng)有Facebook Haystack以及Taobao File System(TFS)。另外试读,分布式文件系統(tǒng)也常作為分布式表格系統(tǒng)以及分布式數(shù)據(jù)庫(kù)的底層存儲(chǔ)杠纵,如谷歌的GFS(Google File System,存儲(chǔ)大文件)可以作為分布式表格系統(tǒng)Google Bigtable的底層存儲(chǔ)钩骇,Amazon的EBS(Elastic Block Store比藻,彈性塊存儲(chǔ))系統(tǒng)可以作為分布式數(shù)據(jù)庫(kù)(Amazon RDS)的底層存儲(chǔ)。
2.分布式鍵值系統(tǒng)
分布式鍵值系統(tǒng)用于存儲(chǔ)關(guān)系簡(jiǎn)單的半結(jié)構(gòu)化數(shù)據(jù)倘屹,它只提供基于主鍵的CRUD(Create/Read/Update/Delete)功能银亲,即根據(jù)主鍵創(chuàng)建、讀取纽匙、更新或者刪除一條鍵值記錄务蝠。
典型的系統(tǒng)有Amazon Dynamo以及Taobao Tair。從數(shù)據(jù)結(jié)構(gòu)的角度看烛缔,分布式鍵值系統(tǒng)與傳統(tǒng)的哈希表比較類似馏段,不同的是,分布式鍵值系統(tǒng)支持將數(shù)據(jù)分布到集群中的多個(gè)存儲(chǔ)節(jié)點(diǎn)践瓷。分布式鍵值系統(tǒng)是分布式表格系統(tǒng)的一種簡(jiǎn)化實(shí)現(xiàn)院喜,一般用作緩存,比如淘寶Tair以及Memcache晕翠。一致性哈希是分布式鍵值系統(tǒng)中常用的數(shù)據(jù)分布技術(shù)喷舀,因其被Amazon DynamoDB系統(tǒng)使用而變得相當(dāng)有名。
3.分布式表格系統(tǒng)
分布式表格系統(tǒng)用于存儲(chǔ)關(guān)系較為復(fù)雜的半結(jié)構(gòu)化數(shù)據(jù)淋肾,與分布式鍵值系統(tǒng)相比硫麻,分布式表格系統(tǒng)不僅僅支持簡(jiǎn)單的CRUD操作,而且支持掃描某個(gè)主鍵范圍樊卓。分布式表格系統(tǒng)以表格為單位組織數(shù)據(jù)庶香,每個(gè)表格包括很多行,通過(guò)主鍵標(biāo)識(shí)一行简识,支持根據(jù)主鍵的CRUD功能以及范圍查找功能赶掖。
分布式表格系統(tǒng)借鑒了很多關(guān)系數(shù)據(jù)庫(kù)的技術(shù),例如支持某種程度上的事務(wù)七扰,比如單行事務(wù)奢赂,某個(gè)實(shí)體組(Entity Group,一個(gè)用戶下的所有數(shù)據(jù)往往構(gòu)成一個(gè)實(shí)體組)下的多行事務(wù)颈走。典型的系統(tǒng)包括Google Bigtable以及Megastore,Microsoft Azure Table Storage,Amazon DynamoDB等膳灶。與分布式數(shù)據(jù)庫(kù)相比,分布式表格系統(tǒng)主要支持針對(duì)單張表格的操作立由,不支持一些特別復(fù)雜的操作轧钓,比如多表關(guān)聯(lián),多表聯(lián)接锐膜,嵌套子查詢毕箍;另外,在分布式表格系統(tǒng)中道盏,同一個(gè)表格的多個(gè)數(shù)據(jù)行也不要求包含相同類型的列而柑,適合半結(jié)構(gòu)化數(shù)據(jù)。分布式表格系統(tǒng)是一種很好的權(quán)衡荷逞,這類系統(tǒng)可以做到超大規(guī)模媒咳,而且支持較多的功能,但實(shí)現(xiàn)往往比較復(fù)雜种远,而且有一定的使用門檻涩澡。
4.分布式數(shù)據(jù)庫(kù)
分布式數(shù)據(jù)庫(kù)一般是從單機(jī)關(guān)系數(shù)據(jù)庫(kù)擴(kuò)展而來(lái),用于存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)坠敷。分布式數(shù)據(jù)庫(kù)采用二維表格組織數(shù)據(jù)妙同,提供SQL關(guān)系查詢語(yǔ)言,支持多表關(guān)聯(lián)常拓,嵌套子查詢等復(fù)雜操作渐溶,并提供數(shù)據(jù)庫(kù)事務(wù)以及并發(fā)控制。
典型的系統(tǒng)包括MySQL數(shù)據(jù)庫(kù)分片(MySQL Sharding)集群弄抬,Amazon RDS以及Microsoft SQL Azure茎辐。分布式數(shù)據(jù)庫(kù)支持的功能最為豐富,符合用戶使用習(xí)慣掂恕,但可擴(kuò)展性往往受到限制拖陆。當(dāng)然,這一點(diǎn)并不是絕對(duì)的懊亡。Google Spanner系統(tǒng)是一個(gè)支持多數(shù)據(jù)中心的分布式數(shù)據(jù)庫(kù)依啰,它不僅支持豐富的關(guān)系數(shù)據(jù)庫(kù)功能,還能擴(kuò)展到多個(gè)數(shù)據(jù)中心的成千上萬(wàn)臺(tái)機(jī)器店枣。除此之外速警,阿里巴巴OceanBase系統(tǒng)也是一個(gè)支持自動(dòng)擴(kuò)展的分布式關(guān)系數(shù)據(jù)庫(kù)叹誉。