cassandra - 如果 Cassandra 数据库中的节点在将数据传输到客户端时发生故障,会发生什么情况?

标签 cassandra scylla

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

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

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

在这两种情况下,作为程序员,我们是否必须显式编写任何条件来告诉 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/

相关文章:

scala - 在 Cassandra 上运行的 Spark 由于 ClassNotFoundException : com. datastax.spark.connector.rdd.partitioner.CassandraPartition 而失败(详情见内部)

cassandra - 出现此错误无法启动 cassandra

Cassandra - 不同表中的相同分区键 - 何时正确?

python - 是否可以使用 ScyllaDB for python 更有效地添加数据?

cassandra - 如果我将 RF 从 5 个减少到 3 个,然后停用 5 个节点中的 2 个,会发生什么情况?

cassandra - Cassandra 快照中 manifest.json 的用途是什么?

java - 如何将xml文件中的数据直接导入cassandra

cassandra - 在 Cassandra 中存储数组

Cassandra 顺序修复不会在一次运行中修复所有节点?

cassandra - scylla 读取路径和 cassandra 读取路径有什么区别?