【问题标题】:Are writes to replics done in parallel对副本的写入是否并行完成
【发布时间】:2016-03-23 03:50:55
【问题描述】:

我对 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 是来自N1 预期的环中的下一个节点)。收到W,N2 后将其存储在本地,并向N4 发送确认。然后N2W 的副本发送到N3(因为N3 是来自N2 预期的环中的下一个节点)。在收到W,N3 后将其存储在本地并确认 CoordinatorN4。最后,一旦协调器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 中哪个场景是正确的?

问候?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      场景2是对的。

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

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多