Cassandra Consistency(当节点离线时)

时间:2014-08-31 23:40:29

标签: java cassandra consistency

假设我有一个包含4个节点的集群。

我使用ConsistenyLevel.ALL

启动写操作

假设所有4个节点都已连接,它将按预期成功。

假设所有4个节点都已连接,但1由于某种原因而失败(主键已存在等)。它会失败。

我的问题是:

如果4个节点中有1个处于脱机状态,那么当使用ConsistentyLevel.ALL执行写入时,它会失败吗? 还是考虑到了“可达性”? (即,如果节点离线,则有效簇大小为3而不是4)。

如果要成功,当4节点重新联机时,它会在接受新客户端请求之前同步吗?

PS。不确定这是否重要但我会使用Datastax Java Driver。

3 个答案:

答案 0 :(得分:1)

如果指定一致性级别为ALL,则该请求将失败,并且群集已知的任何负责该查询的副本都未启动。一旦节点完成加入群集并且已经为其分配了令牌范围,就始终考虑CL保证和复制。只有在nodetool decommission运行时才从集群中删除它。

假设您有一个复制因子= 2的4节点集群。这意味着无论有多少节点向上或向下,集群的所有成员都知道每个数据块应该有2个副本。如果您在2个节点关闭时执行查询并且您的一致性级别为ALL,则如果其中任何一个节点负责您尝试写入或读取的信息的副本,则该查询将失败。


实施例

给定一个4节点集群,其职责如下

Node 1 { A, D }
Node 2 { B, A }
Node 3 { C, B }
Node 4 { D, C }

节点3& 4下来

给定一致性等级

Select * where partition key hashes to range A 

这将通过,因为节点1和2是唯一负责A数据的节点,它们是  两个都

Select * where partition key hashes to range B

这将失败,因为负责B的2个已知节点中只有1个启动(节点2向上但节点3已关闭)

答案 1 :(得分:1)

节点数量不是决定因素。复制因子起着更大的作用。即使这样,它也不是直截了当的:

假设复制因子为3,并且您已指定Quorum(或ALL ...)。处理请求的节点是请求的协调器。让我们假设请求是写入。

希望有所帮助。

答案 2 :(得分:0)

  

如果4个节点中有1个离线,当使用ConsistentyLevel.ALL执行写操作时,它会失败吗?   还是考虑到了“可达性”? (即,如果节点离线,则有效簇大小为3而不是4)。

是的,它会失败。 Cassandra具有可调整的一致性,但您的交易分区容差。使用CL.ALL时,您无法处理任何节点故障。您应该尽可能使用CL.ONE并在需要数据一致但仍希望能够处理某些节点故障时使用CL.QUORUM进行读/写(假设您应该运行复制因子> = 3) )。在极少数情况下应该使用ALL。