2014-02-13 74 views
0

我有一個疑問,當我閱讀有關cassandra寫入一致性的datastax文檔時。我有卡桑德拉將如何保持對以下情形一致狀態的問題:cassandra集羣上的數據如何保持一致

  • 寫一致性水平=法定人數
  • 複製因子= 3

按文檔,當進行寫操作時將協調器節點將此寫入請求發送到羣集中的所有副本。如果一個副本成功並且其他失敗,則協調節點將向客戶端發送錯誤響應,但節點1成功寫入數據並且不會回滾。

在這種情況下,

將讀取自修復(或暗示的切換或nodetool修復)從節點-1不一致的數據複製到節點2和節點3?

如果不是cassandra會如何處理不將不一致的數據複製到其他副本?

能否請你澄清我的問題

回答

2

你是完全正確,讀修理或其他方法將更新節點2和節點3。 這意味着即使失敗的寫入也會最終更新其他節點(如果至少有一個成功)。 Cassandra沒有像關係數據庫那樣的回滾。

+0

我們如何克服這個問題。我不希望我的用戶在提交時失敗的收件箱中看到郵件。有沒有什麼解決方法可以避免這個問題? – suresh

+0

我不知道有什麼辦法可以避免這種情況,但是您可以做的是在失敗的寫入中再次嘗試。只有當該分區鍵有足夠的節點可用時,這才起作用,否則寫入將再次失敗。 一種選擇是將第二次寫入的寫入一致性級別降低爲1。 – Navid

+0

感謝您的更新。我希望卡桑德拉能提出一些解決方案。 – suresh

0

我沒有看到有什麼不對 - 系統做你告訴它的事情,即兩個覆蓋一個,並且由於錯誤消息以「失敗」的形式發送回客戶端,那麼最終狀態應該是「失敗「通過閱讀修復工具。

0

Cassandra協調器節點在其存儲器中維護失敗的副本數據,並且會週期性地重試(3次左右),如果成功則會發送最新數據,否則會截斷存儲器中的數據。

在任何讀取查詢的情況下,協調器節點將請求發送到所有副本節點,並將比較所有副本節點的結果。如果其中一個副本節點沒有發送最新數據,則它會向該節點發送讀取修復命令以保持節點同步。