Cassandra 卡桑德拉·里德有矛盾吗?

Cassandra 卡桑德拉·里德有矛盾吗?,cassandra,cassandra-2.0,cassandra-2.1,Cassandra,Cassandra 2.0,Cassandra 2.1,我是卡桑德拉的新手,我正在努力了解它是如何工作的。假设对多个节点进行了写入。我的理解是,根据密钥的散列值,它决定了哪个节点拥有数据,然后进行复制。读取数据时,密钥的哈希值确定哪个节点拥有数据,然后它会做出响应。现在我的问题是,如果读取和写入发生在始终具有数据的同一组节点上,那么读取不一致性是如何发生的,Cassandra会返回陈旧的数据?对于调整一致性,Cassandra允许在每个查询的基础上设置一致性 现在,对于您的问题,让我们假设一致性设置为1,复制因子为3 在写入请求期间,协调器向拥有正在

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

对于调整一致性,Cassandra允许在每个查询的基础上设置一致性

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

在写入请求期间,协调器向拥有正在写入的行的所有复制副本发送写入请求。只要所有副本节点都已启动且可用,它们将获得写操作,而与客户端指定的一致性级别无关。写入一致性级别确定有多少副本节点必须响应成功确认,才能将写入视为成功。成功意味着数据已写入提交日志和memtable

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

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

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

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

此场景假定所有节点都已启动。如果其中一个节点发生故障,并且在节点启动后未执行读取修复,则可能会导致问题


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

数据同时从协调器写入所有3个副本(不只是第一个副本),它只在满足请求的一致性后确认写入。如果任何节点停机,协调器将写入提示,一旦节点返回,它会将提示流式传输给它,使其变得一致。读取修复只是另一种机制。一个节点关闭并不意味着它会变得不一致。当读取发生时,它会向最快的副本发送一个数据请求,向其他副本发送一个摘要请求。一旦获得足够的响应以满足CL,它将返回给客户机。它将把从节点返回的数据与其他节点的摘要进行比较。如果它们不匹配,它将发送一个变异来修复不一致性。根据哪个(数据或摘要)是最新的,有阻塞和异步读取修复。即使在客户端获得读取响应后,也可能发生这种情况。如果数据请求发送到其他副本的数据请求太慢,则可以进行推测性重试。@ChrisLohfink您对摘要和提示的看法是正确的。。。但提示最大寡妇默认为3小时。。。根据
read\u repair\u机会
,将使用摘要进行
read\u repair
。。。在一致性的情况下,一个结果将在1个副本响应后立即返回给协调员。谢谢。我从回复中的评论和链接中了解到,如果一致性级别为QUORUM,则读取请求将与最新数据保持一致和最新。让我知道这是不是正确的理解。