2013-04-15 79 views
2

在文檔[1],有人說處理Cassandra寫入失敗的常見做法是什麼?

if using a write consistency level of QUORUM with a replication factor 
of 3, Cassandra will send the write to 2 replicas. If the write fails on 
one of the replicas but succeeds on the other, Cassandra will report a 
write failure to the client. 

所以只承擔2副本接收更新,寫失敗。但由於最終一致性,所有節點最終都會收到更新。

那麼,我應該重試嗎?或者就這樣離開它?

任何策略?

[1] http://www.datastax.com/docs/1.0/dml/about_writes

回答

3

那些文檔是不完全正確。無論一致性級別(CL)如何,寫入都會發送到所有可用副本。如果副本不可用,則Cassandra不會向下行節點發送請求。如果從一開始就沒有足夠的可用來滿足CL,則會拋出UnavailableException,並且不會嘗試寫入任何節點。

但是,寫入仍然可以在某些節點上成功,並將錯誤返回給客戶端。在來自[1]的示例中,如果在嘗試寫入之前一個副本關閉,則寫入的內容爲真。

因此,假設只有2個副本接收更新,寫入失敗。但由於最終的一致性,所有節點最終都會收到更新 。

但要小心:失敗的寫入不會告訴您寫入了多少個節點。它可能沒有,因此寫入可能不會最終傳播。

那麼,我應該重試嗎?或者就這樣離開它?

一般而言,您應該重試,因爲它可能根本不會被寫入。當您從寫入中成功返回時,您只應將寫入視爲寫入。

如果您使用計數器,但您應該小心重試。因爲你不知道寫作是否成功,你可能會得到重複計數。對於計數器,您可能不希望重試(因爲通常至少對一個節點進行寫操作,至少對於更高的一致性級別)。

0

重試不會有太大變化。問題是,你實際上不知道數據是否完全保留,因爲Cassandra總是拋出相同的異常。

您有幾種選擇:

  • 啓用提示,然後重試與CL =請求任何 - 成功的響應將意味着至少暗示已創建。所以你知道數據在那裏但尚未訪問。
  • 禁用提示並重試一次 - 成功的響應意味着至少節點可以接收數據。在出錯的情況下執行刪除。
  • 使用astyanax和他們的重試策略
  • 更新卡桑德拉1.2和使用預寫日誌
相關問題