我是卡桑德拉的新手,我正在努力了解它是如何运作的。如果写入多个节点则说。我的理解是,根据密钥的哈希值,它决定哪个节点拥有数据,然后复制发生。在读取数据时,密钥的散列确定哪个节点具有数据,然后它响应。现在我的问题是,如果读取和写入是从始终具有数据的同一组节点发生的,那么如何发生读取不一致并且Cassandra返回陈旧数据?
答案 0 :(得分:4)
对于调优一致性,cassandra允许基于每个查询设置一致性。
现在针对您的问题,我们假设CONSISTENCY设置为ONE,复制因子为3。
在WRITE请求期间,协调器向拥有正在写入的行的所有副本发送写请求。只要所有副本节点都已启动且可用,无论客户端指定的一致性级别如何,它们都将获得写入。写入一致性级别确定有多少副本节点必须通过成功确认进行响应才能使写入成功。成功意味着数据被写入提交日志和memtable。
例如,在复制因子为3的单个数据中心10节点集群中,传入写入将转到拥有所请求行的所有3个节点。如果客户端指定的写入一致性级别为1,则完成写入的第一个节点将响应回协调器,然后协调器将成功消息代理回客户端。一致性级别为1意味着如果在请求发生时碰巧发生故障,则3个副本中的2个可能会错过写入。如果副本错过了写入,Cassandra将使用其内置修复机制之一使行保持一致:暗示切换,读取修复或反熵节点修复。
默认情况下,在副本失败后,提示会保存三个小时,因为如果副本的停机时间比此更长,则可能会永久死亡。您可以使用cassandra.yaml文件中的max_hint_window_in_ms
属性配置此时间间隔。如果节点在保存时间结束后恢复,请运行修复以重新复制在停机时间内写入的数据。
现在,当执行READ请求时,协调器节点将这些请求发送到当前响应速度最快的副本。 (因此它可能会转到3个副本中的任何一个)。
现在假设数据尚未复制到第三个副本的情况,并且在READ期间选择了副本(可能性非常小),然后您可以获得一致的数据。
此方案假定所有节点都已启动。如果其中一个节点关闭,并且一旦节点启动就不进行读取修复,那么它可能会累积问题。
答案 1 :(得分:0)
请考虑CL为QUORUM的情况,在这种情况下,必须有3个副本中的2个响应。写入请求将照常发送到所有3个副本,如果对2个副本的写入失败,并且对1个副本成功,则cassandra将返回Failed。由于cassandra不回滚,因此该记录将继续存在于成功的副本中。现在,当读取带有CL = QUORUM时,读取请求将转发到2个副本节点,并且如果其中一个副本节点是先前成功的副本节点,则cassandra将返回新记录,因为它将具有最新时间戳。但是从客户端的角度来看,该记录并未写入,因为cassandra在写入过程中返回了失败。