卡桑德拉读书有前后矛盾吗?

use*_*247 3 cassandra cassandra-2.0 cassandra-2.1

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

und*_*ble 5

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

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

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

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

默认情况下,副本失败后,提示会保存三个小时,因为如果副本停机的时间长于此时间,则很可能永久失效。您可以使用max_hint_window_in_mscassandra.yaml文件中的属性配置此时间间隔。如果在保存时间过去之后节点恢复,请进行修复以重新复制在停机时间内写入的数据。

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

现在,设想一种情况,即数据尚未复制到第三个副本,并且在READ期间选择了副本(机会可以忽略不计),那么您将获得不一致的数据。

此方案假定所有节点都已启动。如果节点之一处于关闭状态,并且一旦该节点处于启动状态,则不执行读取修复,则可能累加问题。

以不同的一致性级别读取

Cassandra中的READ请求