與單機環(huán)境下的編程相比,分布式環(huán)境下的編程有兩個明顯的不同:首先,分布式環(huán)境下會出現(xiàn)一部分計算機工作正常,另一部分計算機工作不正常的情況,程序需要在這種情況下盡可能地正常工作,這個挑戰(zhàn)非常大。其次,單機環(huán)境下的函數(shù)調(diào)用常??梢栽谖⒚爰墐?nèi)返回,所以除了少數(shù)訪問外部設(shè)備(例如磁盤、網(wǎng)卡等)的函數(shù)采用異步方式調(diào)用外,大部分函數(shù)采用同步調(diào)用的方式,編譯器和操作系統(tǒng)在調(diào)用前后自動保存與恢復(fù)程序的上下文;在分布式環(huán)境下,計算機之間的函數(shù)調(diào)用(遠程調(diào)用,即RPC)的返回時間通常是毫秒或亞毫秒(0.1~1.0毫秒)級,差不多是單機環(huán)境的100倍,使用同步方式遠遠不能發(fā)揮現(xiàn)代CPU處理器的性能,所以分布式環(huán)境下的RPC通常采用異步調(diào)用方式,程序需要自己保存和恢復(fù)調(diào)用前后的上下文,并需要處理更多的異常。
分布式存儲定義
大規(guī)模分布式存儲系統(tǒng)的定義如下:
“分布式存儲系統(tǒng)是大量普通PC服務(wù)器通過Internet互聯(lián),對外作為一個整體提供存儲服務(wù)?!?/p>
分布式存儲系統(tǒng)具有如下幾個特性:
可擴展。分布式存儲系統(tǒng)可以擴展到幾百臺甚至幾千臺的集群規(guī)模,而且,隨著集群規(guī)模的增長,系統(tǒng)整體性能表現(xiàn)為線性增長。
低成本。分布式存儲系統(tǒng)的自動容錯、自動負載均衡機制使其可以構(gòu)建在普通PC機之上。另外,線性擴展能力也使得增加、減少機器非常方便,可以實現(xiàn)自動運維。
高性能。無論是針對整個集群還是單臺服務(wù)器,都要求分布式存儲系統(tǒng)具備高性能。
易用。分布式存儲系統(tǒng)需要能夠提供易用的對外接口,另外,也要求具備完善的監(jiān)控、運維工具,并能夠方便地與其他系統(tǒng)集成,例如,從Hadoop云計算系統(tǒng)導(dǎo)入數(shù)據(jù)。
分布式存儲技術(shù)難點
數(shù)據(jù)分布:如何將數(shù)據(jù)分布到多臺服務(wù)器才能夠保證數(shù)據(jù)分布均勻?數(shù)據(jù)分布到多臺服務(wù)器后如何實現(xiàn)跨服務(wù)器讀寫操作?
一致性:如何將數(shù)據(jù)的多個副本復(fù)制到多臺服務(wù)器,即使在異常情況下,也能夠保證不同副本之間的數(shù)據(jù)一致性?
容錯:如何檢測到服務(wù)器故障?如何自動將出現(xiàn)故障的服務(wù)器上的數(shù)據(jù)和服務(wù)遷移到集群中其他服務(wù)器?
負載均衡:新增服務(wù)器和集群正常運行過程中如何實現(xiàn)自動負載均衡?數(shù)據(jù)遷移的過程中如何保證不影響已有服務(wù)?
事務(wù)與并發(fā)控制:如何實現(xiàn)分布式事務(wù)?如何實現(xiàn)多版本并發(fā)控制?
易用性:如何設(shè)計對外接口使得系統(tǒng)容易使用?如何設(shè)計監(jiān)控系統(tǒng)并將系統(tǒng)的內(nèi)部狀態(tài)以方便的形式暴露給運維人員?
壓縮/解壓縮:如何根據(jù)數(shù)據(jù)的特點設(shè)計合理的壓縮/解壓縮算法?如何平衡壓縮算法節(jié)省的存儲空間和消耗的CPU計算資源?
分布式存儲分類
分布式存儲面臨的數(shù)據(jù)需求比較復(fù)雜,大致可以分為三類:
非結(jié)構(gòu)化數(shù)據(jù):包括所有格式的辦公文檔、文本、圖片、圖像、音頻和視頻信息等。
結(jié)構(gòu)化數(shù)據(jù):一般存儲在關(guān)系數(shù)據(jù)庫中,可以用二維關(guān)系表結(jié)構(gòu)來表示。結(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)容混在一起,沒有明顯的區(qū)分,也不需要預(yù)先定義數(shù)據(jù)的模式結(jié)構(gòu)。
不同的分布式存儲系統(tǒng)適合處理不同類型的數(shù)據(jù),分布式存儲系統(tǒng)分為四類:分布式文件系統(tǒng)、分布式鍵值(Key-Value)系統(tǒng)、分布式表格系統(tǒng)和分布式數(shù)據(jù)庫。
1.分布式文件系統(tǒng)
互聯(lián)網(wǎng)應(yīng)用需要存儲大量的圖片、照片、視頻等非結(jié)構(gòu)化數(shù)據(jù)對象,這類數(shù)據(jù)以對象的形式組織,對象之間沒有關(guān)聯(lián),這樣的數(shù)據(jù)一般稱為Blob(Binary Large Object,二進制大對象)數(shù)據(jù)。
分布式文件系統(tǒng)用于存儲Blob對象,典型的系統(tǒng)有Facebook Haystack以及Taobao File System(TFS)。另外,分布式文件系統(tǒng)也常作為分布式表格系統(tǒng)以及分布式數(shù)據(jù)庫的底層存儲,如谷歌的GFS(Google File System,存儲大文件)可以作為分布式表格系統(tǒng)Google Bigtable的底層存儲,Amazon的EBS(Elastic Block Store,彈性塊存儲)系統(tǒng)可以作為分布式數(shù)據(jù)庫(Amazon RDS)的底層存儲。
2.分布式鍵值系統(tǒng)
分布式鍵值系統(tǒng)用于存儲關(guā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ù)分布到集群中的多個存儲節(jié)點。分布式鍵值系統(tǒng)是分布式表格系統(tǒng)的一種簡化實現(xiàn),一般用作緩存,比如淘寶Tair以及Memcache。一致性哈希是分布式鍵值系統(tǒng)中常用的數(shù)據(jù)分布技術(shù),因其被Amazon DynamoDB系統(tǒng)使用而變得相當有名。
3.分布式表格系統(tǒng)
分布式表格系統(tǒng)用于存儲關(guān)系較為復(fù)雜的半結(jié)構(gòu)化數(shù)據(jù),與分布式鍵值系統(tǒng)相比,分布式表格系統(tǒng)不僅僅支持簡單的CRUD操作,而且支持掃描某個主鍵范圍。分布式表格系統(tǒng)以表格為單位組織數(shù)據(jù),每個表格包括很多行,通過主鍵標識一行,支持根據(jù)主鍵的CRUD功能以及范圍查找功能。
分布式表格系統(tǒng)借鑒了很多關(guān)系數(shù)據(jù)庫的技術(shù),例如支持某種程度上的事務(wù),比如單行事務(wù),某個實體組(Entity Group,一個用戶下的所有數(shù)據(jù)往往構(gòu)成一個實體組)下的多行事務(wù)。典型的系統(tǒng)包括Google Bigtable以及Megastore,Microsoft Azure Table Storage,Amazon DynamoDB等。與分布式數(shù)據(jù)庫相比,分布式表格系統(tǒng)主要支持針對單張表格的操作,不支持一些特別復(fù)雜的操作,比如多表關(guān)聯(lián),多表聯(lián)接,嵌套子查詢;另外,在分布式表格系統(tǒng)中,同一個表格的多個數(shù)據(jù)行也不要求包含相同類型的列,適合半結(jié)構(gòu)化數(shù)據(jù)。分布式表格系統(tǒng)是一種很好的權(quán)衡,這類系統(tǒng)可以做到超大規(guī)模,而且支持較多的功能,但實現(xiàn)往往比較復(fù)雜,而且有一定的使用門檻。
4.分布式數(shù)據(jù)庫
分布式數(shù)據(jù)庫一般是從單機關(guān)系數(shù)據(jù)庫擴展而來,用于存儲結(jié)構(gòu)化數(shù)據(jù)。分布式數(shù)據(jù)庫采用二維表格組織數(shù)據(jù),提供SQL關(guān)系查詢語言,支持多表關(guān)聯(lián),嵌套子查詢等復(fù)雜操作,并提供數(shù)據(jù)庫事務(wù)以及并發(fā)控制。
典型的系統(tǒng)包括MySQL數(shù)據(jù)庫分片(MySQL Sharding)集群,Amazon RDS以及Microsoft SQL Azure。分布式數(shù)據(jù)庫支持的功能最為豐富,符合用戶使用習(xí)慣,但可擴展性往往受到限制。當然,這一點并不是絕對的。Google Spanner系統(tǒng)是一個支持多數(shù)據(jù)中心的分布式數(shù)據(jù)庫,它不僅支持豐富的關(guān)系數(shù)據(jù)庫功能,還能擴展到多個數(shù)據(jù)中心的成千上萬臺機器。除此之外,阿里巴巴OceanBase系統(tǒng)也是一個支持自動擴展的分布式關(guān)系數(shù)據(jù)庫。