2017-06-14 115 views
0

當併發寫入發生時,Cassandra如何保證最終的一致性?Cassandra併發寫入

例如,客戶端A寫入tableA.rowA.colA,同時客戶端B寫入tableA.rowA.colA。

協調器節點將請求分發到複製節點,如NodeA NodeB和NodeC。

在NodeA上,ClientA請求首先到達。 在NodeB上,ClientB請求首先到達。那麼,它會永遠不一致嗎?

回答

3

Cassandra遵循「Last Write Wins」政策。使用的時間戳可以手動設置,但默認情況下由請求者see Datastax Java Driver docs設置客戶端。寫入的順序無關緊要。如果寫入A具有比寫入B更早的時間戳,那麼它總是被寫入B覆蓋。唯一不明確的情況是當時間戳完全匹配時。在這種情況下,更大的價值勝。

這樣做的最終一致的部分是:

  • 假設A具有比B中的較早時間戳
  • 如果A到達上副本1和B到達上副本2,正確狀態是B
  • 副本1將響應A,直到它從副本2接收到關於B的信息。
  • 當B被複制時,副本1也將響應B.

大多數使用情況都涉及不在Cassandra中存儲狀態,因此不會出現這些問題。

+0

OK,所以它達成任何之前的時間戳設置複製機器。因此,確保所有更新請求具有相同客戶端的相同時間戳記。 – user1947415

+0

客戶如何同步他們的時間戳?像不同的服務器有不同的本地時間。 – user1947415

+0

NTP通常是這樣,但建立一個數據模型更重要,因爲不同的客戶端有不同步的時間不會破壞數據。 – RussS

1

每次向cassandra寫入(插入/更新/刪除),也會插入與每列關聯的時間戳。當您執行讀取查詢時,時間戳用於在單個列或集合元素中選擇「獲勝」更新

如果使用相同時間戳進行真正的併發寫入,該怎麼辦?在不太可能的情況下,您最終會得到兩個微秒內匹配的時間戳,但最終可能會出現錯誤版本,但Cassandra會確保通過比較字節值來始終打破關係

因此對於您的情況「 NodeA上客戶端A的請求首先到達。在基站的ClientB請求首先到達」

  • 如果客戶端A請求時間戳是舊的,然後客戶端A將贏得

  • 如果ClientB請求時間戳是老年人則ClientB會贏。

  • 如果客戶端A和ClientB都具有相同的時間戳然後得主是由字節詞法比較值choosen,所以返回的值是確定的