成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

云存儲(chǔ)的故事——元數(shù)據(jù)歸來

系統(tǒng)
云存儲(chǔ)服務(wù)是云計(jì)算的重要組成部分。技術(shù)上,云存儲(chǔ)屬于大型分布式在線存儲(chǔ)范疇。云存儲(chǔ)是一大類特殊的共享存儲(chǔ)。作為提供存儲(chǔ)資源的服務(wù),云存儲(chǔ)需要保證用戶存放的數(shù)據(jù)可靠,不丟失。同時(shí),云存儲(chǔ)必須確保實(shí)時(shí)在線,任何宕機(jī)都會(huì)給用戶造成損失。因而,云存儲(chǔ)的基本要求是高可靠和高可用。此外,云存儲(chǔ)是海量數(shù)據(jù)的存儲(chǔ),規(guī)模巨大。而且,出于成本和現(xiàn)金流量的考慮,云存儲(chǔ)的集群規(guī)模必須隨著用戶數(shù)據(jù)量的不斷增加而擴(kuò)展。云存儲(chǔ)的架構(gòu),設(shè)計(jì)和技術(shù)運(yùn)用都是圍繞這四個(gè)基本要求展開。反之,無論多么漂亮先進(jìn)的技術(shù),只要可能影響這些目標(biāo)

云存儲(chǔ)服務(wù)是云計(jì)算的重要組成部分。技術(shù)上,云存儲(chǔ)屬于大型分布式在線存儲(chǔ)范疇。云存儲(chǔ)是一大類特殊的共享存儲(chǔ)。作為提供存儲(chǔ)資源的服務(wù),云存儲(chǔ)需要保證用戶存放的數(shù)據(jù)可靠,不丟失。同時(shí),云存儲(chǔ)必須確保實(shí)時(shí)在線,任何宕機(jī)都會(huì)給用戶造成損失。因而,云存儲(chǔ)的基本要求是高可靠和高可用。此外,云存儲(chǔ)是海量數(shù)據(jù)的存儲(chǔ),規(guī)模巨大。而且,出于成本和現(xiàn)金流量的考慮,云存儲(chǔ)的集群規(guī)模必須隨著用戶數(shù)據(jù)量的不斷增加而擴(kuò)展。云存儲(chǔ)的架構(gòu),設(shè)計(jì)和技術(shù)運(yùn)用都是圍繞這四個(gè)基本要求展開。反之,無論多么漂亮先進(jìn)的技術(shù),只要可能影響這些目標(biāo)的實(shí)現(xiàn),都不能應(yīng)用于云存儲(chǔ)。

在我開始接觸存儲(chǔ)的時(shí)候,一致性哈希(以及著名的Dynamo)是非常熱門的技術(shù)。技術(shù)上一致性哈希很漂亮,簡潔,并且高效。但在實(shí)際應(yīng)用中,卻是另一種表現(xiàn)。本文將對(duì)集中式的元數(shù)據(jù)存儲(chǔ)方案和一致性哈希作對(duì)比分析,以期說明元數(shù)據(jù)是更加適合云存儲(chǔ)的選擇。

1. 對(duì)象存儲(chǔ),塊存儲(chǔ)

實(shí)用的云存儲(chǔ)可以分作兩類:對(duì)象存儲(chǔ)和塊存儲(chǔ)。對(duì)象存儲(chǔ)存儲(chǔ)是地道的數(shù)據(jù)倉儲(chǔ),僅僅存放key/value數(shù)據(jù):用戶有一個(gè)數(shù)據(jù)對(duì)象,需要存儲(chǔ)起來,他就給這個(gè)對(duì)象起一個(gè)名字(key),然后將對(duì)象連同名字一起存放入對(duì)象存儲(chǔ)。當(dāng)需要的時(shí)候,用這個(gè)名字作為key,向存儲(chǔ)系統(tǒng)索要。而對(duì)象存儲(chǔ)系統(tǒng)必須在需要的時(shí)候?qū)?shù)據(jù)返還給用戶,除非用戶已將此數(shù)據(jù)從存儲(chǔ)系統(tǒng)中刪除。

塊存儲(chǔ)則是充當(dāng)操作系統(tǒng)底下的塊設(shè)備(籠統(tǒng)地說,就是磁盤),供系統(tǒng)使用。塊存儲(chǔ)實(shí)際上就是一種SAN(Storage Attach Network),將集群的存儲(chǔ)空間分配給用戶,掛載到操作系統(tǒng),作為磁盤使用。因?yàn)閴K存儲(chǔ)需要模擬磁盤的行為,因此必須確保低延遲。

盡管兩種云存儲(chǔ)有完全不同的目標(biāo)、用途和特性,但在分布式存儲(chǔ)基本特性方面都面臨著相同的問題,這里的討論對(duì)兩者都有意義。為了簡便起見,這里只討論對(duì)象存儲(chǔ)的情況。但很多內(nèi)容和結(jié)論可以外推到塊存儲(chǔ)。

2. 存儲(chǔ)的基礎(chǔ)

云存儲(chǔ)功能非常簡單,存儲(chǔ)用戶的數(shù)據(jù)而已。但簡單歸簡單,幾個(gè)要點(diǎn)還是需要做的。當(dāng)用戶將一個(gè)key-value對(duì)上傳至存儲(chǔ)時(shí),存儲(chǔ)系統(tǒng)必須找合適的服務(wù)器,保存數(shù)據(jù)。通常會(huì)保存在多臺(tái)服務(wù)器上,以防止數(shù)據(jù)丟失。這叫多副本。

于是,一個(gè)關(guān)鍵的問題就是如何選擇存放數(shù)據(jù)的服務(wù)器。服務(wù)器的選擇是很有技術(shù)含量的事,需要兼顧到幾個(gè)要點(diǎn):首先,數(shù)據(jù)必須在服務(wù)器之間平衡。不能把數(shù)據(jù)集中到少數(shù)幾臺(tái)服務(wù)器,造成一部分服務(wù)器撐死,而另一部分餓死。其次,在用戶讀取數(shù)據(jù)時(shí),可以方便快捷定位。隨后,滿足云存儲(chǔ)服務(wù)高可靠高可用大規(guī)模的特點(diǎn)。***,盡可能簡單。

于是,對(duì)于每個(gè)對(duì)象,都有一個(gè)key到數(shù)據(jù)存儲(chǔ)位置的映射: key->pos。映射方式很多,最直接的,就是將每一個(gè)對(duì)象的key->pos數(shù)據(jù)對(duì)保存下來。這些數(shù)據(jù)通常被稱為"元數(shù)據(jù)"。

但還有一些更巧妙的方式:根據(jù)key的特征,將key空間劃分成若干分組,并將這些分組對(duì)應(yīng)到不同的存儲(chǔ)節(jié)點(diǎn)上。這種方式可以籠統(tǒng)地成為”Sharding"。如此,可以直接按照一個(gè)簡單規(guī)則定位到服務(wù)器。常用的分組方式之一是按key的區(qū)間劃分,比如a開頭的是一組,b開頭的是一組等等。而另一種更具"現(xiàn)代感"的分組方式,就是對(duì)key哈希后取模。哈希方案實(shí)際上就是哈希表的自然延伸,將桶分布到多臺(tái)服務(wù)器中。

這兩大類映射方式實(shí)質(zhì)上是在不同的粒度上進(jìn)行映射。"元數(shù)據(jù)"在對(duì)象粒度上,而sharding則是在一組對(duì)象的粒度。這兩種不同的粒度,決定了它們有著完全不同的特性。也決定了它們?cè)趯?shí)際應(yīng)用中的表現(xiàn)。#p#

3. 元數(shù)據(jù)和一致性哈希

于是,在云存儲(chǔ)方案中產(chǎn)生了兩大流派:元數(shù)據(jù)模型和Sharding模型。而Sharding模型中,一致性哈希最為流行。一致性哈希本身很難直接用作實(shí)際使用,進(jìn)而產(chǎn)生了很多衍生方案,其中包括著名的"Dynamo"。這里用“一致性哈希方案”指代所有基于一致性哈希的設(shè)計(jì)。

元數(shù)據(jù)方案是對(duì)象級(jí)別的key->pos映射,也就是一個(gè)會(huì)無休止增長的"map"。每多一個(gè)對(duì)象,就會(huì)多一條元數(shù)據(jù)。通常會(huì)將元數(shù)據(jù)保存在一組數(shù)據(jù)庫中,方便檢索和查詢。元數(shù)據(jù)方案沒有什么特別的地方,其核心是元數(shù)據(jù)存儲(chǔ)部分。這部分設(shè)計(jì)的好壞,關(guān)系到系統(tǒng)整體的特性。關(guān)于元數(shù)據(jù)存儲(chǔ)的設(shè)計(jì)不是本文的重點(diǎn),本文將集中探討元數(shù)據(jù)方案和一致性哈希方案的比較。

標(biāo)準(zhǔn)的一致性哈希模型是對(duì)key進(jìn)行哈希運(yùn)算,然后投射到一個(gè)環(huán)形的數(shù)值空間上。與此同時(shí),對(duì)節(jié)點(diǎn)(存儲(chǔ)服務(wù)器)進(jìn)行編碼,然后也做哈希運(yùn)算,并投射到哈希環(huán)上。理論上,只要哈希算法合適,節(jié)點(diǎn)可以均勻地分布在哈希環(huán)上。節(jié)點(diǎn)根據(jù)自身在哈希環(huán)上的位置,占據(jù)一個(gè)哈希值區(qū)間,比如從本節(jié)點(diǎn)到下一個(gè)節(jié)點(diǎn)間的區(qū)間。所有落入這個(gè)區(qū)間的key,都保存到該節(jié)點(diǎn)上。

在這個(gè)模型中,key到數(shù)據(jù)存儲(chǔ)邏輯位置的映射不通過存儲(chǔ),而是通過算法直接得到。但是,邏輯位置(哈希環(huán)上的位置)到物理位置(節(jié)點(diǎn))的轉(zhuǎn)換無法直接得到。標(biāo)準(zhǔn)的做法是任選一個(gè)節(jié)點(diǎn),然后順序?qū)ふ夷繕?biāo)節(jié)點(diǎn),或者采用二分法在節(jié)點(diǎn)之間跳轉(zhuǎn)查找。這種查找方式在實(shí)際的存儲(chǔ)系統(tǒng)中是無法忍受的。所以,實(shí)用的存儲(chǔ)系統(tǒng)往往采用的是一個(gè)混合模型(暫且稱之為“混合方案”):系統(tǒng)維護(hù)一個(gè)哈希區(qū)間->節(jié)點(diǎn)的映射表。這個(gè)映射本質(zhì)上也是一種元數(shù)據(jù),但是它是大粒度的元數(shù)據(jù),更像是一個(gè)路由表。由于粒度大,變化很少,所以即便用文本文件都可以。這個(gè)映射表也需要多份,通??梢源娣旁谌肟诜?wù)器上,也可以分散到所有的存儲(chǔ)節(jié)點(diǎn)上,關(guān)鍵是保持一致即可,這相對(duì)容易。

一致性哈希解決了標(biāo)準(zhǔn)哈希表改變大小時(shí)需要重新計(jì)算,并且遷移所有數(shù)據(jù)的問題,只需遷移被新加節(jié)點(diǎn)占據(jù)的哈希區(qū)間所包含的數(shù)據(jù)。但是,隨著新節(jié)點(diǎn)的加入,數(shù)據(jù)量的分布會(huì)變得不均勻。為了解決這個(gè)問題,包括Dynamo在內(nèi)的諸多模型,都采用了"虛擬結(jié)點(diǎn)"的方案:將一個(gè)節(jié)點(diǎn)分成若干虛擬節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)加入系統(tǒng)時(shí),把虛擬節(jié)點(diǎn)分散到哈希環(huán)上,如此可以更加"均勻地"添加一個(gè)節(jié)點(diǎn)。

一致性哈希及其衍生方案,將數(shù)據(jù)按一定規(guī)則分片,按一定規(guī)則將分片后的數(shù)據(jù)映射到相應(yīng)的存儲(chǔ)服務(wù)器上。因此,它只需要維護(hù)一個(gè)算法,或者一個(gè)簡單的映射表,便可直接定位數(shù)據(jù)。更加簡單,并且由于少了查詢?cè)獢?shù)據(jù),性能上也更有優(yōu)勢(shì)。

但是,這只是理論上的。

如果我們只考慮存儲(chǔ)的功能(get,put,delete),一致性哈希非常***。但實(shí)際情況是,真正主宰云存儲(chǔ)架構(gòu)的,是那些非功能性需求:

1、 大規(guī)模和擴(kuò)展性

2、 可靠性和一致性

3、 可用性和可管理

4、 性能

在實(shí)際的云存儲(chǔ)系統(tǒng)中,非功能需求反而主導(dǎo)了架構(gòu)和設(shè)計(jì)。并且對(duì)key-pos映射的選擇起到?jīng)Q定性的作用。

4 規(guī)模和擴(kuò)展

首先,云存儲(chǔ)最明顯的特點(diǎn)是規(guī)模巨大。對(duì)于一個(gè)公有云存儲(chǔ)服務(wù),容納用戶數(shù)據(jù)是沒有限度的。不可能以"容量已滿"作為理由,拒絕用戶存放數(shù)據(jù)。因此,云存儲(chǔ)是“規(guī)模無限”的。意思就是說,云存儲(chǔ)系統(tǒng),必須保證任何時(shí)候都能夠隨意擴(kuò)容,而不會(huì)影響服務(wù)。

另一方面,云存儲(chǔ)作為服務(wù),都是由小到大。一開始便部署幾千臺(tái)服務(wù)器,幾十P的容量,毫無意義。資源會(huì)被閑置而造成浪費(fèi),對(duì)成本和現(xiàn)金流量產(chǎn)生很大的負(fù)面作用。通常,我們只會(huì)部署一個(gè)小規(guī)模的系統(tǒng),滿足初始的容量需求。然后,根據(jù)需求增長的情況,逐步擴(kuò)容。

于是,云存儲(chǔ)系統(tǒng)必須是高度可擴(kuò)展的。

面對(duì)擴(kuò)展,元數(shù)據(jù)方案沒有什么困難。當(dāng)節(jié)點(diǎn)增加時(shí),系統(tǒng)可以更多地將新來的寫請(qǐng)求引導(dǎo)到新加入的節(jié)點(diǎn)。合適的調(diào)度平衡策略可以確保系統(tǒng)平衡地使用各節(jié)點(diǎn)的存儲(chǔ)空間。

但對(duì)于一致性哈希和它的衍生方案而言,卻麻煩很多。原始的哈希表一旦需要擴(kuò)容,需要rehash。在基于哈希的分布式存儲(chǔ)系統(tǒng)中,這就意味著所有數(shù)據(jù)都必須重新遷移一遍。這當(dāng)然無法忍受的。一致性哈希的出現(xiàn),便可以解決此問題。由于對(duì)象和服務(wù)器都映射到哈希環(huán)上,當(dāng)新節(jié)點(diǎn)加入后,同樣會(huì)映射到哈希環(huán)上。原來的區(qū)段會(huì)被新節(jié)點(diǎn)截?cái)?,新加入的?jié)點(diǎn),會(huì)占據(jù)被切割出來的哈希值區(qū)間。為了完成這個(gè)轉(zhuǎn)換,這部分?jǐn)?shù)據(jù)需要遷移到新服務(wù)器上。相比原始的哈希,一致性哈希只需要傳輸被新服務(wù)器搶走的那部分?jǐn)?shù)據(jù)。

但是終究需要進(jìn)行數(shù)據(jù)遷移。數(shù)據(jù)遷移并非像看上去那樣,僅僅是從一臺(tái)服務(wù)器向另一臺(tái)服務(wù)器復(fù)制數(shù)據(jù)。云存儲(chǔ)是一個(gè)在線系統(tǒng),數(shù)據(jù)遷移不能影響系統(tǒng)的服務(wù)。但遷移數(shù)據(jù)需要時(shí)間,為了確保數(shù)據(jù)訪問的延續(xù)性,在遷移開始時(shí),寫入操作被引導(dǎo)到目標(biāo)服務(wù)器,而源節(jié)點(diǎn)的待遷移部分切換至只讀狀態(tài)。與此同時(shí),開始從源節(jié)點(diǎn)遷移數(shù)據(jù)。當(dāng)用戶試圖讀取遷移范圍內(nèi)的數(shù)據(jù)時(shí),需要嘗試在源和目標(biāo)節(jié)點(diǎn)分別讀取。這種單寫雙讀的模式可以保證服務(wù)不受影響。但是,必須控制數(shù)據(jù)遷移的速率。如果遷移操作將磁盤吞吐能力跑滿,或者網(wǎng)絡(luò)帶寬耗盡,服務(wù)必然受到影響。

另一個(gè)問題是,除非成倍地增加節(jié)點(diǎn),否則會(huì)存在數(shù)據(jù)不平衡的問題。為了平衡數(shù)據(jù),需要遷移更多的數(shù)據(jù),每臺(tái)節(jié)點(diǎn)都需要遷出一些,以確保每個(gè)節(jié)點(diǎn)的數(shù)據(jù)量都差不多。虛擬節(jié)點(diǎn)的引入便是起到這個(gè)作用。于是實(shí)際的數(shù)據(jù)遷移量同增加的容量數(shù)成正比,系數(shù)是當(dāng)前存儲(chǔ)系統(tǒng)的空間使用率。

于是,一個(gè)1P的系統(tǒng),三副本,70%的消耗,擴(kuò)容200T,那么需要遷移大約140T*3=420T的數(shù)據(jù),才能使數(shù)據(jù)存儲(chǔ)量得到平衡。如果使用現(xiàn)在常用的存儲(chǔ)服務(wù)器(2T*12),需要新增21臺(tái)。如果它們都并發(fā)起來參與遷移,單臺(tái)遷移速率不超過50MBps,那么這次擴(kuò)容所需的時(shí)間為420T/(50M*21)=400000秒,大約4.6天。這是理想狀況,包括軟硬件異常,用戶訪問壓力,遷移后的檢驗(yàn)等情況,都會(huì)延長遷移時(shí)間。很可能十天半月泡在這些任務(wù)上。而在數(shù)據(jù)遷移完成,老服務(wù)器的存儲(chǔ)空間回收出來之前,實(shí)際上并未擴(kuò)容。那么萬一擴(kuò)容實(shí)在系統(tǒng)空間即將耗盡時(shí)進(jìn)行,(別說這事不會(huì)碰到,一個(gè)懶散的供貨商,或者廠家被水淹,都可能讓這種事情發(fā)生。云計(jì)算什么事都會(huì)遇到),那么很可能會(huì)因?yàn)閬聿患巴瓿蓴U(kuò)容而使系統(tǒng)停服。云存儲(chǔ),特別是公有云存儲(chǔ),擴(kuò)容必須是快速而便捷的。

更復(fù)雜的情況是遷移過程中出錯(cuò),硬件失效等異常情況的處理過程會(huì)很復(fù)雜,因?yàn)榇藭r(shí)數(shù)據(jù)分布處于一種中間狀態(tài),后續(xù)處理必須確保系統(tǒng)數(shù)據(jù)安全一致。

系統(tǒng)的擴(kuò)容規(guī)模越大,困難程度越大。當(dāng)系統(tǒng)有100P的規(guī)模(很多系統(tǒng)宣稱可以達(dá)到的規(guī)模),而用戶數(shù)據(jù)增長迅猛(公有云存儲(chǔ)有明顯的馬太效應(yīng),規(guī)模越大,增長越快),在幾百上千臺(tái)服務(wù)器之間遷移成P的數(shù)據(jù),是多么駭人的場景。

數(shù)據(jù)遷移會(huì)消耗網(wǎng)絡(luò)帶寬,吃掉磁盤負(fù)載,攪亂服務(wù)器的cache等等,都是云存儲(chǔ)的大忌,能不做盡量不做。

元數(shù)據(jù)方案一般情況下不需要做遷移。遷移只有存儲(chǔ)服務(wù)器新舊更替,或者租借的服務(wù)器到期歸還時(shí)進(jìn)行。由于數(shù)據(jù)對(duì)象可以放置在任何節(jié)點(diǎn)上,因而可以把一臺(tái)節(jié)點(diǎn)需要遷移的數(shù)據(jù)分散到其他節(jié)點(diǎn)上。并且可以從其他副本那里多對(duì)多并發(fā)地傳輸數(shù)據(jù)。負(fù)載被分散到整個(gè)集群,對(duì)服務(wù)的影響更小,也更快捷。實(shí)際上,這個(gè)邏輯和數(shù)據(jù)副本修復(fù)是一樣的。

很顯然,相比一致性哈希方案動(dòng)不動(dòng)來回遷移數(shù)據(jù)的做法,元數(shù)據(jù)方案提供一個(gè)動(dòng)態(tài)平衡的機(jī)制,可以無需數(shù)據(jù)遷移,服務(wù)器一旦加入集群,可以立刻生效,實(shí)現(xiàn)平靜地?cái)U(kuò)容。#p#

5 可靠性和一致性

可靠性(本文特指數(shù)據(jù)的可靠性,即不丟失數(shù)據(jù))無疑是云存儲(chǔ)的根本。用戶將數(shù)據(jù)托付給你,自然不希望隨隨便便地丟失。維持可靠性是云存儲(chǔ)最困難的部分。(當(dāng)然,更難的是在保持高可靠性的前提下確保高可用)。

在任何一個(gè)系統(tǒng)中,硬件和軟件都無法保障完全可靠。芯片會(huì)被燒毀,電路可能短路,電壓可能波動(dòng),老鼠可能咬斷網(wǎng)線,供電可能中斷,軟件會(huì)有bug,甚至宇宙射線會(huì)干擾寄存器…。作為存儲(chǔ)的核心部件,硬盤反而更加脆弱。在標(biāo)準(zhǔn)的服務(wù)器中,除了光驅(qū)和風(fēng)扇以外,硬盤是唯一的機(jī)電元件。由于存在活動(dòng)部件,其可靠性不如固態(tài)電路,更容易受到外界的干擾。所以,硬盤時(shí)常被看作消耗品。在一個(gè)有幾萬塊硬盤的存儲(chǔ)集群中,每周壞上幾塊硬盤是再尋常不過的事。運(yùn)氣不好的時(shí)候,一天中都可能壞上2、3塊。

因此,只把數(shù)據(jù)保存在一塊盤中是無法保障數(shù)據(jù)可靠的。通常我們都會(huì)將數(shù)據(jù)在不同的服務(wù)器上保存多份,稱之為“副本”。原則上,副本越多,越可靠。但是,過多的副本會(huì)造成存儲(chǔ)成本的增加,并且降低性能,增加維持一致性的難度。一般會(huì)保持3副本,是一個(gè)比較均衡的數(shù)字。

但是,在確定的副本數(shù)下,真正對(duì)可靠性起到關(guān)鍵作用的,是副本丟失后的恢復(fù)速度。比如,一個(gè)3副本存儲(chǔ)系統(tǒng)中,當(dāng)一個(gè)磁盤損壞后,它所承載的數(shù)據(jù)對(duì)象就只剩2個(gè)副本了。在這塊盤修復(fù)之前,如果再壞一塊盤,恰巧和尚未修復(fù)的盤有共同的數(shù)據(jù)對(duì)象,那么這些數(shù)據(jù)就只剩一個(gè)副本在支撐著,這是非常危險(xiǎn)的狀態(tài)。更有甚者,一個(gè)3副本的存儲(chǔ)系統(tǒng),在運(yùn)行過程中,即便沒有硬盤損壞,總會(huì)有一些對(duì)象由于種種原因處于兩副本狀態(tài),尚未來得及修復(fù)。比如寫入數(shù)據(jù)時(shí),有一個(gè)副本寫完后發(fā)現(xiàn)校驗(yàn)碼不對(duì),需要重寫。此時(shí),如果一塊盤損壞了,上面正好有這些2副本的對(duì)象。于是,從這一刻開始,這個(gè)對(duì)象只有1副本。壞盤上的數(shù)據(jù)被修復(fù)之前,另一塊盤包含此對(duì)象的硬盤也壞了,那么數(shù)據(jù)就丟了。盡管這種概率很小,但是云存儲(chǔ)系統(tǒng)是經(jīng)年累月地運(yùn)行,大規(guī)模加上長時(shí)間,任何小概率事件都會(huì)發(fā)生。而且在實(shí)際運(yùn)行的系統(tǒng)中,很多因素會(huì)導(dǎo)致硬盤壽命遠(yuǎn)小于理論值,比如機(jī)架震動(dòng)、電源不穩(wěn)、意外失電、輻射等等。而且,對(duì)于成批采購的硬盤,通常都會(huì)集中在一段時(shí)間內(nèi)一起進(jìn)入失效期,多塊磁盤同時(shí)損壞的概率會(huì)大幅提高。

如果數(shù)據(jù)修復(fù)的速度足夠快,可以搶在另一塊盤損壞之前,修復(fù)丟失的副本,那么數(shù)據(jù)丟失的概率會(huì)大大減小。(嚴(yán)格地講,無論修復(fù)時(shí)間有多短,在修復(fù)期間壞第二塊盤的概率始終存在,只是修復(fù)時(shí)間越短,這個(gè)概率越小。關(guān)鍵是要讓它小到我們可以接受的程度)。

一致性哈希方案中,如果將一塊磁盤同一個(gè)hash區(qū)間一一綁定。因此,數(shù)據(jù)恢復(fù)時(shí),只能先更換壞盤,然后從其他副本處讀取數(shù)據(jù),寫入新磁盤。但是,磁盤的持續(xù)寫入能力通常也只有50-60MBps。如果是一塊有1.5T數(shù)據(jù)的硬盤失效,那么恢復(fù)起來至少需要30000秒,將近9個(gè)小時(shí)。考慮到服務(wù)器的整體負(fù)載和網(wǎng)絡(luò)狀況,時(shí)間可能會(huì)接近12小時(shí)。在這個(gè)時(shí)間尺度里,第二塊盤,甚至第三塊盤損壞的概率還是相當(dāng)大的。而且,硬盤更換的時(shí)間取決于機(jī)房管理的響應(yīng)能力,這往往是一個(gè)薄弱環(huán)節(jié)。

如果方案中讓節(jié)點(diǎn)同hash區(qū)間一一對(duì)應(yīng),在節(jié)點(diǎn)內(nèi)部,再將數(shù)據(jù)分散存儲(chǔ)到一塊磁盤中,那么當(dāng)需要恢復(fù)副本時(shí),節(jié)點(diǎn)將損壞的磁盤上的數(shù)據(jù)對(duì)象分散存放到其他磁盤上。這樣,可以先發(fā)起修復(fù),從其他副本那里都到數(shù)據(jù),并發(fā)地向多個(gè)磁盤恢復(fù)數(shù)據(jù),磁盤的吞吐限制會(huì)得到緩解。但問題的解決并不徹底。首先,網(wǎng)絡(luò)會(huì)成為瓶頸。1個(gè)千兆網(wǎng)口最多支持到120MBps,這個(gè)速率也僅僅比磁盤快一倍,而且實(shí)際使用中也不能將帶寬全部用光,否則影響服務(wù),畢竟其他硬盤還是好的,還需要正常工作。原則上可以通過增加網(wǎng)口數(shù)量拓寬吞吐量,但這增加了網(wǎng)絡(luò)設(shè)備方面的成本。而且這也僅僅是增加3、4倍的吞吐能力,我們真正需要的是近10倍地縮小恢復(fù)時(shí)間。至于光纖,那不是普通公有云存儲(chǔ)所能奢望的。即便網(wǎng)絡(luò)吞吐問題解決了,還有一個(gè)更核心的問題。因?yàn)閿?shù)據(jù)在節(jié)點(diǎn)內(nèi)部任意分散到各磁盤上,那么節(jié)點(diǎn)就需要維護(hù)一個(gè)key->磁盤的映射,也就是節(jié)點(diǎn)內(nèi)的局部元數(shù)據(jù)。這個(gè)元數(shù)據(jù)需要服務(wù)器自己維護(hù),由于單臺(tái)服務(wù)器的資源有限,元數(shù)據(jù)的可靠性、可用性和一致性的維持非常麻煩。一套存儲(chǔ)一套元數(shù)據(jù)存儲(chǔ)已經(jīng)夠麻煩的了,何況每個(gè)節(jié)點(diǎn)一套元數(shù)據(jù)。一旦這個(gè)元數(shù)據(jù)丟失了,這個(gè)節(jié)點(diǎn)上所有的數(shù)據(jù)都找不到了。理論上,這個(gè)元數(shù)據(jù)丟失了,也不會(huì)影響全局,可以利用一致性哈希算法到其他副本那里恢復(fù)出丟失的數(shù)據(jù)。但不得不將原來服務(wù)器上的所有數(shù)據(jù)都傳輸一遍,這個(gè)數(shù)據(jù)量往往有一二十T,恢復(fù)起來更困難。更現(xiàn)實(shí)的做法是直接掃描各磁盤,逆向地重建元數(shù)據(jù)。當(dāng)然,這將是一個(gè)漫長的過程,期間整臺(tái)節(jié)點(diǎn)是不可用的,此間發(fā)生的寫入操作還需的事后重新恢復(fù)(具體參見本文“可用性”部分)。

副本恢復(fù)最快,影響最小的方法就是,不讓數(shù)據(jù)對(duì)象副本綁死在一臺(tái)節(jié)點(diǎn)上,只要數(shù)據(jù)對(duì)象可以存放到任意一臺(tái)節(jié)點(diǎn),那么便可以在節(jié)點(diǎn)之間做多對(duì)多的數(shù)據(jù)副本恢復(fù)。集群規(guī)模越大,速度越快,效果越好?;谠獢?shù)據(jù)的方案,每一個(gè)對(duì)象同節(jié)點(diǎn),乃至硬盤的映射是任意的,在副本恢復(fù)方面,有得天獨(dú)厚的優(yōu)勢(shì)。而一致性哈希嚴(yán)格地將數(shù)據(jù)同節(jié)點(diǎn)或磁盤綁定,迫使這種并發(fā)無法進(jìn)行。

有一些基于混合方案的衍生方案可以解決一致性哈希在副本修復(fù)速度問題:將哈希環(huán)劃分成若干slot(bucket,或者其他類似的稱謂),數(shù)量遠(yuǎn)遠(yuǎn)大于將來集群可能擁有的節(jié)點(diǎn)數(shù),或磁盤數(shù)。(好吧,我們說過規(guī)模無限,無限自然不可能,只要足夠大就行了,比如2^32)。slot到節(jié)點(diǎn)或者磁盤的映射,通過一個(gè)映射表維護(hù)。各副本集群中的slot分布互不相同。當(dāng)一個(gè)磁盤損壞時(shí),找出所包含的slot,將這些slot分散到其他節(jié)點(diǎn)和磁盤上去,這樣便可以并發(fā)地從其他節(jié)點(diǎn)以slot為單位恢復(fù)副本。在損壞磁盤更換之后,再將一些slot,可以是原來的,也可以是隨意的,遷移到新硬盤,以平衡整體的數(shù)據(jù)分布。遷移的時(shí)候,副本已經(jīng)恢復(fù),遷移操作的時(shí)間壓力就很小了,可以慢慢來,磁盤吞吐的瓶頸也不會(huì)有什么的影響。

但相比之下,元數(shù)據(jù)方案修復(fù)副本之后不存在數(shù)據(jù)遷移這一步,在這方面對(duì)象級(jí)元數(shù)據(jù)的存在使副本恢復(fù)簡單很多。

同數(shù)據(jù)可靠性相關(guān)的一個(gè)問題是一致性。一致性問題可以看作可靠性問題的一個(gè)部分。因?yàn)楫?dāng)各副本的數(shù)據(jù)版本不一致時(shí),便意味著數(shù)據(jù)對(duì)象的當(dāng)前版本是缺少副本的。(實(shí)際上,從存儲(chǔ)角度來講,一個(gè)數(shù)據(jù)對(duì)象的不同版本,就是不同的數(shù)據(jù))。確保一個(gè)數(shù)據(jù)對(duì)象的一致性最實(shí)用的方法是所謂W+R>N。即N個(gè)副本中,一個(gè)版本寫入時(shí)確保有W個(gè)成功,而讀取時(shí)確保有R個(gè)成功,只要滿足W+R>N的情況,便可以保證始終可以讀到***寫入成功的版本。

W+R>N的使用有一個(gè)問題,需要并發(fā)地從所有副本上嘗試讀取數(shù)據(jù),然后通過讀取的數(shù)據(jù)對(duì)象版本(或者時(shí)間戳)的比對(duì),以確定是否滿足一致性公式的要求。如果所讀取的數(shù)據(jù)有幾十上百M(fèi)B,甚至上G的對(duì)象,一口氣讀出所有副本,而最終只取其中一個(gè),著實(shí)浪費(fèi),系統(tǒng)壓力會(huì)整整大上N倍。解決的方法是先做一次預(yù)讀,讀出所有副本的版本信息,進(jìn)行一致性比對(duì),確定有效副本后,再行數(shù)據(jù)本身的讀取。

元數(shù)據(jù)方案在一致性上簡單的多。元數(shù)據(jù)為了保證可靠,也會(huì)使用多副本。因?yàn)樵獢?shù)據(jù)很小,可以保持更多的副本數(shù),比如5個(gè),甚至7個(gè)。如此多的副本,基本上不必?fù)?dān)心其可靠性。重點(diǎn)在于一致性。同樣也是采用W+R>N的策略,但卻將元數(shù)據(jù)讀取和一致性保障在一次訪問中解決。對(duì)于數(shù)據(jù)存儲(chǔ)服務(wù)器而言,任務(wù)更多地是在保障每一個(gè)副本和版本的完整。

隨著時(shí)間的推移,數(shù)據(jù)會(huì)發(fā)生退化,有各種原因造成副本的丟失。一致性也是一樣。對(duì)于熱數(shù)據(jù),經(jīng)常被訪問,存儲(chǔ)數(shù)據(jù)出錯(cuò)很快就會(huì)發(fā)現(xiàn)。但冷數(shù)據(jù)需要依靠定期檢查發(fā)現(xiàn)錯(cuò)誤。這個(gè)核對(duì)工作在元數(shù)據(jù)方案里,就是比對(duì)元數(shù)據(jù)和節(jié)點(diǎn)的每個(gè)盤上的對(duì)象清單,元數(shù)據(jù)保存的永遠(yuǎn)是***版本,只要不匹配,就可以認(rèn)定出錯(cuò),立刻加以修復(fù)。但在一致性哈希方案中,需要交叉核對(duì)一個(gè)哈希區(qū)間的三個(gè)副本所包含的對(duì)象清單,以確定哪個(gè)對(duì)象是***副本。然后再修正數(shù)據(jù)問題。

當(dāng)一個(gè)節(jié)點(diǎn)由于種種原因下線,那么期間的所有寫入操作都無法完成。此時(shí),元數(shù)據(jù)方案處理起來很簡單:另外挑選一臺(tái)合適的節(jié)點(diǎn),寫入副本,更新相應(yīng)的元數(shù)據(jù)項(xiàng)后,操作完成,一切太平。

一致性哈希方案要復(fù)雜得多。對(duì)于一個(gè)哈希區(qū)間的一個(gè)副本,被固定在一個(gè)節(jié)點(diǎn)上。換句話說,一組副本必須存放在特定的一個(gè)節(jié)點(diǎn)上,不能隨意放置。如果需要定位到其他節(jié)點(diǎn)上,必須整區(qū)間的遷移。這個(gè)特性的結(jié)果就是,當(dāng)這臺(tái)節(jié)點(diǎn)下線后,無法寫入相應(yīng)的副本,也無法隨意地將副本寫到其他節(jié)點(diǎn)上。后續(xù)處理有2種方法:1、將副本或者key寫入一個(gè)隊(duì)列,等節(jié)點(diǎn)恢復(fù)后,發(fā)起修復(fù)操作,從其他的副本獲得數(shù)據(jù),補(bǔ)上缺失的副本。問題是這個(gè)隊(duì)列必須有足夠的可靠性,否則待修復(fù)key丟失,相應(yīng)的對(duì)象會(huì)長時(shí)間缺少副本,直到數(shù)據(jù)一致性檢測發(fā)現(xiàn)問題。這會(huì)增加一致性檢測的壓力,使得原本就復(fù)雜的過程雪上加霜;2、按一定規(guī)則寫入其他節(jié)點(diǎn),待恢復(fù)后原樣遷移回來。這個(gè)方案相對(duì)簡單些,但整個(gè)調(diào)度邏輯比較復(fù)雜,涉及到數(shù)據(jù)節(jié)點(diǎn)之間的協(xié)調(diào)。但是這種點(diǎn)到點(diǎn)的數(shù)據(jù)恢復(fù),會(huì)給暫存服務(wù)器產(chǎn)生壓力,不利于穩(wěn)定運(yùn)行。不管哪種方案,數(shù)據(jù)遷移或者復(fù)制都是免不了的。這中間的異常處理,負(fù)載控制等都需要花費(fèi)心思。

元數(shù)據(jù)方案在節(jié)點(diǎn)失效時(shí)的處理要比一致性哈希方案單純簡潔的多。節(jié)點(diǎn)失效是云存儲(chǔ)的常態(tài),處理方式越簡潔越好。在大集群中,幾個(gè)節(jié)點(diǎn)同時(shí)下線都是很平常的事,一致性哈希如此復(fù)雜的節(jié)點(diǎn)失效管理,就是運(yùn)維的地獄。#p#

6. 可用性和可管理性

可用性在某些方面同可靠性有著共同的解決方案,比如多副本可以消除單點(diǎn),提高可用性。但是它們?cè)谄渌矫鎱s存在著矛盾。當(dāng)一個(gè)副本寫入失敗,從可靠性角度而言,應(yīng)當(dāng)設(shè)法重試,或者索性告訴用戶寫入失敗。但這樣勢(shì)必造成響應(yīng)變慢,或者可用性降低。(響應(yīng)變慢超過一個(gè)程度后,便會(huì)被認(rèn)為是失敗,不管最終是否成功)。此外,為了保障可靠性的諸多措施,比如副本修復(fù),數(shù)據(jù)遷移等,會(huì)消耗系統(tǒng)資源,從而影響到可用性。

在上面對(duì)于可靠性的分析中可以看到,由于副本被綁定在特定節(jié)點(diǎn)上,一致性哈希要確保同元數(shù)據(jù)相當(dāng)?shù)目煽啃缘脑挘坏貌环艞壱恍┛捎眯?,將有副本寫入出錯(cuò)的操作返回失敗。因?yàn)樵獢?shù)據(jù)方案的數(shù)據(jù)存儲(chǔ)位置沒有限制,對(duì)于多數(shù)的副本寫入失敗可以通過重選服務(wù)器得到更正。一致性哈希則無此便利,要么放棄一定的可用性,要么承擔(dān)可靠性的風(fēng)險(xiǎn)。

根本上而言,一致性哈希在副本寫入上制造了局部的隱式單點(diǎn),盡管是短期的或者臨時(shí)的,但依舊會(huì)對(duì)系統(tǒng)產(chǎn)生影響。一個(gè)設(shè)計(jì)良好的分布式系統(tǒng)會(huì)盡量地減少單點(diǎn)出現(xiàn)的可能性,這直接關(guān)系到系統(tǒng)的持續(xù)和瞬時(shí)可用性。元數(shù)據(jù)方案可以確保數(shù)據(jù)分布上不存在任何形式的單點(diǎn)。對(duì)于一個(gè)對(duì)象而言,任何節(jié)點(diǎn)都沒有特殊性,這種無差別化才能真正保證消除單點(diǎn)。

在云存儲(chǔ)系統(tǒng)中,使用公式R+W>N的地方,便是影響系統(tǒng)可用性的核心要點(diǎn)??捎眯院鸵恢滦酝且粚?duì)冤家。在這個(gè)地方,需要向N臺(tái)服務(wù)器同時(shí)發(fā)出請(qǐng)求,而最終的有效性取決于服務(wù)器反饋的情況。一般來說,N越大,越容易在確保一致性的前提下,維持可用性。(實(shí)際上是取決于X=R+W-N的值,越大越好。這個(gè)值表示當(dāng)X+1個(gè)副本下線或丟失后,系統(tǒng)將不能保證臨時(shí)的或***的一致性)。但是,N-R和N-W越小,對(duì)可用性的影響越大。如果N=R,那么只要有一臺(tái)服務(wù)器下線,會(huì)造成系統(tǒng)不可讀取。如果N-R=3,那么即便是3臺(tái)服務(wù)器下線,系統(tǒng)還能正確讀取。對(duì)于W也一樣。在這里,一致性和可用性是一對(duì)矛盾。當(dāng)副本數(shù)足夠多(N數(shù)可以很大),可以很容易地獲得較高的X數(shù)。比如N=7, R=W=5,X=3,N-R=2,N-W=2,意味著即便有2臺(tái)服務(wù)器下線,也能保證讀寫的有效性,同時(shí)確保一致性。

但如果N=3,無論如何也只能讓R=3或者W=3,此時(shí)盡管可以獲得X=3的一致性保障級(jí)別,但即便一臺(tái)服務(wù)器下線,也會(huì)造成系統(tǒng)不可用。如果R=W=2,可以保證1臺(tái)服務(wù)器下線,系統(tǒng)還是可用,但一致性保障級(jí)別降低到了X=1。

在元數(shù)據(jù)方案中,元數(shù)據(jù)的副本數(shù)(N)可以大些,故障和異常造成的副本下線,或者丟失,對(duì)系統(tǒng)的可用性和一致性產(chǎn)生的影響很小,對(duì)于這類問題的處理的緊迫性會(huì)低一些。相反,一致性哈希的一致性依賴于數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn),面對(duì)大大小小的數(shù)據(jù)對(duì)象,無法使用很多副本,通常都會(huì)用3。在這個(gè)N數(shù)下,無論一致性還是可用性,都很脆弱。

對(duì)于可用性而言,***,也是最重要的一點(diǎn)是運(yùn)維管理。運(yùn)維的好壞直接決定了可用性。前文已述,一致性哈希在一些關(guān)鍵的系統(tǒng)維護(hù)點(diǎn)上相比元數(shù)據(jù)方案多出不少環(huán)節(jié)。在同樣運(yùn)維水平和強(qiáng)度下,一致性哈希更加容易出現(xiàn)可用性問題。這方面對(duì)可用性的影響很難明確地給出量化的評(píng)判,但是運(yùn)維是云存儲(chǔ)系統(tǒng)高可用保障的核心,運(yùn)維的復(fù)雜性往往決定了最終9的個(gè)數(shù)。

現(xiàn)在來看看元數(shù)據(jù)方案的運(yùn)維特點(diǎn)。元數(shù)據(jù)方案相比標(biāo)準(zhǔn)一致性哈希方案多出了一個(gè)元數(shù)據(jù)存儲(chǔ)系統(tǒng)。元數(shù)據(jù)通常有更多的副本,副本數(shù)越多,一致性的維持越發(fā)困難。一般的方案都是依賴異步執(zhí)行的版本同步機(jī)制,盡快同步各副本。但是,為防止同步失效,會(huì)定期全面掃描核對(duì)所有元數(shù)據(jù),確保元數(shù)據(jù)不會(huì)退化。這個(gè)過程伴隨者很大的數(shù)據(jù)吞吐和計(jì)算量。但這個(gè)過程是離線操作,并且沒有非常嚴(yán)格的時(shí)間要求,即便失敗,也不會(huì)過多地影響系統(tǒng)的運(yùn)行。它的時(shí)間裕度比較大。元數(shù)據(jù)量不會(huì)很大,在合適的算法下,一致性比對(duì)的時(shí)間也不會(huì)很長,通常不超過2、3小時(shí)。并且可以根據(jù)需要增減所需的服務(wù)器數(shù)量。

一致性哈希運(yùn)維的重點(diǎn)則在另一頭。一致性哈希模型及其各種變形由于需要確保數(shù)據(jù)平衡,不得不在擴(kuò)容時(shí)進(jìn)行大范圍的數(shù)據(jù)遷移。在不影響服務(wù)的情況下,遷移速率必須受到限制,導(dǎo)致遷移時(shí)間很長。但有時(shí)數(shù)據(jù)遷移的時(shí)間要求很高。因?yàn)樵谶w移完成之前,遷移的數(shù)據(jù)源所占的空間還不能回收。此時(shí)所添加的空間暫時(shí)無法使用。而且數(shù)據(jù)回收也需要花費(fèi)時(shí)間。在可用空間緊迫的情況下,遷移速度的壓力會(huì)很大。一旦遷移過程中出現(xiàn)異常,將會(huì)雪上加霜。在長達(dá)幾天的數(shù)據(jù)遷移過程中發(fā)生磁盤損壞的可能性非常大,修復(fù)操作將迫使數(shù)據(jù)遷移減速,甚至停止。修復(fù)的優(yōu)先級(jí)更高。遷移操作涉及很多服務(wù)器的并發(fā),協(xié)調(diào)和控制工作很復(fù)雜。而且不同的遷移原因會(huì)有不同的遷移策略。再加上各種異常處理,運(yùn)維管理內(nèi)容很多,將是非常痛苦的事。隨著規(guī)模越來越大,最終可能超出運(yùn)維能力的極限,無力維持存儲(chǔ)的可用性。

元數(shù)據(jù)方案在絕大多數(shù)情況下不會(huì)進(jìn)行數(shù)據(jù)遷移。少掉這樣一個(gè)復(fù)雜重載的環(huán)節(jié),對(duì)于系統(tǒng)維護(hù)的壓力會(huì)小很多。

因此,盡管元數(shù)據(jù)方案多出了一個(gè)元數(shù)據(jù)的存儲(chǔ)集群,但它相比一致性哈希方案反而更容易維持可用性。#p#

7. 性能

性能是大多數(shù)程序員都關(guān)心的東西,往往被放在很高的位置。但在云存儲(chǔ)中,性能反倒是級(jí)別較低的問題。存儲(chǔ)是io密集型的系統(tǒng),無論如何優(yōu)化代碼,都不可避免地受到物理設(shè)備的限制。

云存儲(chǔ)的性能要點(diǎn)首先在于并發(fā)。做好并發(fā),確保所有請(qǐng)求不會(huì)相互間阻塞,便可以從大的方面保證性能。元數(shù)據(jù)方案中,元數(shù)據(jù)存取存在大量的并發(fā)訪問。每個(gè)用戶的數(shù)據(jù)訪問請(qǐng)求,在這里會(huì)轉(zhuǎn)化成N個(gè)并發(fā)請(qǐng)求。系統(tǒng)不得不管理巨大數(shù)量的并發(fā)操作,并且小心維護(hù)并發(fā)之間的邏輯關(guān)系。傳統(tǒng)上使用的線程池很難滿足需要,不得不采用異步模型,從而增加開發(fā)難度。

一致性哈希在這方面有自身的優(yōu)勢(shì)。因?yàn)镹數(shù)不大,并發(fā)的放大效應(yīng)相比元數(shù)據(jù)方案要小很多。當(dāng)然前面也說了,小N數(shù)會(huì)減小一致性的裕度,也不利于可用性。

云存儲(chǔ)性能優(yōu)化另一個(gè)重要的要點(diǎn)是,減少一次用戶請(qǐng)求中跨服務(wù)器訪問的次數(shù)??缭骄W(wǎng)絡(luò)的訪問必然存在延遲,跨的次數(shù)越多,整體延遲越大。同時(shí)也會(huì)增加網(wǎng)絡(luò)的負(fù)擔(dān)。元數(shù)據(jù)方案天生多一次元數(shù)據(jù)檢索操作,因而在這方面處于劣勢(shì)。但一致性哈希在讀取對(duì)象時(shí),也沒有好到哪里去。前面討論一致性的時(shí)候已經(jīng)說過,為了執(zhí)行W+R>N的邏輯,又不能讀取所有副本,只能采取一次并發(fā)預(yù)讀操作。這樣一致性哈希的跨服務(wù)器訪問次數(shù)也同元數(shù)據(jù)方案扯平了。只是并發(fā)數(shù)少一些。這是以降低容錯(cuò)能力為代價(jià)的。

元數(shù)據(jù)在性能方面的主要劣勢(shì)是元數(shù)據(jù)的訪問。系統(tǒng)對(duì)元數(shù)據(jù)的訪問主要是檢索操作,因此通常會(huì)采用數(shù)據(jù)庫,或者具備檢索功能的數(shù)據(jù)存儲(chǔ)引擎。這些模塊在重載情況下有性能限制。由于副本數(shù)多,簡單地?cái)U(kuò)展服務(wù)器數(shù)量代價(jià)較大。好在這些部分的優(yōu)化,特別是數(shù)據(jù)庫優(yōu)化,有很成熟的經(jīng)驗(yàn),花些功夫也是能做好的。

8. 其他

在功能方面,一致性哈希還有一個(gè)不足。盡管一致性哈??梢詫?shí)現(xiàn)對(duì)象存儲(chǔ)的基本功能,但存儲(chǔ)服務(wù)有時(shí)需要提供一些額外的功能,比如列出一個(gè)用戶所保存的對(duì)象key清單。如果有元數(shù)據(jù),那么這些用戶的信息可以保存在元數(shù)據(jù)里,需要的時(shí)候檢索這些信息即可。但是,在一致性哈希方案中,所有的key在系統(tǒng)中已經(jīng)被哈希,分散到所有服務(wù)器上。如果要獲得用戶的對(duì)象清單,那么就不得不在所有存儲(chǔ)節(jié)點(diǎn)上執(zhí)行相應(yīng)的檢索操作,想象一下一個(gè)幾千,甚至幾萬臺(tái)節(jié)點(diǎn)的存儲(chǔ)集群,執(zhí)行一次這樣的操作,會(huì)是什么結(jié)果?

對(duì)于存放了大量數(shù)據(jù)對(duì)象的用戶,列出對(duì)象清單的操作可能沒有什么直接意義。或許不提供此類功能,用戶也能忍受。但是,另一個(gè)用戶相關(guān)的問題卻無法回避。這就是計(jì)費(fèi)。計(jì)費(fèi)就是計(jì)算出一個(gè)用戶所有的對(duì)象所占據(jù)的容量,然后制作成費(fèi)用清單,提供給計(jì)費(fèi)系統(tǒng)。

計(jì)費(fèi)最簡單的辦法是通過用戶的訪問記錄,累積出來,寫入就加,刪除就減。但是實(shí)際沒那么簡單。對(duì)于一個(gè)key的覆蓋寫入,那么必須先扣除原有的對(duì)象大小,然后再加上新對(duì)象的大小。

更重要的,由于訪問記錄可能出錯(cuò)或者丟失,這種相對(duì)計(jì)算方式隨著時(shí)間的增長會(huì)產(chǎn)生累積誤差。需要定期校準(zhǔn)。校準(zhǔn)的方式就是統(tǒng)計(jì)所有用戶的對(duì)象大小,做絕對(duì)容量的計(jì)算。由于對(duì)象大小存放在所有數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)中,這又是一個(gè)恐怖的全系統(tǒng)的數(shù)據(jù)掃描。同時(shí)還必須確保對(duì)象屬性的一致性,以免計(jì)費(fèi)出錯(cuò)。

計(jì)費(fèi)涉及到錢,通常用戶會(huì)非常敏感,應(yīng)當(dāng)盡可能不出錯(cuò)。校準(zhǔn)需要盡量頻繁。但是全集群的計(jì)費(fèi)校準(zhǔn)代價(jià)實(shí)在太高,還是應(yīng)當(dāng)盡量少做。于是這對(duì)矛盾怎么調(diào)和,對(duì)于開發(fā)運(yùn)維人員都是個(gè)巨大的挑戰(zhàn)。

在元數(shù)據(jù)方案中,計(jì)費(fèi)所需信息都可以保存在元數(shù)據(jù)中,計(jì)費(fèi)操作只局限在元數(shù)據(jù)上。元數(shù)據(jù)量少,可以直接將數(shù)據(jù)dump出來,在額外的服務(wù)器上計(jì)算。這種操作相對(duì)輕量很多,可以更頻繁地執(zhí)行,提高用戶賬單的準(zhǔn)確性。

9. 總結(jié)

經(jīng)過大體的分析,可以看到在僅考慮云存儲(chǔ)功能需求的情況下,一致性哈希具備簡單高效的優(yōu)勢(shì)。但是,大型的云存儲(chǔ)系統(tǒng)的功能不是影響其架構(gòu)的主要因素。包括規(guī)模、可擴(kuò)展性、可靠性、可用性和一致性等方面的非功能性需求才是云存儲(chǔ)需要重點(diǎn)考慮的地方。一致性哈希及其各種變形方案,在這些方面存在諸多缺陷。盡管每個(gè)方面的缺陷并非不可逾越的障礙,往往都可以通過一些設(shè)計(jì)和運(yùn)維手段加以解決。但是系統(tǒng)復(fù)雜度和運(yùn)維難度隨之增加。最關(guān)鍵的,每個(gè)方面的問題整合起來所產(chǎn)生的疊加效應(yīng),會(huì)輕而易舉地摧垮一個(gè)云存儲(chǔ)系統(tǒng)。

一般而言,一致性哈希適合一些有既定規(guī)模,不太需要擴(kuò)展,數(shù)據(jù)尺寸不大的場合。這些特性意味著一致性哈希無法很好地適用于大型的云存儲(chǔ)系統(tǒng)。元數(shù)據(jù)方案盡管在架構(gòu)上復(fù)雜些,但其優(yōu)點(diǎn)是靈活。而這種靈活性更加適合云存儲(chǔ)的需要。

責(zé)任編輯:張浩 來源: 莫華楓的博客
相關(guān)推薦

2015-08-06 10:54:04

云存儲(chǔ)元數(shù)據(jù)元數(shù)據(jù)保障

2015-11-10 18:18:01

京東云何剛

2023-05-26 06:49:44

2017-03-08 10:29:06

HBase大數(shù)據(jù)存儲(chǔ)

2018-10-29 12:51:35

分布式存儲(chǔ)元數(shù)據(jù)

2016-09-22 11:01:42

云存儲(chǔ) 領(lǐng)域

2018-03-14 09:30:06

云存儲(chǔ)數(shù)據(jù)安全

2018-08-22 16:35:31

存儲(chǔ)

2013-08-08 10:14:52

云存儲(chǔ)云計(jì)算

2018-03-12 08:17:27

分布式存儲(chǔ)

2012-06-08 09:15:35

云計(jì)算數(shù)據(jù)存儲(chǔ)公有云

2018-08-24 09:42:05

云存儲(chǔ)存儲(chǔ)大數(shù)據(jù)

2016-06-28 11:20:42

云計(jì)算云備份

2014-11-05 10:20:35

馬云庫克

2021-07-26 10:30:26

云計(jì)算數(shù)據(jù)存儲(chǔ)云應(yīng)用

2011-01-04 10:00:41

云計(jì)算YunTable

2018-12-21 10:46:43

華為《營贏》雜志

2018-12-19 16:37:09

華為

2018-05-22 08:57:31

開源軟件定義存儲(chǔ)

2013-06-05 09:55:34

云音樂丁磊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美不卡在线 | 久久久久国产一区二区三区 | 精品国产欧美一区二区三区成人 | www.se91| 国产农村妇女精品一区 | 国产91一区| 操人网站 | 久久久国产一区二区三区 | 国产视频1 | 成人精品国产 | 亚洲福利网 | 日韩av一二三区 | 免费xxxx大片国产在线 | 亚洲成人自拍 | 啪啪综合网 | 特黄视频| 西西裸体做爰视频 | 日韩在线免费播放 | 在线视频 亚洲 | 欧美视频精品 | 精品一区av | 在线天堂免费中文字幕视频 | 伊人久久大香线 | 99久久精品国产一区二区三区 | 又黑又粗又长的欧美一区 | 中文字幕 国产 | 国产97在线看 | 国产精品久久精品 | 亚洲久在线| v亚洲| 在线免费看黄 | 欧美精品乱码久久久久久按摩 | 久久久亚洲 | 91就要激情| 狠狠爱一区二区三区 | 狠狠热视频 | 国产日韩精品视频 | 羞羞网站在线观看 | 国产视频一区二区三区四区五区 | 国产一区二区三区四区区 | 麻豆精品国产91久久久久久 |