當併發寫入發生時,Cassandra如何保證最終的一致性?Cassandra併發寫入
例如,客戶端A寫入tableA.rowA.colA,同時客戶端B寫入tableA.rowA.colA。
協調器節點將請求分發到複製節點,如NodeA NodeB和NodeC。
在NodeA上,ClientA請求首先到達。 在NodeB上,ClientB請求首先到達。那麼,它會永遠不一致嗎?
當併發寫入發生時,Cassandra如何保證最終的一致性?Cassandra併發寫入
例如,客戶端A寫入tableA.rowA.colA,同時客戶端B寫入tableA.rowA.colA。
協調器節點將請求分發到複製節點,如NodeA NodeB和NodeC。
在NodeA上,ClientA請求首先到達。 在NodeB上,ClientB請求首先到達。那麼,它會永遠不一致嗎?
Cassandra遵循「Last Write Wins」政策。使用的時間戳可以手動設置,但默認情況下由請求者see Datastax Java Driver docs設置客戶端。寫入的順序無關緊要。如果寫入A具有比寫入B更早的時間戳,那麼它總是被寫入B覆蓋。唯一不明確的情況是當時間戳完全匹配時。在這種情況下,更大的價值勝。
這樣做的最終一致的部分是:
大多數使用情況都涉及不在Cassandra中存儲狀態,因此不會出現這些問題。
每次向cassandra寫入(插入/更新/刪除),也會插入與每列關聯的時間戳。當您執行讀取查詢時,時間戳用於在單個列或集合元素中選擇「獲勝」更新
如果使用相同時間戳進行真正的併發寫入,該怎麼辦?在不太可能的情況下,您最終會得到兩個微秒內匹配的時間戳,但最終可能會出現錯誤版本,但Cassandra會確保通過比較字節值來始終打破關係
因此對於您的情況「 NodeA上客戶端A的請求首先到達。在基站的ClientB請求首先到達」
如果客戶端A請求時間戳是舊的,然後客戶端A將贏得
如果ClientB請求時間戳是老年人則ClientB會贏。
如果客戶端A和ClientB都具有相同的時間戳然後得主是由字節詞法比較值choosen,所以返回的值是確定的
OK,所以它達成任何之前的時間戳設置複製機器。因此,確保所有更新請求具有相同客戶端的相同時間戳記。 – user1947415
客戶如何同步他們的時間戳?像不同的服務器有不同的本地時間。 – user1947415
NTP通常是這樣,但建立一個數據模型更重要,因爲不同的客戶端有不同步的時間不會破壞數據。 – RussS