假设我们有一个包含 6 个节点的 Cassandra 集群,RF=3。因此,如果我们查询从特定节点提取数据,并且在处理或传输数据时该节点会失败。以下场景可能出现什么结果?
假设它正在处理磁盘上所需的数据,并且节点在此过程中死亡,协调器(收到我们请求的节点)是否会将请求重新发送到复制节点之一,或者只是返回一个错误客户?
假设节点在传输数据时死亡。那么协调器会返回部分数据吗?或者协调器会意识到信息不完整并将请求重新发送到不同的节点(副本)吗?
在这两种情况下,作为程序员,我们是否必须显式编写任何条件来告诉 Cassandra 服务器,还是全部在内部处理?
提前致谢。
P.S:如果之前有人问过类似的问题,我很抱歉。我确实尝试过搜索,但找不到。
最佳答案
在 Cassandra 中需要理解的最重要的概念之一是其变量“一致性级别”或 CL。也许最常见的设置是 CL=QUORUM,这意味着 RF=3(每条数据在 3 个节点上复制)时,Cassandra 将需要来自两个副本的两次成功响应,然后才能将结果返回到客户端。
在对特定分区的请求中,协调器首先将客户端的请求发送到已知保存该分区的 3 个副本中的 2 个。 Cassandra 保留平均响应延迟的估计,当该估计超过时,它会向第三个副本发送第三个请求。在您提到的情况下会发生这种超时 - 如果响应没有快速完成(如果部分完成也没关系),则会发送第三个请求。除非两个节点同时关闭,否则您将得到完整的响应,并且客户端不需要处理任何事情。这就是 Cassandra 和其他 NoSQL 数据库闻名的“高可用性”特性。
请注意,即使对于非常长的响应(扫描整个表或获取非常长的分区),这个答案也是正确的。如此长的响应被分解为合理长度的“页面”,每个页面都在单独的请求中获取,并且可以来自 3 个副本中的 2 个,不一定是同一个。
我上面写的所有内容也适用于 Scylla 和 Cassandra。
关于cassandra - 如果 Cassandra 数据库中的节点在将数据传输到客户端时发生故障,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50332400/