是否并行完成对复制的写入

时间:2015-08-21 16:00:16

标签: cassandra

我对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。然后N1W的副本发送给N2(因为N2是来自N 1预期的环中的下一个节点)。收到W后,N2会将其存储在本地,并向N4发送确认。然后N2W的副本发送给N3(因为N3是来自N2预期的环中的下一个节点)。收到W后,N3会在本地存储并确认协调员N4。最后,一旦协调员N4收到来自所有节点(N1N2N3)的确认,它就会将其重播给客户端。

请注意,如果方案1正确,则延迟将为4轮

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

情景2:协调员N4,向WN1N2广播N3 N4-->N1, N4-->N2, N4-->N3

然后副本(N1, N2, and N3)在本地存储W并向N4确认。当N4收到所有ACK's时,它会重播给客户。

任何人都可以确认Cassandra中哪种情况是正确的吗?

此致?

2 个答案:

答案 0 :(得分:1)

场景2是正确的。请求是并行发送的。

以顺序方式查询副本没有任何好处,它只会使请求花费更长时间,如您所指出的那样。如果其中一个节点出现故障,则需要更长时间才能找到该信息。

另请注意,在上面的示例中,您假设一致性级别为ALL。即,协调器将等待在返回到客户端之前从具有数据副本的所有节点接收确认。如果您具有较低的一致性,例如ONE或QUORUM,则协调器不必等待来自具有副本的每个节点的ACK,并且可以更快地返回到客户端。

答案 1 :(得分:0)

情景2是对的。

协调节点将负责将写请求发送到所有副本而不是副本节点。