2015-08-21 74 views
2

我對Cassandra如何執行寫入請求有些疑惑;我有兩種情況,請閱讀並確保哪一種是正確的。寫入副本並行完成

假設我們有一個由4個節點N1,N2,N3和N4組成的集羣。如卡桑德拉分佈在環形拓撲中的節點,節點鏈接如下:

N-->N-->N3-->N4-->N1

另外,我們有等於3,RF=3複製因子,和一致性水平等於ALL。 CL=ALL

客戶端向協調器發送寫請求W,如N4。分區器已經確定W的主節點是N1。

現在會發生什麼?

情景1:協調員發送WN1。在收到W後,N1將其存儲在本地(在commitLog和memtable中,請忘記內部過程)並確認協調員N4。然後N1W的副本發送到N2(因爲N2是來自N 1個預期的環中的下一個節點)。收到W後,N2將其存儲在本地,並將確認發送給N4。然後N2W的副本發送到N3(因爲N3是來自N2未來的環中的下一個節點)。收到W後,N3將其存儲在本地,並確認協調員N4。最後,只要協調員N4收到來自所有節點(N1,N2N3)的確認,它就會將其重播到客戶端。

需要注意的是,如果方案1是正確的,那麼等待時間將是4輪

N4-->N1-->N2-->N3-->N4 ----client

方案2:協調器,N4,廣播WN1N2N3 N4-->N1, N4-->N2, N4-->N3

然後複製品(N1, N2, and N3)在本地存儲W並確認爲N4。當N4收到全部ACK's時,它會重播給客戶端。

任何人都可以確認卡桑德拉哪個場景是正確的嗎?

問候?

回答

1

情況2是正確的。請求並行發送。

以順序方式查詢副本沒有任何好處,它只會使您的請求花費更長的時間,正如您指出的那樣。如果其中一個節點停機,則需要更長的時間才能找到該信息。

另請注意,在上例中,假設ALL的一致性級別。即協調器將在返回到客戶端之前等待接收來自具有數據副本的所有節點的確認。如果您的一致性較低,比如說ONE或QUORUM,那麼協調器不必等待每個具有副本的節點的ACK,並且可以更快地返回到客戶端。

0

情景2是正確的。

協調器節點將負責將寫入請求發送到所有副本而不是副本節點。