如果 Cassandra 数据库中的节点在向客户端传输数据时出现故障,会发生什么情况?
What happens if a node in Cassandra database fails while transferring data to client?
假设我们有一个包含 6 个节点且 RF=3 的 Cassandra 集群。因此,如果我们查询从特定节点提取数据,并且在处理或传输数据时节点失败。以下情况的可能结果是什么?
假设它从磁盘处理所需的数据并且节点在此过程中死亡,协调器(收到我们请求的节点)会重新发送请求到复制节点之一还是只是return 客户端出错?
假设节点在传输数据时挂掉了。那么协调器return会不会部分数据呢?或者协调器会意识到信息不完整并重新将请求发送到不同的节点(副本)?
在任何一种情况下,作为程序员,我们是否必须显式编写任何条件以告知 Cassandra 服务器,还是全部由内部处理?
提前致谢。
P.S: 不好意思之前有人问过类似的问题。我确实尝试搜索,但找不到。
在 Cassandra 中需要理解的最重要的概念之一是它的变量 "Consistency Level",或 CL。也许最常见的设置是 CL=QUORUM,这意味着 RF=3(每条数据在 3 个节点上复制),Cassandra 将需要 two 两个副本在返回之前成功响应结果给客户。
在对特定分区的请求中,协调器首先将客户端的请求发送到已知持有该分区的 3 个副本中的 2 个。 Cassandra 保留对平均响应延迟的估计,当这个估计已经过去时,它会向第三个副本发送第三个请求。在您提到的情况下会发生这种超时 - 如果响应没有快速完成(部分完成无关紧要),则会发送第三个请求。除非两个节点同时宕机,否则你会得到完整的响应,客户端不需要处理任何事情。这是 Cassandra 和其他 NoSQL 数据库著名的 "high availability" 特性。
请注意,即使对于非常长的响应(扫描整个 table 或获取非常长的分区),此答案也是正确的。如此长的响应被分解为 "pages" 的合理长度,每个页面都在一个单独的请求中获取,并且可以来自 3 个副本中的 2 个,不一定是相同的。
我上面写的所有内容也适用于 Scylla 和 Cassandra。
假设我们有一个包含 6 个节点且 RF=3 的 Cassandra 集群。因此,如果我们查询从特定节点提取数据,并且在处理或传输数据时节点失败。以下情况的可能结果是什么?
假设它从磁盘处理所需的数据并且节点在此过程中死亡,协调器(收到我们请求的节点)会重新发送请求到复制节点之一还是只是return 客户端出错?
假设节点在传输数据时挂掉了。那么协调器return会不会部分数据呢?或者协调器会意识到信息不完整并重新将请求发送到不同的节点(副本)?
在任何一种情况下,作为程序员,我们是否必须显式编写任何条件以告知 Cassandra 服务器,还是全部由内部处理?
提前致谢。
P.S: 不好意思之前有人问过类似的问题。我确实尝试搜索,但找不到。
在 Cassandra 中需要理解的最重要的概念之一是它的变量 "Consistency Level",或 CL。也许最常见的设置是 CL=QUORUM,这意味着 RF=3(每条数据在 3 个节点上复制),Cassandra 将需要 two 两个副本在返回之前成功响应结果给客户。
在对特定分区的请求中,协调器首先将客户端的请求发送到已知持有该分区的 3 个副本中的 2 个。 Cassandra 保留对平均响应延迟的估计,当这个估计已经过去时,它会向第三个副本发送第三个请求。在您提到的情况下会发生这种超时 - 如果响应没有快速完成(部分完成无关紧要),则会发送第三个请求。除非两个节点同时宕机,否则你会得到完整的响应,客户端不需要处理任何事情。这是 Cassandra 和其他 NoSQL 数据库著名的 "high availability" 特性。
请注意,即使对于非常长的响应(扫描整个 table 或获取非常长的分区),此答案也是正确的。如此长的响应被分解为 "pages" 的合理长度,每个页面都在一个单独的请求中获取,并且可以来自 3 个副本中的 2 个,不一定是相同的。
我上面写的所有内容也适用于 Scylla 和 Cassandra。