2015-08-21 36 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是正确的。

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