我对Cassandra如何执行写入请求有些疑惑;我有两种情况,请阅读并确保哪一种是正确的。写入副本并行完成
假设我们有一个由4个节点N1,N2,N3和N4组成的集群。如卡桑德拉分布在环形拓扑中的节点,节点链接如下:
N-->N-->N3-->N4-->N1
另外,我们有等于3,RF=3
复制因子,和一致性水平等于ALL。 CL=ALL
客户端向协调器发送写请求W,如N4。分区器已经确定W的主节点是N1。
现在会发生什么?
情景1:协调员发送W
至N1
。在收到W
后,N1
将其存储在本地(在commitLog和memtable中,请忘记内部过程)并确认协调员N4
。然后N1
将W
的副本发送到N2
(因为N2
是来自N
1个预期的环中的下一个节点)。收到W
后,N2
将其存储在本地,并将确认发送给N4
。然后N2
将W
的副本发送到N3
(因为N3
是来自N2
未来的环中的下一个节点)。收到W
后,N3
将其存储在本地,并确认协调员N4
。最后,只要协调员N4
收到来自所有节点(N1
,N2
和N3
)的确认,它就会将其重播到客户端。
需要注意的是,如果方案1是正确的,那么等待时间将是4轮
N4-->N1-->N2-->N3-->N4 ----client
。
方案2:协调器,N4
,广播W
到N1
,N2
和N3
N4-->N1, N4-->N2, N4-->N3
。
然后复制品(N1, N2, and N3
)在本地存储W
并确认为N4
。当N4
收到全部ACK's
时,它会重播给客户端。
任何人都可以确认卡桑德拉哪个场景是正确的吗?
问候?