【问题标题】:Proper Consistency Level to read 'everything'阅读“一切”的适当一致性级别
【发布时间】:2021-06-15 22:57:57
【问题描述】:

我正在创建一个同步程序来定期将我们的 Cassandra 数据复制到另一个数据库中。我从中复制的数据库只获取 INSERT - 数据永远不会更新或删除。我想通过两种方式解决 Cassandra 的最终一致性模型:

1 - 每个同步扫描与最后一个重叠一定的时间跨度。例如,如果扫描每小时发生一次,那么每次扫描向后看一个半小时。数据包含唯一键,因此在多次扫描中读取同一记录不是问题。

2 - 我使用 ALL 的一致性级别来确保我正在扫描集群上的所有节点以获取数据。

对于这种情况,所有的一致性都是最好的吗?我只需要在任何节点上查看记录,我不在乎它是否出现在任何其他节点上。但我也不想错过任何 INSERTed 记录。但我也不想遇到超时或性能问题,因为 Cassandra 正在等待多个节点查看该记录。

更复杂的是,这个 Cassandra 网络由位于不同地理位置的 6 个集群组成。我只查询一个。我的假设是 #1 中提到的重叠最终会赶上其他集群上存在的记录。

我正在做的查询是这样的:

SELECT ... FROM transactions WHERE userid=:userid AND transactiondate>:(lastscan-overlap)

其中 userid 是分区键,transactiondate 是集群列。 userId 的列表来自其他地方。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    我使用 All 的一致性级别来确保我正在扫描集群上的所有节点以获取数据

    因此,一致性ALL 与读取的数据副本数量有关,而不是与联系的节点数量有关。如果您的复制因子 (RF) 为 3 并在 ALL 查询单行,则 Cassandra 将散列您的分区键以找出负责该行的三个节点,联系所有 3 个节点,并等待所有 3 个回应。

    我只需要查看一个节点上的记录

    因此,在这方面,我认为您可以使用 LOCAL_ONE

    使用ALL 的唯一可能优势在于,它确实有助于通过 100% 的时间触发读取修复来强制执行数据一致性。所以如果最终的一致性是一个问题,那是一个“加号”。但是*_ONE 肯定更快。

    CL 文档谈了很多关于“陈旧数据”的内容,但我对“新数据”感兴趣

    在您的情况下,我认为过时数据是不可能的,所以您应该没问题。相反,您将面临的问题是,如果一个或多个副本在写入操作期间失败,在LOCAL_ONE 处查询可能会或可能不会获得唯一实际存在的副本。因此,您的数据不会是陈旧的与新的,而是存在与不存在的。我在链接答案中谈到的一点是,也许 writing 在更高的一致性级别和 reading LOCAL_ONE 可能适用于您的用例。

    几年前,我写了一个关于不同一致性级别的答案,在这种情况下您可能会发现它很有帮助: If lower consistency level is good then why we need to have a higher consistency(QUORUM,ALL) level in Cassandra?

    【讨论】:

    • 我已经添加了一些,但你是对的;我的问题是关于 CL。 CL 文档谈了很多关于“陈旧数据”的内容,但我对“新数据”感兴趣(通过使用相当开放的查询获得),
    • @MarcBernier 已编辑。
    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多