Cassandra读取是否存在不一致?

Does Cassandra read have inconsistency?

我是 Cassandra 的新手,正在尝试了解它的工作原理。假设写入多个节点。我的理解是,根据密钥的哈希值,它决定哪个节点拥有数据,然后进行复制。在读取数据时,密钥的哈希值确定哪个节点拥有数据,然后它会响应。现在我的问题是,如果读取和写入发生在始终具有数据的同一组节点上,那么读取不一致和 Cassandra returns 陈旧数据是如何发生的?

为了调整一致性,cassandra 允许在每个查询的基础上设置一致性。

现在针对您的问题,假设 CONSISTENCY 设置为 ONE,复制因子为 3。

在写入请求期间,协调器向拥有正在写入的行的所有副本发送写入请求。只要所有副本节点都启动并可用,无论客户端指定的一致性级别如何,它们都将获得写入。写入一致性级别决定了有多少副本节点必须响应成功确认才能认为写入成功。成功意味着数据已写入提交日志和内存表。

例如,在复制因子为 3 的单个数据中心 10 节点集群中,传入的写入将转到拥有所请求行的所有 3 个节点。如果客户端指定的写入一致性级别为 ONE,则第一个完成写入的节点会响应协调器,然后协调器将成功消息代理回客户端。一致性级别为 ONE 意味着 3 个副本中的 2 个可能会错过写入,如果它们在发出请求时恰好发生故障。如果副本错过写入,Cassandra 稍后将使用其内置修复机制之一使行保持一致:提示切换、读取修复或反熵节点修复。

默认情况下,提示会在副本失败后保存三个小时,因为如果副本停机时间超过此时间,它可能会永久死亡。您可以使用 cassandra.yaml 文件中的 max_hint_window_in_ms 属性 配置此时间间隔。如果节点在保存时间结束后恢复,运行 修复以重新复制停机期间写入的数据。

现在,当执行 READ 请求时,协调器节点将这些请求发送到当前可以最快响应的副本。 (因此它可能会转到 3 个副本中的任何 1 个)。

现在想象这样一种情况,数据尚未复制到第三个副本,并且在读取期间选择了该副本(可能性非常小),然后您得到不一致的数据。

此场景假定所有节点都已启动。如果其中一个节点已关闭并且在节点启动后未完成读取修复,那么它可能会导致问题。

READ With Different CONSISTENCY LEVEL

READ Request in Cassandra

考虑 CL 为 QUORUM 的场景,在这种情况下,3 个副本中有 2 个必须响应。写入请求将像往常一样发送到所有 3 个副本,如果写入 2 个副本失败,并且在 1 个副本上成功,cassandra 将 return 失败。由于 cassandra 不回滚,记录将继续存在于成功的副本上。现在,当读取带有 CL=QUORUM 时,读取请求将被转发到 2 个副本节点,如果副本节点之一是先前成功的副本节点,则 cassandra 将 return 新记录,因为它将具有最新记录时间戳。但是从客户的角度来看,这条记录并没有被写入,因为 cassandra 在写入过程中 returned 失败。