自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

云存儲(chǔ)的黑暗面:元數(shù)據(jù)保障

云計(jì)算
本文主旨并非闡述一個(gè)可用的架構(gòu)設(shè)計(jì),而是展示出對(duì)象存儲(chǔ)的元數(shù)據(jù)保障中將會(huì)遇到的問(wèn)題。問(wèn)題往往比答案更重要。

本文主旨并非闡述一個(gè)可用的架構(gòu)設(shè)計(jì),而是展示出對(duì)象存儲(chǔ)的元數(shù)據(jù)保障中將會(huì)遇到的問(wèn)題。問(wèn)題往往比答案更重要。多數(shù)問(wèn)題只要認(rèn)識(shí)清楚,解決并非難事。但需要注意的是,沒(méi)有哪個(gè)問(wèn)題存在十全十美的徹底解決方案。我們所采取的策略更多的是將一個(gè)關(guān)鍵性問(wèn)題轉(zhuǎn)化成另一個(gè)次要和易于處理的問(wèn)題,或者將一個(gè)問(wèn)題發(fā)生的可能性盡可能降低。很多問(wèn)題是無(wú)法徹底解決的,我們的現(xiàn)實(shí)目標(biāo)是將其發(fā)生的概率下降到業(yè)務(wù)可接受的范圍。因此,希望大家能夠更多地關(guān)注和發(fā)掘所存在的問(wèn)題,而不是緊盯方案和設(shè)計(jì)。我們相信,認(rèn)清了問(wèn)題之后,找到解決辦法并非難事。

在開(kāi)始討論元數(shù)據(jù)保障的問(wèn)題之前,我們先要牢牢記住一句話:“任何事物都會(huì)出錯(cuò)。”這個(gè)真理時(shí)時(shí)刻刻在發(fā)揮著驚人的作用。

元數(shù)據(jù)

元數(shù)據(jù)系統(tǒng)的好壞關(guān)系到整個(gè)對(duì)象存儲(chǔ)系統(tǒng)的可靠性、可用性和一致性,并且會(huì)影響到性能。因此,元數(shù)據(jù)部分是對(duì)象存儲(chǔ)系統(tǒng)的核心,也是架構(gòu)和保障的重中之重。

元數(shù)據(jù)最基本的作用在于數(shù)據(jù)對(duì)象的定位。對(duì)象存儲(chǔ)的任務(wù)是保存用戶(hù)提交的數(shù)據(jù)對(duì)象,并以用戶(hù)指定的名稱(chēng)(Key)對(duì)其標(biāo)識(shí)。用戶(hù)如需獲取一個(gè)數(shù)據(jù)對(duì)象,要向?qū)ο蟠鎯?chǔ)系統(tǒng)提交Key,存儲(chǔ)系統(tǒng)便會(huì)根據(jù)Key找到相應(yīng)的數(shù)據(jù)對(duì)象,然后反饋給用戶(hù)。存儲(chǔ)系統(tǒng)根據(jù)Key找到數(shù)據(jù)對(duì)象存放位置的過(guò)程,便是依托元數(shù)據(jù)完成的。圖1是元數(shù)據(jù)方案架構(gòu)圖。

云存儲(chǔ)的黑暗面:元數(shù)據(jù)保障

元數(shù)據(jù)的核心內(nèi)容是Key=>Pos(存儲(chǔ)位置)的映射,本質(zhì)上是一個(gè)Map。此外,元數(shù)據(jù)還承載了數(shù)據(jù)對(duì)象歸屬(容器和用戶(hù))、大小、校驗(yàn)值等元信息,用于記賬、校對(duì)、修復(fù)和分析等輔助操作。

說(shuō)到這里,大家或許會(huì)有疑問(wèn):現(xiàn)今的存儲(chǔ)系統(tǒng)都流行去中心化,設(shè)法去掉元數(shù)據(jù),為何還要談元數(shù)據(jù)的保障?原因其實(shí)很簡(jiǎn)單,當(dāng)今各種去中心化的存儲(chǔ)設(shè)計(jì),在云存儲(chǔ)中并不適用。其中原因頗為繁復(fù),已超出本文范疇,這里只做簡(jiǎn)單說(shuō)明。

去中心化的方案利用算法確定數(shù)據(jù)對(duì)象的位置。最常見(jiàn)的算法是一致性哈希。這些方案的問(wèn)題在于,如果僅考慮數(shù)據(jù)對(duì)象的存取,邏輯很簡(jiǎn)單,實(shí)現(xiàn)上也簡(jiǎn)單。但如果考慮到可靠性、可用性、一致性,以及運(yùn)維,就會(huì)變得復(fù)雜。

數(shù)據(jù)對(duì)象的存儲(chǔ)副本總會(huì)損壞和丟失。一旦丟失,需要盡快修復(fù)。最極端的情況是某一磁盤(pán)失效,進(jìn)而造成大量的數(shù)據(jù)副本需要修復(fù)。去中心化方案將數(shù)據(jù)對(duì)象的副本同磁盤(pán)一一對(duì)應(yīng)起來(lái),結(jié)果就是修復(fù)的數(shù)據(jù)只能灌入一塊磁盤(pán)。單塊磁盤(pán)的吞吐能力有限,從而造成一塊磁盤(pán)的數(shù)據(jù)需要近一天的時(shí)間方能修復(fù)。而在大型存儲(chǔ)系統(tǒng)中,這段時(shí)間內(nèi)可能會(huì)有更多的磁盤(pán)發(fā)生損壞,因而可能造成數(shù)據(jù)的丟失。

同樣因?yàn)閿?shù)據(jù)對(duì)象與服務(wù)器和磁盤(pán)綁定,一旦一臺(tái)服務(wù)器下線,便會(huì)降低相應(yīng)對(duì)象的存取可用性。有些方案臨時(shí)將數(shù)據(jù)對(duì)象映射到其他服務(wù)器,從而提高可用性,但臨時(shí)狀態(tài)的管理、其間的異常處理等問(wèn)題的復(fù)雜性遠(yuǎn)遠(yuǎn)超出了去中心化所帶來(lái)的便利。

當(dāng)存儲(chǔ)系統(tǒng)擴(kuò)容時(shí),去中心化方案需要在服務(wù)器之間遷移大量的數(shù)據(jù),以求各磁盤(pán)的可用容量達(dá)到平衡。遷移規(guī)模隨擴(kuò)容規(guī)模增大而增加。遷移過(guò)程消耗系統(tǒng)資源,并且存在中間狀態(tài),使得數(shù)據(jù)存取邏輯復(fù)雜化。而且漫長(zhǎng)的遷移過(guò)程中一旦發(fā)生異常,其處理過(guò)程相當(dāng)繁復(fù)。

在一致性方面,去中心化方案礙于副本數(shù)較少,在某些特定情況下會(huì)造成一致性問(wèn)題,而且難以修復(fù)。關(guān)于這一點(diǎn),后面會(huì)具體論述。

對(duì)于list操作、數(shù)據(jù)校驗(yàn)、記賬等輔助操作,各種去中心化的方案都很不友好。因?yàn)閿?shù)據(jù)量龐大,無(wú)法通過(guò)遍歷所有數(shù)據(jù)計(jì)算用量、分析統(tǒng)計(jì)。因此,一些去中心化方案會(huì)設(shè)置數(shù)據(jù)對(duì)象和用戶(hù)的關(guān)聯(lián)數(shù)據(jù)庫(kù),以方便使用量計(jì)算。這些數(shù)據(jù)庫(kù)實(shí)際上就是一種元數(shù)據(jù)庫(kù),同樣面臨著元數(shù)據(jù)保障的問(wèn)題。

去中心化方案的諸多問(wèn)題并非無(wú)法解決,總能找到合適的方法應(yīng)對(duì)。但其實(shí)這只是將壓力轉(zhuǎn)移到運(yùn)維階段,使得運(yùn)維成為瓶頸。我們說(shuō)存儲(chǔ)系統(tǒng)是“三分研發(fā),七分運(yùn)維”,運(yùn)維是重中之重,無(wú)論從設(shè)計(jì)還是研發(fā)角度,都應(yīng)當(dāng)以方便運(yùn)維,減少運(yùn)維壓力為先。表1中對(duì)比了去中心化方案和元數(shù)據(jù)方案。

云存儲(chǔ)的黑暗面:元數(shù)據(jù)保障

元數(shù)據(jù)的特性

讓我們回到元數(shù)據(jù)上來(lái)。元數(shù)據(jù)相對(duì)于數(shù)據(jù)對(duì)象本身,總量較少。根據(jù)統(tǒng)計(jì),元數(shù)據(jù)和數(shù)據(jù)對(duì)象的大小之比大體在1:100到1:10000之間,具體的比率,取決于數(shù)據(jù)對(duì)象的平均大小。因此,元數(shù)據(jù)相比數(shù)據(jù)對(duì)象本身更加容易操作和處理。

當(dāng)用戶(hù)索取數(shù)據(jù)對(duì)象時(shí),存儲(chǔ)系統(tǒng)需要檢索元數(shù)據(jù)庫(kù),找到相應(yīng)的元數(shù)據(jù)條目,獲得存儲(chǔ)信息后,進(jìn)行讀取。因此,元數(shù)據(jù)的操作是查詢(xún)操作,也就是數(shù)據(jù)庫(kù)操作。正因?yàn)樵獢?shù)據(jù)的量較少,并且都是結(jié)構(gòu)化數(shù)據(jù),使得這種檢索得以方便地實(shí)現(xiàn)。

即便如此,當(dāng)存儲(chǔ)量達(dá)到幾十PB級(jí)別時(shí),元數(shù)據(jù)的數(shù)據(jù)量也將達(dá)到幾十上百TB的級(jí)別。這已遠(yuǎn)超出單臺(tái)服務(wù)器的存儲(chǔ)能力。因此,元數(shù)據(jù)庫(kù)天生便是一個(gè)分布式集群。在分布式數(shù)據(jù)庫(kù)集群中,很難維持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),特別是在可靠性、可用性、一致性,以及性能的約束下,同時(shí)滿足這些要求是極難做到的。在動(dòng)輒數(shù)以PB計(jì)的云存儲(chǔ)系統(tǒng)中,只得維持最簡(jiǎn)單的對(duì)象存儲(chǔ)形態(tài),這也就是大型的云存儲(chǔ)系統(tǒng)不支持文件系統(tǒng)的原因。

元數(shù)據(jù)的重要性在于它是整個(gè)數(shù)據(jù)存儲(chǔ)的基準(zhǔn):整個(gè)系統(tǒng)擁有哪些數(shù)據(jù)對(duì)象,歸屬哪些容器、哪些用戶(hù)。一個(gè)數(shù)據(jù)對(duì)象,元數(shù)據(jù)說(shuō)有,就有了;元數(shù)據(jù)說(shuō)沒(méi)有,就沒(méi)有了。所以,元數(shù)據(jù)的可靠性代表著存儲(chǔ)系統(tǒng)的可靠性。數(shù)據(jù)校驗(yàn)、空間回收等操作都依賴(lài)于元數(shù)據(jù)。元數(shù)據(jù)一旦有所差錯(cuò),必然造成整個(gè)數(shù)據(jù)存儲(chǔ)的錯(cuò)失和混亂。

同時(shí),幾乎所有操作都需要操作元數(shù)據(jù),或讀取,或?qū)懭?,是存?chǔ)系統(tǒng)的關(guān)鍵路徑。如果元數(shù)據(jù)系統(tǒng)下線,那么整個(gè)存儲(chǔ)系統(tǒng)就會(huì)宕機(jī)。因此,元數(shù)據(jù)部分的可用性決定了存儲(chǔ)系統(tǒng)的可用性。

性能方面,幾乎所有的操作都涉及到元數(shù)據(jù),整個(gè)元數(shù)據(jù)系統(tǒng)的訪問(wèn)壓力遠(yuǎn)遠(yuǎn)超過(guò)存儲(chǔ)系統(tǒng)。因而,元數(shù)據(jù)的性能決定了存儲(chǔ)系統(tǒng)的整體響應(yīng)。

元數(shù)據(jù)的一致性也決定了存儲(chǔ)系統(tǒng)的一致性。一致性決定了用戶(hù)在不同時(shí)間對(duì)同一個(gè)對(duì)象訪問(wèn)是否得到同樣的結(jié)果。當(dāng)一致性發(fā)生問(wèn)題時(shí),用戶(hù)在不同的時(shí)間可能獲得某個(gè)對(duì)象的不同版本,甚至無(wú)法獲得有效的對(duì)象。這些違背用戶(hù)預(yù)期的情況往往造成用戶(hù)業(yè)務(wù)邏輯的混亂,引發(fā)不可預(yù)期的結(jié)果。而在某些特定的情況下,一致性的錯(cuò)亂會(huì)增加數(shù)據(jù)丟失的可能性。

作為存儲(chǔ)系統(tǒng)的樞紐,元數(shù)據(jù)占到整個(gè)系統(tǒng)大部分的維護(hù)工作量。元數(shù)據(jù)系統(tǒng)可維護(hù)性上的提升對(duì)于整體的運(yùn)維有莫大的幫助。

元數(shù)據(jù)保障的真正困難在于上述這些特性的平衡和協(xié)調(diào)。這些特性之間有時(shí)會(huì)相互補(bǔ)充,但更多的時(shí)候會(huì)相互矛盾和沖突。試圖解決其中一個(gè)方面的問(wèn)題,可能導(dǎo)致其他方面受到損害。解決問(wèn)題的過(guò)程充滿了大量的折中手段。

接下來(lái)具體說(shuō)一說(shuō)云存儲(chǔ)元數(shù)據(jù)保障所面臨的問(wèn)題和一般應(yīng)對(duì)手段。

#p#

主從模型

首先我們必須解決可靠性和可用性問(wèn)題,盡可能保證保存下來(lái)的元數(shù)據(jù)不丟失,也盡可能讓服務(wù)始終在線。這里有一個(gè)關(guān)鍵點(diǎn):怎樣才算保存下來(lái)?這個(gè)問(wèn)題看似簡(jiǎn)單,實(shí)則至關(guān)重要。一般我們會(huì)認(rèn)為所謂保存下來(lái)就是存儲(chǔ)到磁盤(pán)或其他持久存儲(chǔ)設(shè)備上。但在一個(gè)在線系統(tǒng)中無(wú)法以此界定。在一個(gè)在線服務(wù)中,數(shù)據(jù)完成保存是指明確向客戶(hù)端反饋數(shù)據(jù)已經(jīng)正確保存。一旦向客戶(hù)端發(fā)出這樣的反饋,那么便是承諾數(shù)據(jù)已經(jīng)保存下來(lái)。在這個(gè)界定之下,元數(shù)據(jù)的可靠性保障則頗為復(fù)雜。

前面說(shuō)過(guò),元數(shù)據(jù)系統(tǒng)是一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),保障數(shù)據(jù)庫(kù)系統(tǒng)可靠性最常用手段就是主從模型(圖2),即讀寫(xiě)主數(shù)據(jù)庫(kù),而主數(shù)據(jù)庫(kù)將數(shù)據(jù)復(fù)制到從數(shù)據(jù)庫(kù),從而確保數(shù)據(jù)庫(kù)沒(méi)有單點(diǎn)。主從模型同時(shí)也保障了可用性,當(dāng)主服務(wù)器下線時(shí),從服務(wù)器可以切換成主服務(wù)器,繼續(xù)提供服務(wù)。這樣的保障手段對(duì)于一般的在線應(yīng)用大體上夠用了,但對(duì)于云存儲(chǔ)的元數(shù)據(jù)而言,則存在諸多問(wèn)題。其中緣由頗為復(fù)雜,讓我們從最基本的可靠性開(kāi)始。

云存儲(chǔ)的黑暗面:元數(shù)據(jù)保障

主從模型是依靠主服務(wù)器向從服務(wù)器復(fù)制每次寫(xiě)入的數(shù)據(jù),以確保數(shù)據(jù)存留不止一份。但這里有個(gè)同步和異步的問(wèn)題。所謂“異步”是指主服務(wù)器完成數(shù)據(jù)寫(xiě)入之后,即刻向客戶(hù)端反饋寫(xiě)入成功信息,然后在適當(dāng)?shù)臅r(shí)候(通常都是盡快)向從服務(wù)器復(fù)制數(shù)據(jù)??蛻?hù)端得到保存完成的信息后便歡歡喜喜做后面的事情去了。而此刻相應(yīng)的數(shù)據(jù)只有主服務(wù)器上保存著,如果發(fā)生磁盤(pán)損壞之類(lèi)的問(wèn)題,便會(huì)丟失那些尚未來(lái)得及復(fù)制到從服務(wù)器的數(shù)據(jù)。之后如果客戶(hù)端來(lái)提取這條數(shù)據(jù),服務(wù)端卻無(wú)法給出,對(duì)存儲(chǔ)系統(tǒng)而言,是很丟人的事。

即便沒(méi)有發(fā)生硬件損壞的情況,依然可能丟失數(shù)據(jù)。由于硬盤(pán)之類(lèi)的存儲(chǔ)介質(zhì)速度緩慢,無(wú)法跟上數(shù)據(jù)訪問(wèn)的節(jié)奏,所以數(shù)據(jù)庫(kù)都會(huì)使用內(nèi)存進(jìn)行緩存。當(dāng)服務(wù)器發(fā)生掉電或者崩潰,數(shù)據(jù)庫(kù)發(fā)生非正常的退出時(shí),都會(huì)造成緩存中沒(méi)有寫(xiě)入磁盤(pán)的數(shù)據(jù)丟失,進(jìn)而造成數(shù)據(jù)的丟失。

在存儲(chǔ)系統(tǒng)長(zhǎng)期的運(yùn)行過(guò)程中,硬件肯定會(huì)壞,掉電必然會(huì)發(fā)生,系統(tǒng)也難保不會(huì)崩潰。所以這種異步的數(shù)據(jù)復(fù)制過(guò)程必然會(huì)有數(shù)據(jù)的丟失。這對(duì)于在線存儲(chǔ)服務(wù)而言是無(wú)法容忍的。

既然異步存在這樣的問(wèn)題,那么同步地復(fù)制數(shù)據(jù)是否會(huì)好些呢?所謂“同步”是指主服務(wù)器完成數(shù)據(jù)寫(xiě)入后,并不立即反饋用戶(hù),而是先將數(shù)據(jù)復(fù)制到從服務(wù)器。等到從服務(wù)器正確寫(xiě)入,再向用戶(hù)反饋數(shù)據(jù)寫(xiě)入完成。這樣,任何時(shí)刻都會(huì)至少有兩臺(tái)服務(wù)器擁有某一條數(shù)據(jù),即便一臺(tái)服務(wù)器出了問(wèn)題,也可以確保數(shù)據(jù)還在。如果有多臺(tái)從服務(wù)器自然就萬(wàn)無(wú)一失了。

同步模式解決了可靠性問(wèn)題,卻引入了新問(wèn)題。最基本的問(wèn)題就是同步的數(shù)據(jù)復(fù)制造成延遲的增加:主服務(wù)器需要等待從服務(wù)器完成寫(xiě)入才能反饋。

讓我們先放下性能問(wèn)題,畢竟在線對(duì)象存儲(chǔ)對(duì)于主從同步的延遲還沒(méi)有那么敏感。剩下的問(wèn)題則是根本性的。同步模式解決了可靠性問(wèn)題,下一步需要考慮可用性問(wèn)題。對(duì)于在線存儲(chǔ)服務(wù)而言,必須要確保系統(tǒng)不受單點(diǎn)故障的影響。同步模式則恰恰受制于此。為了確保可靠性,必須主從服務(wù)器都寫(xiě)入成功,才能向用戶(hù)反饋成功。如果從服務(wù)器下線,那么這個(gè)條件就被破壞,不得不向用戶(hù)反饋失敗,直到從服務(wù)器重新恢復(fù)。而當(dāng)主服務(wù)器下線后,從服務(wù)器則設(shè)法升級(jí)為主服務(wù)器繼續(xù)服務(wù)。但此時(shí)只有一臺(tái)服務(wù)器,也不能滿足數(shù)據(jù)不少于兩份的要求。如果允許主從之間容忍從服務(wù)器的下線,那么可靠性又受到了削弱。這樣產(chǎn)生了令人啼笑皆非的結(jié)果,主從模型是為了提高可靠性和可用性,現(xiàn)在反到受制于單點(diǎn)故障。

解決這一問(wèn)題的方法也不是很難:增加從服務(wù)器的數(shù)量,并且允許主從復(fù)制失敗。如此,當(dāng)一臺(tái)從服務(wù)器下線后,其他從服務(wù)器依然可以接收數(shù)據(jù),確保任何時(shí)刻一份數(shù)據(jù)都至少擁有兩個(gè)以上的副本,以維持可靠性。不過(guò),具體操作上并沒(méi)有那么簡(jiǎn)單,主從之間復(fù)制成功的數(shù)量必須滿足一個(gè)閾值。這個(gè)閾值也必須滿足一個(gè)條件才能保證數(shù)據(jù)一致性,關(guān)于這個(gè)要點(diǎn)后面會(huì)具體闡述。

又有新的問(wèn)題出現(xiàn)。當(dāng)主服務(wù)器下線時(shí),一臺(tái)從服務(wù)器便會(huì)被升級(jí)成為主服務(wù)器。但前面說(shuō)了,為了可用性,并不要求主從服務(wù)器間的復(fù)制每次都成功,那么新的主服務(wù)器的數(shù)據(jù)可能是不完整的。這樣對(duì)于用戶(hù)而言,便會(huì)出現(xiàn)數(shù)據(jù)一致性的問(wèn)題:原先成功寫(xiě)入的數(shù)據(jù)卻讀不到了,或者讀到的都是很舊的版本,已被覆蓋掉的東西。給用戶(hù)造成的印象便是數(shù)據(jù)丟失了,這是嚴(yán)重的問(wèn)題。

最直觀的解決途徑是設(shè)法補(bǔ)上那些數(shù)據(jù)。但考慮到元數(shù)據(jù)的量,這樣的修補(bǔ)是無(wú)法在短期內(nèi)完成的。另一個(gè)更復(fù)雜卻真正有效的方法是讀取數(shù)據(jù)時(shí),同時(shí)讀所有的服務(wù)器,不管主從。然后將所得的結(jié)果整合在一起,找出正確的版本。

云存儲(chǔ)的黑暗面:元數(shù)據(jù)保障

事情還沒(méi)有完結(jié),存放在數(shù)據(jù)庫(kù)中的數(shù)據(jù)經(jīng)年累月地運(yùn)行之后,會(huì)逐步退化。磁盤(pán)的失效,磁道的損壞,乃至人為的操作失誤,都可能造成數(shù)據(jù)副本的丟失。換句話說(shuō),即便是主服務(wù)器,我們也無(wú)法完全保證數(shù)據(jù)的完整性和一致性。無(wú)論如何都無(wú)法回避主從服務(wù)器之間的一致性問(wèn)題。

無(wú)論是主服務(wù)器,還是從服務(wù)器,終究需要對(duì)缺失的數(shù)據(jù)副本進(jìn)行修補(bǔ),否則數(shù)據(jù)的退化終究會(huì)造成數(shù)據(jù)的遺失。這種修補(bǔ)的過(guò)程也是困難重重,后面會(huì)進(jìn)一步分析。

最后,最重要的就是運(yùn)維。架構(gòu)、設(shè)計(jì)、開(kāi)發(fā)之類(lèi)的都是短期過(guò)程,雖說(shuō)系統(tǒng)需要不斷演進(jìn),但畢竟都是階段性的工作。而運(yùn)維,則是持久的、不間斷的任務(wù)。一個(gè)在線服務(wù)的正常運(yùn)行最終還要依賴(lài)運(yùn)維,運(yùn)維決定了服務(wù)的品質(zhì)。因此,一個(gè)設(shè)計(jì)方案的可維護(hù)性具有很高的優(yōu)先級(jí)。

在可維護(hù)性方面,主從模型除了常規(guī)的系統(tǒng)維護(hù)事務(wù)外,還有很多額外的運(yùn)維過(guò)程。主服務(wù)器下線,需要將某一臺(tái)從服務(wù)器切換為主服務(wù)器,這個(gè)過(guò)程是一個(gè)運(yùn)維過(guò)程。理論上,一個(gè)主從集群可以實(shí)現(xiàn)自動(dòng)切換。但實(shí)際使用中,這種切換并不能確保成功,往往需要人為干預(yù),切換失敗也是常有的事。對(duì)于計(jì)劃中的下線,如升級(jí)軟硬件等,運(yùn)維強(qiáng)度尚不算大,但對(duì)于軟硬件故障造成的突發(fā)下線,主從切換往往是緊急運(yùn)維事件。一旦失敗,便是服務(wù)下線的大事故。其中充滿了風(fēng)險(xiǎn)和不可控因素,并不利于存儲(chǔ)服務(wù)的高可用。

一個(gè)在線系統(tǒng)的架構(gòu),最好的情況就是無(wú)論是正常運(yùn)行,還是發(fā)生意外故障,都能夠以同一種方式運(yùn)行,無(wú)須額外的應(yīng)急處理。用通俗的話說(shuō),在線系統(tǒng)必須能夠不動(dòng)聲色地扛住局部異常,為運(yùn)維人員贏得回旋處理的余地。對(duì)于云存儲(chǔ)的元數(shù)據(jù)系統(tǒng)尤是如此。元數(shù)據(jù)位居關(guān)鍵路徑,又存在持久化的狀態(tài),還受到各種特性要求的約束,它的架構(gòu)著實(shí)是一項(xiàng)富于挑戰(zhàn)的任務(wù)。

#p#

多副本模型

下面我們考查一個(gè)模型,暫且簡(jiǎn)單地稱(chēng)其為多副本模型。因?yàn)檫@種模型,就是利用眾多元數(shù)據(jù)副本來(lái)保證可靠性和可用性的。與主從模型不同的是,多副本模型的各副本之間沒(méi)有主次之分,所有的副本都處于相同的地位。因而,在向多副本模型寫(xiě)入元數(shù)據(jù)時(shí),是同時(shí)向這些副本發(fā)起寫(xiě)入。而讀取元數(shù)據(jù)時(shí),也是向這些副本同時(shí)讀(圖1)。

云存儲(chǔ)的黑暗面:元數(shù)據(jù)保障

圖1 多副本模型

多副本模型基于這樣一個(gè)簡(jiǎn)單而直觀的思路:?jiǎn)吸c(diǎn)會(huì)造成數(shù)據(jù)丟失,并引發(fā)可用性問(wèn)題,那么就將數(shù)據(jù)同時(shí)寫(xiě)入多個(gè)服務(wù)器,以防單點(diǎn)的出現(xiàn)。不同于主從模型中,讀寫(xiě)都針對(duì)一臺(tái)主服務(wù)器,從服務(wù)器只是間接地參與可靠性和可用性的保障,多副本模型的每臺(tái)服務(wù)器任何時(shí)刻都在直接發(fā)揮著保障作用。

由于每次讀寫(xiě)都施加在所有的副本服務(wù)器上,任何時(shí)刻都有不止一份數(shù)據(jù)被保存下來(lái),所以可靠性自然就解決了。同樣,任何時(shí)刻都有不止一臺(tái)服務(wù)器在運(yùn)行,它們同時(shí)下線的可能性極小(暫且不考慮機(jī)房級(jí)別的整體故障),所以可用性也無(wú)需額外措施,便可以得到保障。正是因?yàn)槊颗_(tái)副本服務(wù)器都是平等的,所以任何一臺(tái)服務(wù)器下線都不會(huì)對(duì)整個(gè)集群的可用性和可靠性產(chǎn)生影響,系統(tǒng)仍然依照正常情況下的方式運(yùn)行,別無(wú)二致。

這是多副本模型相對(duì)于主從模型的最大優(yōu)勢(shì)。無(wú)論哪臺(tái)服務(wù)器下線,都不會(huì)引起系統(tǒng)運(yùn)行狀態(tài)的變化,運(yùn)維人員可以從容地進(jìn)行善后處理,沒(méi)有服務(wù)下線的顧慮。而軟硬件升級(jí)之類(lèi)的日常維護(hù)工作,也不需要大動(dòng)干戈地進(jìn)行主從切換之類(lèi)的危險(xiǎn)操作,直接將服務(wù)器下線,進(jìn)行更新便可。多副本模型的系統(tǒng)甚至可以容忍多臺(tái)服務(wù)器下線,而不會(huì)造成系統(tǒng)運(yùn)行的波動(dòng)。具體的容忍限度取決于配置設(shè)定,關(guān)于這一點(diǎn),后文有詳細(xì)論述。

任何事物都有兩面,既然多副本模型有它的優(yōu)點(diǎn),自然也有缺點(diǎn)。多副本的問(wèn)題主要在一致性方面。由于我們?cè)试S副本服務(wù)器寫(xiě)入失敗,再加上各種原因造成的數(shù)據(jù)退化,所以副本服務(wù)器之間的數(shù)據(jù)會(huì)不一樣。當(dāng)我們讀取的時(shí)候以哪個(gè)為準(zhǔn)呢?

這是一個(gè)值得考慮的問(wèn)題。我們無(wú)法確定哪臺(tái)副本服務(wù)器包含了完整新鮮的數(shù)據(jù)。實(shí)際上不可能有這樣的服務(wù)器存在。因而我們也就無(wú)法從任何一臺(tái)服務(wù)器中準(zhǔn)確無(wú)誤地讀出所需的數(shù)據(jù)。唯一的辦法就是同時(shí)讀所有的副本服務(wù)器,綜合所得的副本數(shù)據(jù),以獲得所需的信息。

如何綜合副本數(shù)據(jù)呢?首先要確定基準(zhǔn)?;鶞?zhǔn)就是判定有效數(shù)據(jù)的標(biāo)準(zhǔn),有時(shí)間基準(zhǔn)和空間基準(zhǔn)之分。時(shí)間基準(zhǔn)用來(lái)處理元數(shù)據(jù)的先后覆蓋,而空間基準(zhǔn)用于處理副本之間的對(duì)應(yīng)關(guān)系。在描述如何確定基準(zhǔn)之前,先定下這樣一個(gè)準(zhǔn)則:對(duì)于一個(gè)數(shù)據(jù)對(duì)象的元數(shù)據(jù),只有時(shí)間最近的那條是有效的。有了這樣的準(zhǔn)則,建立基準(zhǔn)就容易了。我們可以為每一次元數(shù)據(jù)寫(xiě)入加上一個(gè)時(shí)間戳,并且確保一次元數(shù)據(jù)寫(xiě)入的各個(gè)副本擁有相同的時(shí)間戳,同時(shí)還需保證歷次寫(xiě)入的元數(shù)據(jù)擁有不同的時(shí)間戳。只要能確保這兩個(gè)條件,數(shù)據(jù)的基準(zhǔn)就容易確立了。

具體的方法并不復(fù)雜,將讀取到的副本數(shù)據(jù)放在一起比對(duì),時(shí)間戳上最近的那些副本,就是所需要的。但并非所有的最大時(shí)間戳都是有效的。假設(shè)這樣一種情況:一個(gè)元數(shù)據(jù)系統(tǒng)有5個(gè)副本,一次寫(xiě)入時(shí),由于種種原因,只有兩個(gè)副本寫(xiě)成功了。在讀取這條元數(shù)據(jù)時(shí),恰好那兩臺(tái)寫(xiě)成功的副本服務(wù)器下了線。這種情況下,這條元數(shù)據(jù)就無(wú)法讀到了。其結(jié)果就是元數(shù)據(jù)不見(jiàn)了,直到那兩臺(tái)服務(wù)器重新上線。

為了避免這種情況的出現(xiàn),我們需要引入一個(gè)規(guī)則,以確保無(wú)論怎樣都能讀到正確的數(shù)據(jù)。

這樣的方法有不少,最常用的是WRN算法(圖2)。這種算法比較簡(jiǎn)單,容易實(shí)現(xiàn),使用也較廣。算法的具體操作如下。

云存儲(chǔ)的黑暗面:元數(shù)據(jù)保障

圖2 WRN算法

假設(shè)有N個(gè)副本,當(dāng)需要訪問(wèn)數(shù)據(jù)時(shí),同時(shí)寫(xiě)或者讀所有副本。如果寫(xiě)入時(shí),有超過(guò)W個(gè)副本寫(xiě)成功,那么就認(rèn)為這次寫(xiě)入是成功的,否則就算失敗,向客戶(hù)端反饋寫(xiě)入失敗。讀取時(shí)也一樣,如果有超過(guò)R個(gè)副本讀取成功,就認(rèn)為這次讀取是成功的,否則就算失敗,或者數(shù)據(jù)不存在(具體是失敗,還是不存在,需根據(jù)副本讀取的結(jié)果加以判別)。W和R必須滿足一個(gè)條件:W+R>N。只要滿足這個(gè)條件,成功寫(xiě)和成功讀的副本之間必然存在重疊,因而肯定可以讀到至少一個(gè)有效的數(shù)據(jù)。

在具體使用中,WRN算法還有不少需要注意的細(xì)節(jié)。首先,具體讀取各副本時(shí),最簡(jiǎn)單的策略是取得該副本服務(wù)器中最新的那條元數(shù)據(jù),然后依靠WRN算法整合這些所得的數(shù)據(jù)。這種做法在一般情況下可以正常工作,但在一些異常情況中會(huì)存在一致性問(wèn)題。一種情況是一次寫(xiě)入時(shí),沒(méi)有滿足成功寫(xiě)入W份副本的條件,那么這次寫(xiě)入算作失敗。但其中寫(xiě)成功的副本因?yàn)闀r(shí)間戳更近,讀取該副本時(shí),會(huì)覆蓋先前成功寫(xiě)入的那些副本。于是,最新寫(xiě)入失敗的那個(gè)元數(shù)據(jù)讀取時(shí)沒(méi)有達(dá)到足夠數(shù)量,而先前成功寫(xiě)入的元數(shù)據(jù)因?yàn)槟承└北颈贿@次失敗的殘留副本遮蓋,也無(wú)法達(dá)到R數(shù)。于是便會(huì)出現(xiàn)無(wú)法取得有效元數(shù)據(jù)的情況。

這種情況屬于低概率事件,但云存儲(chǔ)系統(tǒng)經(jīng)年累月不間斷地運(yùn)行,任何低概率的事件都會(huì)發(fā)生,而且必然發(fā)生。一旦發(fā)生,便會(huì)引發(fā)數(shù)據(jù)錯(cuò)亂的情況,影響用戶(hù)的使用和服務(wù)的聲譽(yù)。

針對(duì)這樣的問(wèn)題,有一些解決手段。最基本的手段是對(duì)于失敗的寫(xiě)入操作,將各副本進(jìn)行回滾。也就是將那些已成功寫(xiě)入的元數(shù)據(jù)條目副本刪除。這種做法可以在一定程度上有效地降低問(wèn)題發(fā)生的概率。但基于“任何東西都會(huì)出錯(cuò)”這樣一個(gè)事實(shí),我們認(rèn)為回滾也會(huì)失敗?;貪L失敗意味著依然會(huì)發(fā)生元數(shù)據(jù)無(wú)效的問(wèn)題。

另外,還有一個(gè)解決方法:讀取副本時(shí)不是只讀最近的那一條元數(shù)據(jù),而是讀出幾條。把各副本讀到的元數(shù)據(jù)根據(jù)時(shí)間戳相互對(duì)位,還原出最原始的寫(xiě)入狀態(tài)。在此基礎(chǔ)上,剔除那些失敗的寫(xiě)入數(shù)據(jù),得到正確的數(shù)據(jù)。

還原寫(xiě)入歷史的操作要求元數(shù)據(jù)在數(shù)據(jù)庫(kù)中采用只增的方式,以便保留歷史的條目。每次元數(shù)據(jù)的寫(xiě)訪問(wèn),無(wú)論是新增還是覆蓋,都是增加一條記錄。與原有的元數(shù)據(jù)記錄不同的是,這條記錄攜帶新的時(shí)間戳。對(duì)于刪除操作,則同樣增加一條數(shù)據(jù),并且設(shè)置記錄中的“刪除”標(biāo)志,系統(tǒng)將根據(jù)此標(biāo)志判斷記錄的刪除操作。(只增也有助于避免事務(wù),減少數(shù)據(jù)庫(kù)鎖的使用,對(duì)提升性能有所幫助。)

但與任何一種問(wèn)題解決手段一樣,這種還原歷史操作的方法也不能徹底消除一致性的問(wèn)題,原因是數(shù)據(jù)退化。假設(shè)一次寫(xiě)入正好成功了W個(gè)副本,那么這次寫(xiě)入盡管成功了,但仍處于臨界狀態(tài)。如果有一個(gè)原先成功的副本發(fā)生了丟失,那么之后這次寫(xiě)入將會(huì)被認(rèn)為是失敗的,而被忽略。盡管這是更加鮮有的情況,但確實(shí)會(huì)發(fā)生,而且無(wú)法直接消除。一般情況下,我們也只能容忍這種情況的存在,畢竟發(fā)生的概率已經(jīng)非常非常小了。

一些輔助手段可以進(jìn)一步減少這類(lèi)問(wèn)題發(fā)生的可能性。如果一次寫(xiě)入的成功數(shù)超過(guò)了W,但依舊有少量失敗,那么要實(shí)時(shí)地對(duì)這些失敗寫(xiě)入進(jìn)行修復(fù),例如重試,或者使用異步的重試隊(duì)列對(duì)失敗進(jìn)行修復(fù)。這種手段和失敗回滾一起可以很有效地減少容易產(chǎn)生混淆的臨界狀態(tài)的存在。

失敗修復(fù)和回滾之類(lèi)的錯(cuò)誤處理手段實(shí)際上并非很多人認(rèn)為的那么有效,錯(cuò)誤處理本身也會(huì)失敗。如果試圖以錯(cuò)誤處理消除問(wèn)題的隱患,那么必須也要對(duì)錯(cuò)誤處理的失敗情況加以處理。于是,就會(huì)有錯(cuò)誤處理的錯(cuò)誤處理,錯(cuò)誤處理的錯(cuò)誤處理的錯(cuò)誤處理……如此便無(wú)窮無(wú)盡,這自然不是解決問(wèn)題之道。錯(cuò)誤處理的作用是減小問(wèn)題發(fā)生的概率,最終將其減小到一個(gè)可以接受的范圍。

但考慮到數(shù)據(jù)退化,僅有簡(jiǎn)單的修復(fù)是不夠的。一則錯(cuò)誤處理不可能永遠(yuǎn)成功,二則并非每一次數(shù)據(jù)丟失都會(huì)被感知。我們需要一個(gè)最終的一致性修復(fù)手段,這個(gè)手段可以彌補(bǔ)其他異常處理失敗造成的問(wèn)題。但這樣的手段也會(huì)失敗,為了能夠最終確保錯(cuò)誤得到修復(fù),這種手段的失敗處理方式就是它自己。一般情況下,最終手段不需要有很強(qiáng)的實(shí)時(shí)性要求,它的任務(wù)在于應(yīng)對(duì)那些概率很低的情況。在對(duì)象存儲(chǔ)系統(tǒng)中,這個(gè)手段就是定期合成元數(shù)據(jù)快照。

元數(shù)據(jù)快照的做法是這樣的:定期導(dǎo)出所有副本的元數(shù)據(jù),按照時(shí)間戳匹配各條元數(shù)據(jù),然后依照WRN算法逐條將所有副本整合,拋棄那些失敗的殘留數(shù)據(jù),剔除被覆蓋的元數(shù)據(jù)。最終生成一個(gè)完整一致的快照。然后再重新載入元數(shù)據(jù)庫(kù),替換快照所涵蓋的數(shù)據(jù)。

快照生成的主要問(wèn)題是時(shí)間。元數(shù)據(jù)的量為數(shù)不少,通常都會(huì)在TB級(jí)別之上。對(duì)這樣的數(shù)據(jù)規(guī)模進(jìn)行匹配和計(jì)算,往往需要在一個(gè)集群中以Map-Reduce處理??紤]到成本,這樣的集群規(guī)模不可能很大,因而處理的時(shí)間將會(huì)比較長(zhǎng),可能達(dá)數(shù)小時(shí)。而且,數(shù)據(jù)的導(dǎo)出和加載也需要較長(zhǎng)的時(shí)間。同時(shí),作為一個(gè)定期的運(yùn)維過(guò)程,如何自動(dòng)化,減少人力參與也是非常重要的。總體上,如何快速并且自動(dòng)地合成快照是頗有挑戰(zhàn)的任務(wù)。

快照還有一些額外的作用,包括:生成每個(gè)容器的數(shù)據(jù)量、對(duì)象數(shù)等統(tǒng)計(jì)信息;生成每塊硬盤(pán)的對(duì)象清單,用于磁盤(pán)失效后的數(shù)據(jù)恢復(fù)和數(shù)據(jù)對(duì)象的校對(duì)。

快照的生成周期通常設(shè)置在一天。那么一條元數(shù)據(jù)的不一致情況最多只會(huì)存在一天,一天之后,該條元數(shù)據(jù)的所有副本又會(huì)恢復(fù)到一致的狀態(tài)。而只要一天內(nèi)沒(méi)有發(fā)生多臺(tái)服務(wù)器同時(shí)丟失數(shù)據(jù)的情況,元數(shù)據(jù)的可靠性便可以得到很好的保障。我們相信一天內(nèi)2臺(tái)以上服務(wù)器發(fā)生數(shù)據(jù)丟失的可能性極小。反倒是人為的操作失誤更容易造成這類(lèi)事故。而這就是另一個(gè)問(wèn)題了,不在本文的討論范圍內(nèi)。

除了上述這些奇妙問(wèn)題之外,還有一個(gè)在WRN理論中沒(méi)有被提及的問(wèn)題。多數(shù)涉及WRN的論文都說(shuō)這個(gè)算法可以保證強(qiáng)一致性,但實(shí)際上這是錯(cuò)的。WRN算法如果要保證強(qiáng)一致性需要有一個(gè)條件,就是對(duì)每一個(gè)副本的寫(xiě)入要么成功,要么失敗。在實(shí)際的使用過(guò)程中,副本的寫(xiě)入?yún)s有第三種狀態(tài)。

對(duì)于一個(gè)副本的寫(xiě)入必然是跨越網(wǎng)絡(luò)的。于是,一次副本寫(xiě)入實(shí)際包含三個(gè)步驟:向副本服務(wù)器發(fā)送請(qǐng)求;副本服務(wù)器寫(xiě)入數(shù)據(jù)庫(kù);反饋寫(xiě)入的結(jié)果。如果前兩個(gè)步驟發(fā)生錯(cuò)誤,那么這次副本寫(xiě)入操作就是完完全全的失敗。但如果前兩個(gè)步驟都成功了,但第三個(gè)步驟出現(xiàn)了問(wèn)題,如網(wǎng)絡(luò)連接中斷,或者數(shù)據(jù)報(bào)文丟失等,客戶(hù)端會(huì)認(rèn)為這次操作是失敗的。但實(shí)際上這條數(shù)據(jù)已正確地寫(xiě)入了數(shù)據(jù)庫(kù)。如果此時(shí)反饋信息恰巧達(dá)不到W數(shù),那么就會(huì)回復(fù)用戶(hù)這次元數(shù)據(jù)寫(xiě)入失敗。而實(shí)際數(shù)據(jù)庫(kù)中,成功寫(xiě)入的副本數(shù)卻是滿足W數(shù)的。在下一次讀取這個(gè)元數(shù)據(jù)時(shí),卻讀到了被認(rèn)為失敗的元數(shù)據(jù)。也就是說(shuō),外界認(rèn)為一個(gè)不存在的元數(shù)據(jù),在系統(tǒng)中卻是真實(shí)存在的。這種一致性問(wèn)題同樣是無(wú)法消除的。失敗回滾操作可以減少問(wèn)題的發(fā)生概率,但終究無(wú)法徹底杜絕。

整體上,多副本模型輕而易舉地解決了可靠性和可用性,卻將問(wèn)題集中到一致性上。一致性問(wèn)題有很多既定的解決手段,每一種手段都有各自的問(wèn)題,無(wú)法徹底將一致性問(wèn)題解決。但綜合這些手段,可以很好地將一致性提升到近似的強(qiáng)一致性級(jí)別,從而滿足實(shí)際的需要。

WRN算法在具體使用中,N、W、R的選擇頗有些講究。首先,N數(shù)不能太少。我們來(lái)看幾種不同的WRN設(shè)置:

N=3,W=2,R=2,W+R-N=1

N=6,W=4,R=4,W+R-N=2

N=9,W=6,R=6,W+R-N=3

這三種配置都滿足W+R>N。但效果卻完全不同。對(duì)于N=3的配置,只能容忍1臺(tái)服務(wù)器下線。另外一個(gè)更麻煩的問(wèn)題是,盡管寫(xiě)入時(shí)有兩個(gè)副本成功了,一個(gè)副本失敗,這算是成功的。但如果其中一個(gè)成功寫(xiě)入的副本發(fā)生了丟失,這時(shí)候殘存的只有一個(gè)副本,那么我們?cè)谧x取時(shí),實(shí)際上無(wú)法判別這一個(gè)副本是寫(xiě)入失敗殘存的副本,還是副本退化造成的。N=3時(shí),這種混淆很容易發(fā)生。

而隨著N數(shù)的增大,所能夠容忍的副本下線和副本退化的數(shù)量就多了。在既定時(shí)間段內(nèi),同時(shí)下線多個(gè)副本,或者同時(shí)丟失多個(gè)副本的概率就小很多了。因此,從一致性保障角度而言,N數(shù)越大越好。當(dāng)然,考慮到資源,N數(shù)終究不可能無(wú)限多,一般6-9是比較容易接受的數(shù)字。盡管副本數(shù)如此多,但畢竟元數(shù)據(jù)相對(duì)數(shù)據(jù)存儲(chǔ)本身有著多個(gè)數(shù)量級(jí)的差異,所占用的服務(wù)器資源畢竟還是少數(shù)。

在這里,我們可以看到那些去中心化方案在一致性保障方面的缺陷:因?yàn)閿?shù)據(jù)本身的量較大,所以考慮到成本,副本數(shù)不會(huì)太多,通常會(huì)選擇N=3。很明顯,3這個(gè)數(shù)字對(duì)于一致性保障而言還是相當(dāng)脆弱的。

至于W和R的具體數(shù)值,一般沒(méi)有太多的教條,但它們受制于存儲(chǔ)系統(tǒng)的部署。通常,對(duì)于云存儲(chǔ)系統(tǒng)而言,為了保障盡可能高的可靠性和可用性,會(huì)設(shè)法將存儲(chǔ)集群按照副本分散到不同的子集群中。每個(gè)子集群擁有獨(dú)立的交換機(jī)、獨(dú)立的配電線路,最好在物理位置上也相互獨(dú)立。最極端的情況就是分布在不同的IDC中(當(dāng)然不是所有的云計(jì)算服務(wù)商都有這樣的資源)。這樣的子集群通常稱(chēng)為zone。設(shè)置這樣的zone的目的是為了消除在基礎(chǔ)設(shè)施上的單點(diǎn)故障。

在這樣的部署結(jié)構(gòu)下,W和R的選擇應(yīng)當(dāng)確保在一個(gè)zone里的副本服務(wù)器數(shù)量不大于W+R-N。這樣的設(shè)置,是為了保證一個(gè)zone下線后,系統(tǒng)依然有足夠的副本服務(wù)器滿足WRN算法。

主從模型vs.多副本模型

從前面關(guān)于主從模型和多副本模型的介紹可以看到兩者的差異。主從模型中,主服務(wù)器必然會(huì)由于各種原因而下線。一旦主服務(wù)器下線,那么就必須即刻采取行動(dòng),將從服務(wù)器切換成主服務(wù)器,保證系統(tǒng)依舊在線。但這種切換操作同樣也會(huì)失敗,而且失敗的可能性并不小。

多副本模型更易于保障可靠性和可用性。在多副本模型下,一個(gè)成功寫(xiě)入的元數(shù)據(jù)任何時(shí)刻都會(huì)有多個(gè)副本存在,任何時(shí)刻都會(huì)有多個(gè)實(shí)例在提供服務(wù)。服務(wù)器單點(diǎn)故障不會(huì)對(duì)元數(shù)據(jù)系統(tǒng)的運(yùn)行產(chǎn)生影響,整個(gè)系統(tǒng)還是按照正常的運(yùn)作方式運(yùn)行。這一點(diǎn)非常重要,這意味著可以將一個(gè)實(shí)時(shí)的在線運(yùn)維事件變成了可以暫緩處理的離線運(yùn)維事件。任何一臺(tái)元數(shù)據(jù)服務(wù)器出現(xiàn)故障,也不需要立刻做出反應(yīng)。系統(tǒng)繼續(xù)正常運(yùn)行,運(yùn)維人員則可以從容地處理問(wèn)題。這是確保高可用性的關(guān)鍵所在。

主從模型本可以簡(jiǎn)化程序的結(jié)構(gòu),因?yàn)榭蛻?hù)端只需要向主服務(wù)器發(fā)出請(qǐng)求,訪問(wèn)元數(shù)據(jù)。但如同前面所描述的,可靠性、可用性和一致性的要求促使主從之間進(jìn)行并發(fā)訪問(wèn),以彌補(bǔ)這些特性方面的漏洞。這實(shí)際上就是將原本在元數(shù)據(jù)系統(tǒng)之外的多副本訪問(wèn)邏輯移到主服務(wù)器中,卻憑空增加了延遲,以及主從切換的麻煩。

在一致性方面,主從模型在沒(méi)有考慮軟硬件異常和數(shù)據(jù)退化的情況下,基本上沒(méi)有什么難點(diǎn)。但因?yàn)楝F(xiàn)實(shí)中沒(méi)有軟硬件異常是不可能的,數(shù)據(jù)退化也是時(shí)刻在發(fā)生的。于是,無(wú)論主、從服務(wù)器都可能缺少數(shù)據(jù),更無(wú)法單純通過(guò)主服務(wù)器來(lái)維持?jǐn)?shù)據(jù)的一致性。為了獲得盡可能高的一致性,主從模型也需要通過(guò)整合主從副本來(lái)實(shí)現(xiàn)一致性保障,而副本修復(fù)也同樣是不可缺少的一部分。實(shí)際上,無(wú)論是主還是從,都應(yīng)當(dāng)看作是一個(gè)元數(shù)據(jù)的副本,既然是多個(gè)副本,那么也就存在一致性的問(wèn)題。多副本遇到的問(wèn)題,主從模型同樣也會(huì)遇到,這就是主從模型不如多副本模型來(lái)得合用的原因。

主從模型的主要優(yōu)勢(shì)是可以執(zhí)行復(fù)雜的數(shù)據(jù)庫(kù)邏輯,如關(guān)聯(lián)、聚合等。但這在多副本模型下非常難。主從模型下,一個(gè)復(fù)雜的查詢(xún)得到執(zhí)行后,將冪等的結(jié)果數(shù)據(jù)同步到從服務(wù)器。而對(duì)多副本模型來(lái)說(shuō),每個(gè)副本獨(dú)自處理查詢(xún),會(huì)產(chǎn)生混亂的結(jié)果,因?yàn)閺?fù)雜查詢(xún)往往是非冪等的。

對(duì)象存儲(chǔ)之所以可以使用多副本,是因?yàn)閷?duì)象存儲(chǔ)的業(yè)務(wù)模型已被簡(jiǎn)化到不需要復(fù)雜查詢(xún)的地步。所有寫(xiě)入操作都只是增加一條元數(shù)據(jù)而已,天生的冪等操作。對(duì)象存儲(chǔ)放棄目錄結(jié)構(gòu),只實(shí)現(xiàn)Key/Value模型,也是為了避免復(fù)雜查詢(xún)的存在。

總結(jié)

在對(duì)象存儲(chǔ)中,元數(shù)據(jù)用于保存數(shù)據(jù)存儲(chǔ)位置、數(shù)據(jù)屬性等信息。元數(shù)據(jù)的好壞關(guān)系到整個(gè)對(duì)象存儲(chǔ)系統(tǒng)的可靠性、可用性、一致性等方面。元數(shù)據(jù)有如此重要的功能,必須有強(qiáng)有力的保障加以支撐。

元數(shù)據(jù)的存在雖然表面上增加了系統(tǒng)的復(fù)雜性,但實(shí)際上是將一致性保障、數(shù)據(jù)存儲(chǔ)基準(zhǔn)、可靠性檢測(cè)和修復(fù)、數(shù)據(jù)統(tǒng)計(jì)等重要的功能集中到更小的數(shù)據(jù)量上,更加易于實(shí)現(xiàn)和操作。這在去中心化的方案中是難以實(shí)現(xiàn)的。

元數(shù)據(jù)的兩種主要模型包括主從模型和多副本模型。主從模型,作為常規(guī)的數(shù)據(jù)庫(kù)高可用手段,并不能滿足云存儲(chǔ)系統(tǒng)的諸多特性。而多副本模型則能更好地平衡各方面需求,同時(shí)也很好地平衡了研發(fā)、部署和運(yùn)維等方面的要求。

多副本模型的核心難點(diǎn)集中在一致性保障方面,針對(duì)這些問(wèn)題都有相應(yīng)的解決手段,但都無(wú)法完全消除問(wèn)題的存在。綜合運(yùn)用各種保障方法,可以極大地減少一致性問(wèn)題的發(fā)生概率,最終將其降低到服務(wù)可以接受的程度。
 

責(zé)任編輯:Ophira 來(lái)源: 分布式系統(tǒng)架構(gòu)知識(shí)微信號(hào)
相關(guān)推薦

2012-09-26 10:57:10

大數(shù)據(jù)云計(jì)算facebook

2023-09-20 10:26:40

AIGC大型語(yǔ)言模型

2023-09-08 00:12:40

2013-03-08 09:41:06

宜搜移動(dòng)互聯(lián)網(wǎng)洗腦

2021-05-26 09:48:12

人工智能AI深度學(xué)習(xí)

2017-04-18 15:12:40

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

2020-08-14 10:56:17

云安全云計(jì)算網(wǎng)絡(luò)安全

2012-06-12 10:06:57

云存儲(chǔ)

2018-03-28 09:30:54

數(shù)字化轉(zhuǎn)型

2012-10-09 17:31:33

2019-08-01 14:44:31

云存儲(chǔ)安全網(wǎng)絡(luò)

2019-05-13 08:46:30

物聯(lián)網(wǎng)安全隱私物聯(lián)網(wǎng)

2024-12-10 13:11:36

2017-04-20 08:24:27

AI深處人工智能機(jī)器學(xué)習(xí)

2021-11-08 07:27:19

黑客網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2022-05-06 14:50:54

元宇宙數(shù)據(jù)安全數(shù)據(jù)隱私

2010-09-17 14:44:06

2023-05-26 06:49:44

2016-12-15 14:05:45

華為

2018-09-10 21:14:48

點(diǎn)贊
收藏

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