Cassandra 读取'的适当一致性级别;一切';

Cassandra 读取'的适当一致性级别;一切';,cassandra,Cassandra,我正在创建一个同步程序,定期将我们的Cassandra数据复制到另一个数据库中。我从中复制的数据库只会获取插入-数据永远不会更新或删除。我想从两个方面阐述卡桑德拉的最终一致性模型: 1-每个同步扫描与最后一个同步扫描重叠一定的时间跨度。例如,如果扫描每小时进行一次,那么每次扫描都会向后看一个半小时。数据包含唯一的键,因此在多个扫描中读取同一记录不是问题 2-我使用ALL的一致性级别来确保扫描集群上的所有节点以查找数据 对于这种情况,所有这些都是最好的一致性吗?我只需要在任何节点上查看记录,我不在

我正在创建一个同步程序,定期将我们的Cassandra数据复制到另一个数据库中。我从中复制的数据库只会获取插入-数据永远不会更新或删除。我想从两个方面阐述卡桑德拉的最终一致性模型:

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

2-我使用ALL的一致性级别来确保扫描集群上的所有节点以查找数据

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

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

我所做的查询如下:

SELECT ... FROM transactions WHERE userid=:userid AND transactiondate>:(lastscan-overlap)
其中,userid是分区键,transactiondate是集群列。用户ID列表来源于其他地方

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

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

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

因此,我认为在这方面,您可以使用
LOCAL\u ONE

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

CL文档中有很多关于“过时数据”的内容,但我对“新数据”感兴趣

在你的情况下,我不认为过时的数据是一种可能性,所以你应该可以在那里。相反,您将面临的问题是,如果一个或多个副本在写入操作期间失败,则在
LOCAL\u one
查询可能会或可能不会为您获取实际存在的唯一副本。因此,您的数据不会是陈旧的或新的,而是存在的或不存在的。我在链接答案中谈到的一点是,也许在更高的一致性级别上编写和在
LOCAL\u One
上阅读可能适用于您的用例

几年前,我写了一个关于不同一致性级别的答案,在这种情况下,您可能会发现这很有用:

我又加了一点,但你是对的;我的问题是关于CL的。CL文档谈论了很多“陈旧数据”,但我对“新数据”(通过使用一个相当开放的查询获得)感兴趣,@MarcBernier Edit make。