ANY 和 ONE 一致性级别之间的 Cassandra 差异

Cassandra difference between ANY and ONE consistency levels

假设:RF = 3

在互联网上一些关于一致性级别的视频中,演讲者说 CL = ONE 比 CL = ANY 更好,因为当我们使用 CL = ANY 时,协调器将很乐意只存储提示(和数据)(我们在这里假设具有相应分区键范围的所有其他节点都已关闭)并且我们可能会由于协调器的故障而丢失我们的数据。但是等一下……据我所知,如果我们使用 CL = ONE,例如对于这个分区键我们只有一个(三个)可用节点,我们将只有一个节点插入数据。损失风险相同。

但我认为我们应该假设情况相同——特定令牌的所有节点都消失了。那么最好放弃写操作然后写,这样有很大的协调器丢失的风险。

默认情况下,提示只会存储 3 小时,比 运行 维修时的存储时间更长。如果您在集群中某处的一个节点上至少有此数据的一份副本,则可以进行修复(存储在协调器上的提示不算在内)。

一致性一保证集群中至少有一个节点在提交日志中无论如何都有它。在最坏的情况下,任何存储在协调器的提示中(其他节点无法访问它),默认情况下存储在 3 小时的时间范围内。 ANY 3 小时过去后,如果其他两个实例出现故障,您将丢失数据。

如果担心风险,那么使用quorum,2个节点就得保证保存数据。由应用程序开发人员/设计人员决定。 Quorum 的写入延迟通常比 One 稍大。但是如果负载急剧增加,您总是可以添加更多节点等。

另请查看这个不错的工具,了解各种一致性和复制因素对应用程序有何影响:

https://www.ecyrd.com/cassandracalculator/

使用 RF 3,集群中的 3 个节点将实际获得写入。一致性就是你想要等待他们响应的时间......如果你使用一个,你将等到一个节点在提交日志中有它。但是协调器实际上会将写入发送给所有 3 个。如果他们不响应,协调器会将写入保存到提示中。

大多数情况下,生产中的任何东西都不是一个好主意。

CL=ANY 可能永远不应该在生产服务器上使用。在将提示写入拥有该分区的节点之前,写入将不可用,因为当它在提示日志中时您无法读取数据。

在两个节点关闭的情况下使用 CL=ONE 和 RF=3,您将在 a) 节点上的提交日志和内存表以及 b) 提示日志中存储数据。这些可能是不同的节点,但它们可能有 1/3 的时间是相同的。所以,是的,使用 CL=ONE 和 CL=ANY 时,您可能会因单个节点故障而完全丢失数据。

而不是任何或一个,使用 CL=QUORUM 或 CL=LOCAL_QUORUM。