2010-09-30 100 views
7

我有一個複製因子爲2且AutoBootStrap = true的2節點cassandra羣集。在啓動過程中一切都很好,兩個節點都可以看到對方。讓我們把這些節點A和B.Cassandra數據複製問題

  1. 添加一組鍵和列(可以稱這組K1)到卡桑德拉通過節點A
  2. 連接到節點A和回讀設置K1。同樣在節點B成功 - 良好的
  3. 殺卡桑德拉過程在節點B
  4. 添加設置K2通過A.
  5. 連接到節點A,讀取設置K2。好
  6. 重新啓動節點B上的Cassandra進程。
  7. 嘗試讀取B中的所有密鑰...設置K1存在,設置K2 MISSING。 (即使30分鐘後)
  8. 將K3添加到A/B。
  9. 從A讀取所有密鑰 - 返回集合K1,K2,K3
  10. 讀取B中的所有密鑰 - 返回集合K1,K3。

B從不同步設置K2 ...(已超過12小時) 爲什麼節點B沒有看到設置K2 ...任何人有任何想法?


新增信息

好吧......這是問題。 默認情況下,read_consistency_level設置爲1。因此,當我們要求節點B設置K2並且它沒有它(當它應該是因爲複製因子= 2)時,它立即返回'未找到'錯誤。但是,如果我們使用讀取一致性來定義QUORUM或ALL,那麼B就會被迫詢問A,然後B返回正確的值並且B將該鍵同步到本地。

這會導致另一個問題 - 這意味着當節點B出現時,即使很長時間後,它也不會同步來自節點A的所有數據。現在,如果節點A發生故障,我們如何訪問未初始化的數據? (我剛剛測試,我們不能)

我想必須有一種方法來強制同步數據。我看到終端輸出中的INFO,當B出現時,從A到B的15行的提示切換髮生,但B本地沒有這些行(因爲我們仍然無法從B讀取它,其一致性級別爲1)。這裏發生了什麼?

回答

6

有3種方式同步卡桑德拉所發生而節點宕機更新:

  1. 暗示切換。要求在寫入K2之前,A上的故障檢測器識別出B已關閉。請參閱http://wiki.apache.org/cassandra/HintedHandoff
  2. 閱讀修復。要求K2在修理發生時請求B啓動。見http://wiki.apache.org/cassandra/ReadRepair
  3. 反熵修復。需要手動調用(「nodetool修復」)。見http://wiki.apache.org/cassandra/AntiEntropy
+0

謝謝jBellis。我用cassandra進一步了。然而,我遇到了另一個問題,並添加了一些信息的問題。 – Rajan 2010-10-01 00:15:43