【问题标题】:Cassandra - write with CL.ALL with multiple data centersCassandra - 使用 CL.ALL 编写多个数据中心
【发布时间】:2012-06-24 23:44:27
【问题描述】:

我有两个数据中心,每个数据中心的复制因子为 3。

在数据存储在两个 DC(6 个节点,或 3 + 1)之前,是否会使用 CL.ALL 块进行写入? 我会假设,它会阻塞,直到本地 DC 中的所有 3 个副本都确认成功写入。

我想要像 CL.ALL_LOCAL 这样的东西,它将所有副本上的数据存储在单个 DC 中,因此我可以使用 CL.ONE 读取。这个想法是,写入阻塞,直到单个 DC 中的所有副本都已持久化数据,并且后续读取将有很大概率读取新数据

【问题讨论】:

  • Cassandra 中的复制可以基于 dc 进行配置,但不能基于机架。您是否有 2 个 dcs,每个 3 个副本?还是 1 dc 与 3 个节点的 2 个机架和该数据中心中的 6 个副本(实际上每个机架中有 3 个副本)?还是其他配置?
  • 正确 - 我已经更正了我的问题

标签: cassandra


【解决方案1】:

目前没有提供您所描述内容的一致性级别。最接近的是 LOCAL_QUORUM,它将在本地数据中心中的法定节点响应后返回。

如果您愿意,可以在 jira 上提交工单以添加此功能。

https://issues.apache.org/jira/browse/CASSANDRA

【讨论】:

    【解决方案2】:

    我检查了 Cassandra 1.1 代码并注意到在多 DC 部署中使用 CL.ALL 编写代码时的有趣行为。 可能我解释错了代码....无论如何:

    一开始,他们收集节点的 IP 地址以发送行突变 - 这与客户端提供的一致性级别无关。在 1.0 中,它是来自所有 DC 的所有节点,从 1.1 开始,它们从本地 DC 中获取所有节点,并从每个远程 DC 中获取一个节点(其余节点在消息中为“转发到”)。每个突变将由单独的线程发送,因此请求可以并行运行。每个这样的突变都被消息服务作为消息处理。远程 DC 中的节点收到消息后,将其转发给“转发到”中提供的剩余节点。

    客户端提供的一致性级别,定义了必须确认接收到的消息的节点数。在 CL.ALL 的情况下,这个数字由复制因子决定——现在变得有趣了:因为我们已经从本地 DC 向所有节点和远程 DC 的节点发送消息,我们也会从那些删除节点那里得到确认——是的这仍然是由复制因子定义的数字,但根据 notwork 延迟,我们无法确定哪些节点符合接收到的消息 - 可能来自本地和远程 DC 的节点,但也可能只是来自本地 DC 的节点.在最坏的情况下,可能会发生本地节点都没有收到消息,并且确认来自远程 DC(如果你有很多)。这意味着 - 使用 CL.ALL 写入不会被授予,您可以立即阅读来自本地 DC 的消息

    【讨论】:

    • CL.ALL 将阻塞直到真正的 all 副本响应。这意味着本地数据中心中的所有节点远程数据中心中的所有节点。使用 CL.ALL 写入时,当写入返回成功状态时,您肯定会在任何地方看到该写入。
    • 来自副本的预期响应数量由 WriteResponseHandler#determineBlockFor 计算。 WriteResponseHandler 是一个抽象类,由工厂方法创建:AbstractReplicationStrategy#getWriteResponseHandler - 在 EACH_QUORUM 工厂创建的情况下:DatacenterSyncWriteResponseHandler,但对于 CL.ALL,它返回:WriteResponseHandler,并且不支持 DC。在我看来,CL.ALL 只等待 xx 响应,其中 xx 是复制因子。或者也许我错过了什么......
    • 对。但是当使用 NetworkTopologyStrategy 时,getReplicationFactor() 返回所有数据中心的 total 复制因子。它遍历每个配置的数据中心,并将来自该 dc 的 RF 添加到总数中并返回。因此 ALL 将阻止来自所有数据中心中每个副本的响应。
    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 2017-01-16
    • 2013-06-11
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多