2016-01-20 65 views
4

introduction course of Cassandra DataStax中,他們說Cassandra羣集節點的所有時鐘必須同步,以防止對「舊」數據進行READ查詢。爲什麼Cassandra集羣需要同步節點之間的時鐘?

如果一個或多個節點都關閉他們不能得到更新,但只要他們回來了 - 他們將更新並沒有問題......

那麼,爲什麼卡桑德拉集羣之間需要同步時鐘節點?

+0

我的想法是,同步依賴於知道更改的時間。如果一個節點知道它在給定時間同步,那麼另一個節點用較早的時間戳寫入數據,第一個節點將不知道它需要重新同步該數據。然後使用該第一個節點的人將讀取舊數據。我不確定爲什麼一個節點被關閉了。如果發生故障,沒有人可以對其進行更改,以確保其他人需要同步。當它恢復時,它會知道它上次同步的時間,並根據它們的更改同步到其他時間。 – RosieC

回答

8

一般來說,讓服務器時鐘保持同步總是一個好主意,但節點之間需要時鐘同步的主要原因是Cassandra使用一種名爲'Last Write Wins'的概念來解決衝突並確定哪種突變代表最正確的最新數據狀態。這在Why cassandra doesn't need vector clocks中有解釋。

每當您在cassandra中「變更」(寫入或刪除)列時,協調器將處理您的請求分配一個時間戳。該時間戳記與單元格中的列值一起寫入。

當讀取請求發生時,cassandra會生成結果,查找您的查詢條件的突變,並且當它看到表示同一列的多個單元格時,它將選擇具有最近時間戳的單元格(讀取路徑比此更復雜但在這種情況下,您只需要知道這一點)。

當節點的時鐘不同步時,情況開始變得有問題。正如我所提到的,處理您的請求的協調節點會分配時間戳。如果對同一列進行多重變異並分配了不同的協調員,則可以創建一些情況,即過去發生的寫入被返回而不是最新的。

這裏是描述基本方案:

假設我們有與節點A 2節點集羣和B.讓我們假設,其中A是在時間t10和B是在時間t5的初始狀態。

  1. 用戶執行DELETE C FROM tbl WHERE key=5。節點A協調請求並分配時間戳t10
  2. 第二次通過,用戶執行​​。節點B協調請求併爲其分配時間戳t6
  3. 用戶執行查詢SELECT C from tbl where key=5。由於步驟1中的DELETE具有更新的時間戳(t10 > t6),因此不會返回任何結果。

請注意,較新版本的datastax驅動程序將開始默認使用客戶端時間戳讓客戶端應用程序爲請求生成並分配時間戳,而不依賴於C *節點來分配它們。從3.0開始的datastax java-driver現在默認爲客戶端時間戳(請參閱'Client-side generation'的更多內容)。如果所有請求都來自同一個客戶端,這非常好,但是如果您有多個應用程序寫入cassandra,則您現在必須擔心保持客戶端時鐘同步。

+0

很好的答案,謝謝! – Rada

+1

很好的解釋。讓我們考慮一下我在一個DC內的Amazon EC2中的集羣中有4個節點。我已將Simple Snitch配置爲SimpleSnitch。我沒有使用任何客戶端時間戳機制(通過假定服務器本身應該處理時間),並且我沒有使用任何NTP服務,但默認情況下,所有4 EC2實例將具有相同的時間。這種情況會影響數據的一致性嗎? –

+0

時鐘已知會漂移,尤其是在EC2等虛擬化環境中(請參閱:http://unix.stackexchange.com/questions/29220/why-is-my-ec2-servers-time-off-by-10-seconds-每天)。因此,即使您的時鐘現在同步,如果您不使用ntpd來同步時鐘,也可能會遇到同樣的問題。 –

相關問題