读取“所有内容”的适当一致性级别

时间:2021-03-18 14:10:33

标签: cassandra

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

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

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

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

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

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

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

其中 userid 是分区键,transactiondate 是一个聚类列。 userId 的列表来自别处。

1 个答案:

答案 0 :(得分:1)

<块引用>

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

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

<块引用>

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

所以我认为在这方面您可以接受 LOCAL_ONE

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

<块引用>

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

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

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

相关问题