我对Cassandra如何执行写请求有些怀疑;我有两种情况,请阅读它们并确保哪一种是正确的。
假设我们有一个由4个节点N1,N2,N3和N4组成的集群。当Cassandra在环形拓扑中分发节点时,节点链接如下:
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
时,它会重播给客户。
任何人都可以确认Cassandra中哪种情况是正确的吗?
此致?
答案 0 :(得分:1)
场景2是正确的。请求是并行发送的。
以顺序方式查询副本没有任何好处,它只会使请求花费更长时间,如您所指出的那样。如果其中一个节点出现故障,则需要更长时间才能找到该信息。
另请注意,在上面的示例中,您假设一致性级别为ALL。即,协调器将等待在返回到客户端之前从具有数据副本的所有节点接收确认。如果您具有较低的一致性,例如ONE或QUORUM,则协调器不必等待来自具有副本的每个节点的ACK,并且可以更快地返回到客户端。
答案 1 :(得分:0)
情景2是对的。
协调节点将负责将写请求发送到所有副本而不是副本节点。