如果Cassandra数据库中的节点在将数据传输到客户端时失败会发生什么?

时间:2018-05-14 14:08:38

标签: cassandra scylla

我们假设我们有一个6节点的Cassandra集群,RF = 3。因此,如果我们查询从特定节点提取数据并在处理或传输数据时节点失败。以下情景的可能结果是什么?

  1. 让我们说它从磁盘处理所需的数据,并且节点在进程中死亡,协调器(收到我们请求的节点)会将请求重新发送到其中一个复制节点,还是仅返回错误客户端?

  2. 让我们说节点在传输数据时就已经死了。那么协调员会返回部分数据吗?或协调员是否意识到信息不完整并将请求重新发送到不同的节点(副本)?

  3. 在任何一种情况下,作为一名程序员,我们必须明确地编写任何条件来告诉Cassandra服务器,或者它是否都在内部处理?

    提前致谢。

    P.S:如果之前有过类似的问题,我很抱歉。我确实尝试过搜索,但我找不到它。

1 个答案:

答案 0 :(得分:4)

在Cassandra中要理解的最重要的概念之一是它的变量" Consistency Level"或CL。也许最常见的设置是CL = QUORUM,这意味着当RF = 3(每个数据在3个节点上复制)时,Cassandra将需要两个来自两个副本的成功响应,然后将结果返回到客户。

在对特定分区的请求中,协调器将通过将客户端的请求发送到已知拥有该分区的3个副本中的2个来开始。 Cassandra保持对平均响应延迟的估计,并且当该估计已经过去时,它向第三个副本发送第三个请求。在您提到的情况下会发生这种超时 - 如果响应没有快速完成(如果部分完成则无关紧要),则发送第三个请求。除非两个节点同时关闭,否则您将得到完整的响应,客户端不需要处理任何事情。这是"高可用性" Cassandra和其他NoSQL数据库的着名特征。

请注意,即使是非常长的响应(扫描整个表或获取一个非常长的分区),这个答案也是如此。如此长的回应被分解为"页面"在合理的长度中,每个页面都在一个单独的请求中获取,并且可以来自3个副本中的2个,不一定是同一个。

我上面写的所有内容也适用于Scylla以及Cassandra。

相关问题