【问题标题】:How does Cassandra guarantee eventual consistency in cross region replication?Cassandra 如何保证跨区域复制的最终一致性?
【发布时间】:2017-07-18 12:41:38
【问题描述】:

我找不到太多关于它的文档。我唯一能发现的是,当一致性级别没有设置为 EACH_QUORUM 时,跨区域复制是异步完成的。

但是在异步样式中,是否有可能丢失消息? Cassandra 如何处理丢失的消息?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    如果您不使用 EACH_QUORUM 并且可以接受写入的目标节点已关闭,则协调节点会将写入保存为 “提示切换”

    当目标节点再次可用时,协调器在目标上重放提示的切换。

    对于任何提示切换丢失的情况,您必须对集群进行修复。

    您还必须注意,默认情况下最多允许存储提示 3 小时。

    有关详细信息,请参阅文档:

    http://www.datastax.com/dev/blog/modern-hinted-handoff http://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsRepairNodesHintedHandoff.html

    希望这会有所帮助。

    【讨论】:

    • 是的,当您使用多个数据中心时,唯一的区别是您有更多的一致性级别可供选择。例如 LOCAL_QUORUM 在执行读写时只会尝试在本地达成共识。 Cassandra consistency levels
    【解决方案2】:

    当您在 Cassandra 中发出写入时,协调器会将写入发送到所有在线副本,然后阻塞。块的持续时间对应于一致性级别 - 如果你说“ALL”,它会阻塞直到所有节点都确认写入。如果您使用“EACH_QUORUM”,它会阻塞,直到每个数据中心中的法定节点数确认写入。

    对于未确认写入的任何副本,协调器将写入提示,并尝试稍后传递该提示(分钟,小时,不保证)。

    但请注意,所有写入都是同时发送的 - 您没有保证哪些已发送。您的保证是在一致性级别。

    当你阅读时,你会做类似的事情——你会阻塞,直到你有适当数量的副本回答。如果你用 EACH_QUORUM 写,你可以用 LOCAL_QUORUM 读,并保证强一致性。如果你用 QUORUM 写,你可以用 QUORUM 读。如果用 ONE 写,用 ALL 读仍然可以保证强一致性。

    为了保证最终的一致性,您不必做任何事情 - 它最终会到达那里,只要您使用 CL >= ONE 编写(CL ANY 并不是真正的保证)。

    【讨论】:

    • 谢谢,这部分我明白了。我感到困惑的是 C* 如何处理跨 DC 复制。既然是异步的,是尽最大努力还是有其他机制来保证数据最终被复制?
    • 没有其他机制。在写入、读取修复、主动修复和提示时发送突变。除了这些之外,没有其他复制机制(DC 内或 DC 间)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 2017-09-26
    • 2017-06-28
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多