Cassandra Read是否有不一致



我是卡桑德拉(Cassandra(的新手,并且正在尝试了解其工作原理。说出是否写给许多节点。我的理解是,根据密钥的哈希值,它决定哪个节点拥有数据,然后复制发生。在读取数据时,密钥的哈希确定哪个节点具有数据,然后回复。现在我的问题是,如果阅读和写作是从始终具有数据的同一组节点中发生的,那么读取不一致会如何发生并且Cassandra返回陈旧数据?

用于调整一致性cassandra允许按查询设置一致性。

现在,对于您的问题,让我们假设一致性设置为一个,复制因子为3。

在写入请求协调过程中,将写请求发送给拥有所编写的行的所有副本。只要所有副本节点都启动并可用,无论客户端指定的一致性级别如何,它们都会获得写入。写入一致性级别确定有多少复制节点必须以成功的确认,以使写入被认为是成功的。成功意味着将数据写入提交日志和可记忆。

例如,在单个数据中心10节点群集中,复制因子为3,传入写入将转到拥有请求行的所有3个节点。如果客户端指定的写入一致性级别是一个,则第一个完成写入的节点响应了协调员,然后将成功消息归还给客户端。一个一致性水平意味着,如果3个复制品中有2个在提出请求时碰巧下降,则可能会错过写作。如果复制品错过了写作,则Cassandra将使用其内置维修机构之一使该行保持一致:提示的交接,读取修复或抗透射节点修复。

默认情况下,副本失败后三个小时保存提示,因为如果复制副本的时间更长,则可能会永久死亡。您可以使用Cassandra.yaml文件中的max_hint_window_in_ms属性来配置此时间间隔。如果节点经过后的节点恢复,请运行维修以重新恢复停机时间的数据。

现在,当执行读取请求时,协调器节点将这些请求发送给当前可以响应最快的副本。(因此,它可能转到3个复制品中的任何一个(。

现在想象一个尚未复制到第三副本的情况,并且在阅读时选择了副本(机会很忽略(,然后您获得一致的数据。

这种情况假设所有节点都已上升。如果一个节点降低并且一旦节点启动就不会完成读取修复,则可能会加起来。

以不同的一致性级别阅读

阅读Cassandra中的请求

考虑cl为Quorum的方案,在这种情况下,三分之二的复制品必须响应。写请求将像往常一样转到所有3个复制品,如果写入2副本失败,并且在1个副本上取得成功,则Cassandra将返回失败。由于卡桑德拉没有回滚,因此成功的复制品将继续存在记录。现在,当读取带有Cl = Quorum时,并且读取请求将转发到2个副本节点,如果复制节点之一是先前成功的节点,则Cassandra将返回新记录,因为它将具有最新的时间戳。但是从客户的角度来看,此记录没有写出,因为卡桑德拉在写作过程中返回失败。

最新更新