【摘要】:本文簡要介紹了Cassandra分布存儲系統(tǒng)的設(shè)計(jì)理念及其使用的各種分布存儲技術(shù)。文章首先分析了Cassandra分布存儲系統(tǒng)出現(xiàn)的緣由——Facebook社交網(wǎng)絡(luò)的系統(tǒng)需求,然后著重介紹了Cassandra系統(tǒng)中區(qū)別傳統(tǒng)關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu),并且簡要分析了其分區(qū)技術(shù)在分布存儲系統(tǒng)中的應(yīng)用,同時(shí),介紹了基于數(shù)據(jù)的復(fù)制機(jī)制來達(dá)到數(shù)據(jù)高度的可獲得性、安全性和系統(tǒng)良好的擴(kuò)展性的方式。最后,本文宏觀的總結(jié)了Cassandra系統(tǒng)的運(yùn)行過程及適用范圍。
【關(guān)鍵詞】:分布存儲,網(wǎng)絡(luò),數(shù)據(jù)庫。
前言
Cassandra是一種分布存儲系統(tǒng),很多商業(yè)服務(wù)網(wǎng)站使用它來對大量的結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行管理。在對大量數(shù)據(jù)的管理中,Cassandra可以提供高速有效的服務(wù)并從未出現(xiàn)過錯誤。Cassandra運(yùn)行于數(shù)百個(gè)節(jié)點(diǎn)的結(jié)構(gòu)之上,而在這類規(guī)模的系統(tǒng)中,各類組件,無論規(guī)模大小,都會持續(xù)的拋出異常。然而,Cassandra保持?jǐn)?shù)據(jù)持久性的方式很好的應(yīng)對了這些異常,為存儲系統(tǒng)提高了強(qiáng)大的可靠性和擴(kuò)展性。盡管Cassandra在一些設(shè)計(jì)和實(shí)施等方面與傳統(tǒng)的數(shù)據(jù)庫存在相似之處,但是Cassandra并不完全支持關(guān)系數(shù)據(jù)模型,即它不是一個(gè)傳統(tǒng)的關(guān)系數(shù)據(jù)庫。Cassandra提供給客戶端一個(gè)相對比較簡單的數(shù)據(jù)模型,這種數(shù)據(jù)模型支持對數(shù)據(jù)的布局和格式動態(tài)的控制。Cassandra系統(tǒng)旨在高效迅速的處理大量的寫操作,與此同時(shí)不會犧牲讀操作的效率,因而確保具有這種特性的商業(yè)網(wǎng)站能夠?yàn)榭蛻籼岣吒咝П憬莸姆⻊?wù)。
簡介
Cassandra最初是由AvinashLakshman和PrashantMalik在Facebook開發(fā)設(shè)計(jì),在2008年,F(xiàn)acebook將它貢獻(xiàn)給了開源社區(qū)。Cassandra的出現(xiàn)與Facebook的系統(tǒng)特性息息相關(guān)。Facebook是世界最大的社交網(wǎng)絡(luò)平臺,在高峰時(shí)段,F(xiàn)acebook要向數(shù)億的用戶提供服務(wù),而Facebook數(shù)萬臺的服務(wù)器也遍布了全世界的各個(gè)數(shù)據(jù)中心;谝陨蠈A繑(shù)據(jù)處理的需求,F(xiàn)acebook想要為用戶提供優(yōu)質(zhì)的、可靠的和高效的服務(wù),一個(gè)必要的條件在于其系統(tǒng)平臺應(yīng)具有高度的擴(kuò)展性以應(yīng)對不斷增長的用戶數(shù)量和數(shù)據(jù)處理需求數(shù)量。因此,處理一個(gè)包含大量組件的系統(tǒng)可能出現(xiàn)的各種異,F(xiàn)象是Facebook系統(tǒng)平臺維護(hù)人員的常規(guī)工作:在任意時(shí)間點(diǎn)上,總會有少量卻很關(guān)鍵的服務(wù)器和網(wǎng)絡(luò)組件出現(xiàn)錯誤。在這種情形下,軟件系統(tǒng)應(yīng)該以某種容錯的機(jī)制處理錯誤,而不是將錯誤當(dāng)作異常來處理。因此,為了達(dá)到以上指出的系統(tǒng)的可靠性和擴(kuò)展性,F(xiàn)acebook開發(fā)了Cassandra。
數(shù)據(jù)結(jié)構(gòu)
在Cassandra這種分布存儲系統(tǒng)中,類似于關(guān)系數(shù)據(jù)庫中的表結(jié)構(gòu)是一個(gè)多維分布映射圖,并且以一個(gè)主鍵作為索引。在這種映射圖中,一個(gè)對象的值是高度結(jié)構(gòu)化的,其中,行主鍵是一個(gè)沒有長度限制的字符串——通常情況下為16-36個(gè)字節(jié)。需要注意的是,在數(shù)據(jù)的任一副本中,針對任何一個(gè)行主鍵的操作都是原子的,即使多個(gè)列被同時(shí)讀或者寫。在Cassandra中,列的結(jié)構(gòu)近似于Bigable中的列結(jié)構(gòu)——列被組合在一起,并被稱為一個(gè)ColumnFamily或者SuperColumnFamily。下面詳細(xì)介紹Cassandra的列結(jié)構(gòu)。
Column
一個(gè)Column是一個(gè)包含名稱、值和時(shí)間戳的元組。它是最小的數(shù)據(jù)容器,其中,名稱和值通常沒有長度限制。Column相當(dāng)于關(guān)系數(shù)據(jù)庫中的字段,不同的是,每一行中的Column內(nèi)容可以不同,而關(guān)系數(shù)據(jù)庫中一張表內(nèi)每行所對應(yīng)的列字段都是相同的。這種方式相對比較靈活,對于具有少量字段,并且訪問時(shí)通常只需要通過Key/Value配對的數(shù)據(jù)非常適用。
SuperColumn
一個(gè)SuperColumn是包含名稱和值的元組,它并不包含Column中的時(shí)間戳。SuperColumn的值并不是一個(gè)二進(jìn)制字節(jié)而是映射容器——包含“Key/Value”的組合。簡而言之,SuperColumn是一個(gè)包含多個(gè)Column的容器,在被包含的每個(gè)Column中,其Key值與其名稱一致。SuperColumn可以表達(dá)一個(gè)object的多個(gè)屬性,每個(gè)屬性用一個(gè)Column表示。
ColumFamily
一個(gè)ColumFamily結(jié)構(gòu)類似于關(guān)系型數(shù)據(jù)庫中的表結(jié)構(gòu),它可以包含任意數(shù)量的行(row)。一個(gè)ColumFamily有一個(gè)名稱(類似于關(guān)系數(shù)據(jù)庫表的名稱),和若干行。在每一行中,分別包含各自的key(類似于行主鍵)和值(value)——包含多個(gè)Column的映射表,其結(jié)構(gòu)與之前介紹的SuperColumn一致。
API
Cassandra的API提供如下三種方法:
insert(table;key;rowMutation)
get(table;key;columnName)
delete(table;key;columnName)
columnName可以指ColumnFamily或者SuperColumnFamily中的任意一個(gè)Column或者任意一個(gè)SuperColumn中的Column的名稱。
系統(tǒng)架構(gòu)
一個(gè)存儲系統(tǒng)的結(jié)構(gòu)通常比較復(fù)雜,除去保證真實(shí)數(shù)據(jù)持久性的必要組件,存儲系統(tǒng)還應(yīng)該具有如下特性和功能:擴(kuò)展性和平衡負(fù)荷的有效解決方案、伙伴關(guān)系管理(membership)和錯誤檢測、錯誤恢復(fù)、同步化復(fù)制、超負(fù)荷處理、狀態(tài)轉(zhuǎn)移、并行和任務(wù)排序、請求配置、請求路由、系統(tǒng)監(jiān)視與警告,以及系統(tǒng)配置管理。而在Cassandra系統(tǒng)的搭建過程中,所應(yīng)用的核心分布存儲技術(shù)主要包括:存儲空間分區(qū),數(shù)據(jù)復(fù)制,伙伴關(guān)系管理,錯誤處理和系統(tǒng)擴(kuò)展增容,所有的這些模塊協(xié)同工作,一起處理用戶的讀寫請求。以下分別介紹在Cassandra中應(yīng)用的各種分布存儲技術(shù)。
1. 分區(qū)(partition)
Cassandra最重要的設(shè)計(jì)特性之一即為可擴(kuò)展性。為了達(dá)到這一目標(biāo),Cassandra分布存儲系統(tǒng)使用分區(qū)技術(shù)。具體而言,在Cassandra分布存儲系統(tǒng)中,存在多個(gè)位于不同地理位置的存儲節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)按照某種算法和方式復(fù)制存儲一定量的數(shù)據(jù)。新加入的數(shù)據(jù)以某種方式被分配到系統(tǒng)中的任一節(jié)點(diǎn)中。當(dāng)數(shù)據(jù)量不斷增多時(shí),可以通過增加節(jié)點(diǎn)的書目來提高系統(tǒng)的容量。當(dāng)然,在Cassandra系統(tǒng)中,新增一個(gè)或多個(gè)節(jié)點(diǎn)并不會對已存在的絕大多數(shù)節(jié)點(diǎn)造成影響,它只會改變一個(gè)局部的存儲狀況。以上存儲方式的實(shí)現(xiàn)是通過動態(tài)分區(qū)的方式達(dá)到的,下面詳細(xì)介紹這一技術(shù)。
為了達(dá)到以上目標(biāo),存儲系統(tǒng)應(yīng)該可以將數(shù)據(jù)動態(tài)的分配給集群中的不同的節(jié)點(diǎn),或者說能夠動態(tài)的對存儲空間進(jìn)行分區(qū),并將節(jié)點(diǎn)存入。Cassandra使用一致性哈希函數(shù)對數(shù)據(jù)進(jìn)行分區(qū):哈希函數(shù)的輸出范圍是一個(gè)固定的圓環(huán)空間,稱為“ring”。在這個(gè)圓環(huán)中,最大的哈希輸出值與最小的哈希輸出值相毗鄰。系統(tǒng)中的任一節(jié)點(diǎn)被分配一個(gè)隨機(jī)的值,這個(gè)隨機(jī)的值代表了其在圓環(huán)空間上的位置。同時(shí),對任一的數(shù)據(jù)的Key值做哈希運(yùn)算,輸出的結(jié)果代表這個(gè)數(shù)據(jù)在圓環(huán)空間上的位置。與此同時(shí),從任一數(shù)據(jù)在圓環(huán)上的位置為起點(diǎn),沿著圓環(huán)順時(shí)針移動找到第一個(gè)節(jié)點(diǎn),那么這個(gè)節(jié)點(diǎn)即為負(fù)責(zé)這個(gè)數(shù)據(jù)的存儲容器。因此,圓環(huán)空間上的任一節(jié)點(diǎn)都負(fù)責(zé)存儲其前一個(gè)節(jié)點(diǎn)和它之間的所有數(shù)據(jù)。這樣的好處是增加或者刪除一個(gè)節(jié)點(diǎn)只會影響其周圍的小范圍空間,而對圓環(huán)空間上的絕大多數(shù)其他節(jié)點(diǎn)沒有任何影響,進(jìn)而達(dá)到了較好的擴(kuò)展性。然而,這種隨機(jī)分配的機(jī)制并沒有考慮到不同節(jié)點(diǎn)的存儲能力,Cassandra解決這個(gè)問題的方法是分析圓環(huán)空間上的各節(jié)點(diǎn)的負(fù)載情況,并且使信息負(fù)荷量比較小的節(jié)點(diǎn)向負(fù)荷量比較大的節(jié)點(diǎn)移動,以緩解其存儲壓力。
2. 復(fù)制
Cassandra使用數(shù)據(jù)復(fù)制的方法來保證數(shù)據(jù)高度的可用性和持久性。在Cassandra系統(tǒng)中,每個(gè)數(shù)據(jù)都會在N個(gè)主機(jī)上進(jìn)行復(fù)制,每個(gè)Key值,k,會被指定給集群中的一個(gè)節(jié)點(diǎn)。如前所述,每個(gè)節(jié)點(diǎn)負(fù)責(zé)其控制范圍內(nèi)的數(shù)據(jù)的副本,并且,為了在本地存儲其控制范圍內(nèi)的Key值,節(jié)點(diǎn)會將其控制的Key值在圓環(huán)空間上的其他N-1個(gè)節(jié)點(diǎn)上進(jìn)行復(fù)制,當(dāng)然,Cassandra為客戶端提供了很多可供選擇的數(shù)據(jù)復(fù)制策略,比如“架構(gòu)不可知”(RackUnaware),“架構(gòu)可知”(RackAware)(同一數(shù)據(jù)中心內(nèi))和“數(shù)據(jù)中心可知”(DatacenterAware)。應(yīng)用程序可以根據(jù)需要選擇自己復(fù)制數(shù)據(jù)的策略。如果一個(gè)特定的應(yīng)用程序選擇了“架構(gòu)不可知”的數(shù)據(jù)復(fù)制策略,那么那些被復(fù)制的但尚未指派存儲節(jié)點(diǎn)的副本會選擇圓環(huán)空間上初始節(jié)點(diǎn)的前N-1個(gè)節(jié)點(diǎn)。而對于“架構(gòu)可知”和“數(shù)據(jù)中心可知”復(fù)制策略,則需要涉及比較復(fù)雜的算法。具體而言,Cassandra使用Zookeeper系統(tǒng)③在其集群中選擇一個(gè)領(lǐng)導(dǎo)節(jié)點(diǎn)(leader),。新加入集群的任一節(jié)點(diǎn)都要與領(lǐng)導(dǎo)節(jié)點(diǎn)進(jìn)行通信,領(lǐng)導(dǎo)節(jié)點(diǎn)會告知其負(fù)責(zé)的副本的所在區(qū)域,同時(shí)領(lǐng)導(dǎo)節(jié)點(diǎn)要確保每個(gè)節(jié)點(diǎn)不會負(fù)責(zé)多于N-1的圓環(huán)空間上的區(qū)域。記錄每個(gè)節(jié)點(diǎn)負(fù)責(zé)的圓環(huán)區(qū)域的元數(shù)據(jù)會緩存在所有節(jié)點(diǎn)上并且在Zookeeper中做容錯處理——這種方式可以確保當(dāng)某個(gè)節(jié)點(diǎn)癱瘓后再恢復(fù)時(shí),它能夠了解到其原本負(fù)責(zé)的區(qū)域。例如,當(dāng)集群的一個(gè)節(jié)點(diǎn)崩潰后返回時(shí),它同Zookeeper與領(lǐng)導(dǎo)節(jié)點(diǎn)或者其他節(jié)點(diǎn)進(jìn)行通信,領(lǐng)導(dǎo)節(jié)點(diǎn)或其他節(jié)點(diǎn)返回存儲在他們內(nèi)部的關(guān)于這個(gè)節(jié)點(diǎn)崩潰前的存儲信息,這個(gè)節(jié)點(diǎn)通過這些信息恢復(fù)其存儲功能,重新負(fù)責(zé)原來的圓環(huán)區(qū)域。相似的概念可以借鑒Dynamo中的“偏好列表”(preferencelist),即負(fù)責(zé)給定區(qū)域的節(jié)點(diǎn)列表。
基于以上的介紹,我們了解到,Cassandra節(jié)點(diǎn)簇中的每個(gè)節(jié)點(diǎn)都了解系統(tǒng)中的其他節(jié)點(diǎn)和其負(fù)責(zé)的存儲區(qū)域。通過這種方式,Cassandra可以在節(jié)點(diǎn)癱瘓和網(wǎng)絡(luò)分區(qū)的情況發(fā)生變化時(shí)保證數(shù)據(jù)的持久性。數(shù)據(jù)中心會因?yàn)楹芏嘁蛩囟V构ぷ鳎热缤k,斷網(wǎng)或者自然災(zāi)害。而Cassandra系統(tǒng)中數(shù)據(jù)的每個(gè)行(row)都會在多個(gè)節(jié)點(diǎn)被復(fù)制。實(shí)際上,一個(gè)Key的“偏好列表”就是保證擁有這個(gè)Key副本的N各節(jié)點(diǎn)分布在不同的數(shù)據(jù)中心。這些數(shù)據(jù)中心通過高速的網(wǎng)絡(luò)相連接。這種跨越多個(gè)數(shù)據(jù)中心的復(fù)制機(jī)制保證了在某些數(shù)據(jù)中心癱瘓時(shí),系統(tǒng)不會受到很大影響,數(shù)據(jù)也不會丟失。
3. 伙伴關(guān)系(Membership)
Cassandra節(jié)點(diǎn)集群中的節(jié)點(diǎn)間關(guān)系——我們稱之為“伙伴關(guān)系”(Membership),是建立在Scuttlebutt的基礎(chǔ)之上的——一種非常高效的、基于“Gossip”的關(guān)系機(jī)制。Scuttlebutt顯著的特性在于其高效的CPU利用率和“Gossip”通道的利用率。下面通過錯誤檢測的機(jī)制來進(jìn)一步理解Cassandra中的伙伴關(guān)系。
錯誤檢測(FailureDetection)是一種利用節(jié)點(diǎn)間關(guān)系的模塊,通過錯誤檢測,一個(gè)節(jié)點(diǎn)可以判斷系統(tǒng)中的其他節(jié)點(diǎn)是否在正常的工作。在Cassandra系統(tǒng)中,錯誤檢測也用來避免一個(gè)節(jié)點(diǎn)試圖同一個(gè)無法到達(dá)的錯誤或者癱瘓的節(jié)點(diǎn)進(jìn)行交互。Cassandra利用一個(gè)改進(jìn)版本的AccrualFailureDetector去完成錯誤檢測。AccrualFailureDetector的觀念在于,錯誤檢測模塊并不是通過返回一個(gè)布爾值來表示一個(gè)節(jié)點(diǎn)工作與否,而是返回一個(gè)代表每個(gè)被檢測節(jié)點(diǎn)的質(zhì)疑等級值,這個(gè)值被定義為Φ,Φ值可以動態(tài)的調(diào)整以反應(yīng)被檢測節(jié)點(diǎn)的網(wǎng)絡(luò)和加載的條件。AccrualFailureDetector的方法類似于統(tǒng)計(jì)學(xué)中的建設(shè)檢驗(yàn)問題,而Φ相當(dāng)于檢驗(yàn)的統(tǒng)計(jì)量。在Cassandra系統(tǒng)中,Φ有如下的意義:給定一個(gè)具體的Φ值,我們在檢測節(jié)點(diǎn)時(shí),會以某個(gè)對應(yīng)的概率錯誤的認(rèn)為這個(gè)節(jié)點(diǎn)存在錯誤。例如假設(shè)當(dāng)Φ=1時(shí)我們檢測節(jié)點(diǎn)A,那么錯誤的判斷節(jié)點(diǎn)A工作狀況的概率為10%。同理,當(dāng)Φ=2時(shí),對應(yīng)的概率為1%,當(dāng)Φ=3時(shí),對應(yīng)的概率為0.1%,依次類推。每個(gè)節(jié)點(diǎn)收到系統(tǒng)內(nèi)其他節(jié)點(diǎn)的“Gossip”信息的內(nèi)部到達(dá)時(shí)間都被存儲在各自的節(jié)點(diǎn)的樣本窗口(samplingwindows)中,系統(tǒng)通過估計(jì)這些內(nèi)部到達(dá)時(shí)間的分布來計(jì)算Φ值。然后再給定的顯著性要求下(允許犯錯誤的概率),用計(jì)算出來的Φ與分布中的臨界值做比較,如果大于臨界值,則拒絕原假設(shè),即某個(gè)節(jié)點(diǎn)的確存在錯誤,針對這個(gè)節(jié)點(diǎn)的操作被中止;如果計(jì)算出來的Φ小于臨界值,則接受原假設(shè),即某個(gè)節(jié)點(diǎn)沒有錯誤,可以進(jìn)行對它的操作。具體過程見圖1.以前的
文獻(xiàn)認(rèn)為內(nèi)部到達(dá)時(shí)間類似服從高斯分布(Gaussian),但是Cassandra使用指數(shù)分布來更好的估計(jì)這一分布?偟膩碚f,AccrualFailureDetector擁有很高的精確度和運(yùn)行速度,并且這種錯誤檢測的機(jī)制可以根據(jù)不同的網(wǎng)絡(luò)條件和服務(wù)器負(fù)荷情況來進(jìn)行自我調(diào)整。
圖1:AccrualFailureDetector
4. 引導(dǎo)程序(Bootstrapping)
當(dāng)一個(gè)節(jié)點(diǎn)初次運(yùn)行時(shí),它在圓環(huán)空間上隨機(jī)選擇一個(gè)片段作為它的位置。為了使系統(tǒng)能夠容錯,圓環(huán)上節(jié)點(diǎn)的位置映射永久的保存在本地磁盤上,同時(shí)也存儲在領(lǐng)導(dǎo)節(jié)點(diǎn)上。然后,這個(gè)片段的信息被以“Gossip”的方式傳遞到集群中的其他節(jié)點(diǎn)上。通過這種方式,圓環(huán)空間上的所有節(jié)點(diǎn)都能夠同時(shí)了解其他節(jié)點(diǎn)的位置及存儲情況。這也保證了在復(fù)制一節(jié)中提到的高度的數(shù)據(jù)可獲得性:因?yàn)槊總(gè)節(jié)點(diǎn)都存有其他所有節(jié)點(diǎn)的信息,因此,當(dāng)任一節(jié)點(diǎn)接受到讀寫請求時(shí),它能夠?qū)⑨槍δ硞(gè)Key值的請求正確的傳遞到存儲這個(gè)Key值的其他節(jié)點(diǎn)上。通過bootstrapping,當(dāng)一個(gè)節(jié)點(diǎn)需要接入集群時(shí),首先它會讀取其配置文件中的連接點(diǎn)列表。這些集群中初始的連接點(diǎn)被稱為集群的種子,種子也可以來自配置服務(wù),如領(lǐng)導(dǎo)節(jié)點(diǎn)Zookeeper。
5. 擴(kuò)展增容
在分區(qū)一節(jié)中,曾經(jīng)提到過Cassandra系統(tǒng)高度的擴(kuò)展性,即新加入的存儲節(jié)點(diǎn)不會影響整個(gè)系統(tǒng)的正常工作。具體而言,當(dāng)一個(gè)新的節(jié)點(diǎn)加入到系統(tǒng)中時(shí),它被指派一個(gè)圓環(huán)空間上的片段,來緩解高負(fù)荷的節(jié)點(diǎn)。這種方式的結(jié)果是,新的節(jié)點(diǎn)會分割其他節(jié)點(diǎn)原來負(fù)責(zé)的區(qū)域,而新的節(jié)點(diǎn)只會分割它在圓環(huán)上的位置周圍的節(jié)點(diǎn)的存儲區(qū)域,而不會影響其他區(qū)域。存儲空間被分割的節(jié)點(diǎn)將其放棄的數(shù)據(jù)使用“kernel-kernel”的復(fù)制技術(shù)傳遞給新的節(jié)點(diǎn)。實(shí)際運(yùn)行情況表明這些數(shù)據(jù)可以以每秒40MB的速度從一個(gè)單一節(jié)點(diǎn)傳遞到其他節(jié)點(diǎn)。Cassandra的開發(fā)人員通過使多個(gè)副本同時(shí)參與“bootstrap”傳輸來提高傳輸速度,這種并行傳輸?shù)姆绞降臋C(jī)制與Bittorrent相似。通過高速的復(fù)制技術(shù),Cassandra系統(tǒng)達(dá)到了高度的擴(kuò)展性。
以上五種技術(shù)是在Cassandra系統(tǒng)中應(yīng)用的比較核心的分布存儲技術(shù),他們協(xié)同工作,保證了數(shù)據(jù)高度的可獲得性和擴(kuò)展性。當(dāng)數(shù)據(jù)量不斷擴(kuò)大時(shí),Cassandra系統(tǒng)能夠使用以上方法很好的保持系統(tǒng)的穩(wěn)定,此外以上方法也保證了數(shù)據(jù)的安全性,基于復(fù)制機(jī)制的存儲方式不僅提高了可獲得性,同時(shí)面對若干主機(jī)出現(xiàn)癱瘓的情形,也能保持系統(tǒng)的正常工作,并且確保數(shù)據(jù)不會丟失。同時(shí),Cassandra系統(tǒng)也能夠保證數(shù)據(jù)的持久性,這種數(shù)據(jù)的持久性要依賴本地文件系統(tǒng)。具體而言,對于寫操作,通常涉及兩個(gè)子操作:1.將寫操作記錄到一個(gè)“commitlog”中;2.當(dāng)前一個(gè)操作成功后,更新內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)。當(dāng)內(nèi)存中的數(shù)據(jù)容量達(dá)到一個(gè)特定值時(shí),它將自己導(dǎo)入本地磁盤中。所有的寫操作都連續(xù)存儲在本地磁盤上,并且建立行主鍵的索引以便查詢,這些索引與數(shù)據(jù)文件一同存儲。對于讀操作,首先查詢內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),找不到所需信息時(shí)才檢索本地磁盤。這種內(nèi)存—磁盤的雙重存儲,和首先將任一寫操作記錄到“commitlog”并存入磁盤的方式,通過本地文件系統(tǒng)的持久性保證了數(shù)據(jù)的持久性。
總結(jié)
Cassandra分布存儲系統(tǒng)旨在應(yīng)對海量數(shù)據(jù)的存儲、數(shù)據(jù)的安全性問題以及基于Key-value的查詢需求。通過運(yùn)用上文提到的各種技術(shù),Cassandra將數(shù)據(jù)從傳統(tǒng)的關(guān)系數(shù)據(jù)庫單一數(shù)據(jù)中心的存儲方式過渡到分布的存儲方式。具體而言,Cassandra的系統(tǒng)結(jié)構(gòu)為多個(gè)分布在不同地點(diǎn)的存儲節(jié)點(diǎn),這些節(jié)點(diǎn)通過高速網(wǎng)絡(luò)相連。數(shù)據(jù)通過某種哈希算法被指派到系統(tǒng)中的各個(gè)節(jié)點(diǎn)中。同時(shí),系統(tǒng)利用復(fù)制的技術(shù)將存儲在不同節(jié)點(diǎn)內(nèi)的數(shù)據(jù)信息復(fù)制到其他節(jié)點(diǎn)上,這保證了數(shù)據(jù)的安全性,同時(shí)也提高了數(shù)據(jù)的獲取速度,具體的分配機(jī)制見上文“分區(qū)”一節(jié)的介紹。當(dāng)數(shù)據(jù)量不斷擴(kuò)大時(shí),會有更多的節(jié)點(diǎn)加入到Cassandra系統(tǒng)的集群中,Cassandra節(jié)點(diǎn)集群的圓環(huán)邏輯結(jié)構(gòu)保證了節(jié)點(diǎn)的加入不會影響系統(tǒng)中其他節(jié)點(diǎn)的工作,這使得系統(tǒng)具有良好的擴(kuò)展性能。這種分區(qū)-復(fù)制的技術(shù)也保證了當(dāng)系統(tǒng)中一個(gè)或多個(gè)節(jié)點(diǎn)癱瘓時(shí),系統(tǒng)仍能正常工作,這是因?yàn)槊總(gè)節(jié)點(diǎn)上不僅存儲了自己復(fù)制的區(qū)域內(nèi)的數(shù)據(jù),還保存著其他節(jié)點(diǎn)內(nèi)數(shù)據(jù)的副本和所有節(jié)點(diǎn)存儲情況的元數(shù)據(jù),進(jìn)而在發(fā)生節(jié)點(diǎn)癱瘓時(shí)保證數(shù)據(jù)的安全。
相對于關(guān)系型數(shù)據(jù)庫,Cassandra分布存儲系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)并不能很好的支持復(fù)雜的結(jié)構(gòu)關(guān)系查詢,但是對于一些只針對某個(gè)Key值進(jìn)行簡單查詢的數(shù)據(jù),其性能和反應(yīng)時(shí)間要遠(yuǎn)遠(yuǎn)優(yōu)于關(guān)系型數(shù)據(jù)庫。比如在當(dāng)今流行的各大網(wǎng)絡(luò)社區(qū)或B2B,B2C網(wǎng)站中,面對海量的數(shù)據(jù)和每天大量的信息吞吐量,Cassandra這類基于Key-value的分布式存儲系統(tǒng)會逐漸的更加廣泛地得到應(yīng)用。
參考文獻(xiàn):
[1]. GiuseppeDeCandia,DenizHastorun,MadanJampani,GunavardhanKakulapati,AvinashLakshman,AlexPilchin,SwaminathanSivasubramanian,PeterVosshallandWernerVogels,Dynamo:Amazon’sHighlyAvailableKey-valueStore,2007
[2]. FayChang,JeffreyDean,SanjayGhemawat,WilsonC.Hsieh,DeborahA.WallachMikeBurrows,TusharChandra,AndrewFikes,RobertE.Gruber,Bigtable:ADistributedStorageSystemforStructuredData,2006
[3]. AvinashLakshman,PrashantMalik,Cassandra-ADecentralizedStructuredStorageSystem,2009
[4]. ArinSarkissian,WTFisaSuperColumn?AnIntrototheCassandraDataModel,2010-3-22
[5]. MoritzY.BeckerPeterSewell,ComputerLaboratory,UniversityofCambridge,JJThomsonAvenue,Cambridge,UnitedKingdom,Cassandra:DistributedAccessControlPolicieswithTunableExpressiveness
[6]. JonathanEllis,Cassandra_OpenSourceBigtable+Dynamo,2010
[7]. RonaldMathies,InstallingandusingApacheCassandraWithJavaPart1(Installation),InstallingandusingApacheCassandraWithJavaPart2(Datamodel),InstallingandusingApacheCassandraWithJavaPart3(Datamodel2),InstallingandusingApacheCassandraWithJavaPart4(ThriftClient),InstallingandusingApacheCassandraWithJavaPart5(ThriftClient2),2010
[8]. MikePerham,CassandraInternals–WritingandReading,http://www.mikeperham.com,2010
轉(zhuǎn)載請注明來自:http://www.jinnzone.com/zhishichanquanlw/6978.html