2

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

  1. 假设它处理来自磁盘的所需数据并且节点在此过程中死亡,协调器(接收我们请求的节点)会将请求重新发送到复制节点之一还是只是向客户端返回错误?

  2. 假设节点在传输数据时死亡。那么协调器会返回部分数据吗?还是协调器会意识到信息不完整并重新将请求发送到不同的节点(副本)?

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

提前致谢。

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

4

1 回答 1

4

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

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

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

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

于 2018-05-14T15:20:23.690 回答