适当的一致性级别阅读 'everything'

Proper Consistency Level to read 'everything'

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

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

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

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

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

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

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

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

I use a Consistency level of All to ensure that I'm scanning all of the nodes on the cluster for the data

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

I just need to see a record on one node

因此,在这方面,我认为 LOCAL_ONE 没问题。

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

The CL documentation talks a lot about 'stale data', but I am interested in 'new data'

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

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