use*_*247 3 cassandra cassandra-2.0 cassandra-2.1
我是Cassandra的新手,正在尝试了解它的工作原理。假设是否写入多个节点。我的理解是,根据键的哈希值,它决定哪个节点拥有数据,然后进行复制。在读取数据时,键的哈希值确定哪个节点拥有数据,然后它进行响应。现在我的问题是,如果读取和写入是从始终具有数据的同一节点集进行的,那么读取不一致将如何发生,而Cassandra会返回陈旧数据?
对于调整一致性,cassandra允许在每个查询的基础上设置一致性。
现在,对于您的问题,我们假设CONSISTENCY设置为ONE,复制因子为3。
在WRITE请求期间,协调器将写请求发送到拥有正在写入的行的所有副本。只要所有副本节点都已启动并可用,无论客户端指定的一致性级别如何,它们都将获得写操作。写一致性级别确定了多少个副本节点必须以成功确认响应,才能将写视为成功。成功意味着数据已写入提交日志和内存表。
例如,在复制因子为3的单个数据中心10节点群集中,传入写入将转到拥有请求的行的所有3个节点。如果客户端指定的写一致性级别为ONE,则完成写操作的第一个节点将响应协调器,协调器然后将成功消息代理返回给客户端。一致性级别为ONE表示,如果在提出请求时3个副本中的2个恰好发生故障,则其中2个副本可能会丢失写入。如果副本未写入,Cassandra稍后将使用其内置修复机制之一使行保持一致:提示切换,读取修复或反熵节点修复。
默认情况下,副本失败后,提示会保存三个小时,因为如果副本停机的时间长于此时间,则很可能永久失效。您可以使用max_hint_window_in_mscassandra.yaml文件中的属性配置此时间间隔。如果在保存时间过去之后节点恢复,请进行修复以重新复制在停机时间内写入的数据。
现在,当执行READ请求时,协调器节点会将这些请求发送到当前可以最快响应的副本。(因此,它可能会转到3个副本中的任何一个)。
现在,设想一种情况,即数据尚未复制到第三个副本,并且在READ期间选择了副本(机会可以忽略不计),那么您将获得不一致的数据。
此方案假定所有节点都已启动。如果节点之一处于关闭状态,并且一旦该节点处于启动状态,则不执行读取修复,则可能累加问题。
| 归档时间: |
|
| 查看次数: |
730 次 |
| 最近记录: |