2012-05-30 64 views
2

我一直在閱讀關於MongoDB和Cassandra。 MongoDB是一個主/從,Cassandra是無主的(所有節點都是平等的)。我的疑問是關於數據如何存儲在這兩者中。Mongodb和Cassandra數據存儲機制

比方說,一個用戶正在向MongoDB寫一個請求(一個主站和不同的從站在一個單獨的機器上)。這意味着主人將決定(或通過某些應用程序實現)此更新應寫入哪個從屬。這是相同的數據將不會在MongoDB的所有節點中可用。每個節點的大小可能不同。我對嗎 ?另外,在查詢時,主人是否知道該請求應發送給哪個節點?

在cassandra的情況下,相同的數據將被寫入所有的節點,即有效地如果一個節點大小是10GB,那麼其他節點大小也是10GB。因爲如果只有這種情況,那麼當一個節點發生故障時,用戶不會通過在另一個節點中查詢而丟失任何數據。我在這裏嗎?如果我是對的,所有節點都有相同的數據,那麼在Cassandra中使用map/reduce函數有什麼優勢?如果我錯了,那麼Cassandra中的可用性如何維護,因爲相同的數據在其他節點中不可用?

我正在搜索關於MongoDB vs cassandra的stackoverflow,並且已經閱讀了大約10篇文章,但是我的問題無法通過這些文章中的答案清除。請清除我的疑惑,如果我錯誤地假設了,也糾正我。

回答

1

關於MongoDB,你說得對,只有一個主要的。

只要所有內容都同步,任何輔助都可以成爲主節點,因爲這意味着輔助節點具有所有數據。每個節點不必具有相同的磁盤大小,並且這可以根據複製完成時間的不同而變化,但是,它們具有相同的數據(只要它們處於同步狀態)。

我對卡桑德拉了解不多,對不起!

1

我寫了一個論文有關的NoSQL存儲併爲此我希望我沒有記錯的大部分地區的卡桑德拉:

Cassandra是亞馬遜迪納摩的混合物,從它繼承複製和分片,和谷歌BigTable從中獲取數據模型。所以Cassandra基本上將數據碎片化,同時保留其他節點上的副本。讓我們有一個五節點集羣,節點稱爲A到E.您的密鑰通過一致散列哈希到密鑰環,密鑰環的連續區域存儲在給定節點上。所以如果我們有一個從1到100的值範圍,每個默認的每個節點將得到環的1/5。 A的範圍從[1,20],B從[20,40]等等。
Dynamo的一個重要概念是三元(R,W,N),它告訴有多少節點必須讀取,寫入並保持給定值。
默認情況下,您有3(N)個數據副本,存儲在主節點和兩個包含備份的節點上。當我從Dynamo紙上記住它時,您的寫入按默認值寫入N個副本的前W個節點,其他節點最終通過Gossip協議更新。
只要一切正常,你會得到一致的結果,如果你的主節點已經關閉了一段時間,另一個節點通過一個暗示的切換取得你的數據。一旦主要回來你的數據將被合併,或試圖合併(這部分我不記得,但檢查那些用於告訴更新歷史記錄的矢量時鐘)。 因此,如果羣集中不是太大的部分出現故障,您將對數據有一致的看法。如果節點的較大部分已關閉,或者您僅從副本的一小部分請求,則可能會看到不一致,最終可能會一致。
希望有所幫助,我強烈建議閱讀那些關於Amazon DynamoGoogle BigTable的原始論文,但我認爲你最感興趣的是亞馬遜Dynamo。另外這個帖子從Werner Vogels也可以來得方便。
至於分片大小,我認爲這些可以根據您的機器以及您鑰匙圈給定區域的熱度而變化。

0

Cassandra通常不會保留所有節點上的所有數據。正如你所建議的那樣,這將破壞其分佈式數據模型提供的一些優勢(特別是快速寫入會受到阻礙)。客戶在寫入時可定製所需的複製量(有多少節點應保留數據的副本)。因此,您可以將其設置爲跨所有節點進行復制,或者將您的數據保留在單個節點上而不進行復制。隨你便。數據寫入的特定節點由密鑰的散列值決定。每個節點都會被分配一定範圍的散列值,因此當您查找某個值時,密鑰將被散列並指示在哪個節點上查找數據。

+0

那麼Cassandra如何保持可用性。假設我有兩個節點,並且基於密鑰哈希(數據1-50到節點1和數據51-100到節點2)寫入數據。所以如果node1發生故障,數據如何提供?我能想到的一種解決方法是每個節點都有一個備份(節點1具有節點11,節點2具有節點21),並且當主節點關閉時,輔助節點出現。我對嗎 ? – PSathiya

+0

我想它比這更微妙一點。在Cassandra中,您可以指定「複製因子」和「一致性級別」。複製因子表示有多少節點應最終接收數據的副本。您可以指定所有節點都應該獲取數據,然後最終在整個網絡中複製。一致性級別允許您指定有多少節點必須在更新時成功寫入/更新數據,以便更新被視爲成功。所以在2節點系統中,在它們之間複製可能是有意義的 – pedorro