Cassandra 集群中的 DC 对 Consistency ONE 的影响
Impact of DC in Cassandra Cluster for Consistency ONE
我正在学习 Cassandra 架构并且已经在虚拟机中设置了一个 Cassandra 集群,如下所示:
Node_1 -> DC_1 -> Rack1 -> rf = 1
Node_2 and Node_3 -> DC_2 -> Rack1 -> rf = 1
对于一致性级别一:
- 当 Node_1 和 Node_3 关闭时,select 查询在 Node_2 上失败(来自 Cassandra 控制台的警告:无法设置一致性;来自 cqlsh 的错误:NoHostAvailable)
- 当 Node_1 和 Node_2 关闭时,select 查询在 Node_3 上失败(来自 Cassandra 控制台的警告:无法设置一致性;来自 cqlsh 的错误:NoHostAvailable)
- 但是当 Node_2 和 Node_3 关闭时,然后 select 查询 通过 on Node_1(来自 Cassandra 控制台的警告:无法设置一致性一;来自 cqlsh 的错误:无错误,显示table 数据)
也注意到写入的相同行为。
此行为是否与位于相同或不同 DC 中的节点有关?请解释这种不匹配的原因。
NoHostAvailable
当带有数据的副本未启动并且集群无法响应请求的数据时出现。在您的情况下,您正在每个数据中心(DC_1 和 DC_2)上编写一个副本。因此,当您关闭以下组合 Node_1 (DC_1) and Node_2(DC_2) nodes
或 Node_1 (DC_1) and Node_3(DC_2) nodes
时,您可能没有从活动节点获取所有请求的数据。
在 Node_1 up 的情况下,您确定将检索所有数据,因为 DC_1 始终包含 1 个数据副本,并且 Node_1 是该数据中心中的唯一节点。因此你得到了请求的数据。
我一直在做 select *
查询,当节点 1,3/2 关闭时,节点 2/3 总是失败,正如 Manish 在接受的答案中正确指出的那样失败,因为节点 1 总是有完整的数据,而节点 2 和 3 有部分数据。
但是当我这样做时 select * from <table> where partition_key=<key on node 2>
,(其他 2 个节点已关闭)它给了我一致的结果,因为这次 node2 拥有请求的分区。
我正在学习 Cassandra 架构并且已经在虚拟机中设置了一个 Cassandra 集群,如下所示:
Node_1 -> DC_1 -> Rack1 -> rf = 1
Node_2 and Node_3 -> DC_2 -> Rack1 -> rf = 1
对于一致性级别一:
- 当 Node_1 和 Node_3 关闭时,select 查询在 Node_2 上失败(来自 Cassandra 控制台的警告:无法设置一致性;来自 cqlsh 的错误:NoHostAvailable)
- 当 Node_1 和 Node_2 关闭时,select 查询在 Node_3 上失败(来自 Cassandra 控制台的警告:无法设置一致性;来自 cqlsh 的错误:NoHostAvailable)
- 但是当 Node_2 和 Node_3 关闭时,然后 select 查询 通过 on Node_1(来自 Cassandra 控制台的警告:无法设置一致性一;来自 cqlsh 的错误:无错误,显示table 数据)
也注意到写入的相同行为。
此行为是否与位于相同或不同 DC 中的节点有关?请解释这种不匹配的原因。
NoHostAvailable
当带有数据的副本未启动并且集群无法响应请求的数据时出现。在您的情况下,您正在每个数据中心(DC_1 和 DC_2)上编写一个副本。因此,当您关闭以下组合 Node_1 (DC_1) and Node_2(DC_2) nodes
或 Node_1 (DC_1) and Node_3(DC_2) nodes
时,您可能没有从活动节点获取所有请求的数据。
在 Node_1 up 的情况下,您确定将检索所有数据,因为 DC_1 始终包含 1 个数据副本,并且 Node_1 是该数据中心中的唯一节点。因此你得到了请求的数据。
我一直在做 select *
查询,当节点 1,3/2 关闭时,节点 2/3 总是失败,正如 Manish 在接受的答案中正确指出的那样失败,因为节点 1 总是有完整的数据,而节点 2 和 3 有部分数据。
但是当我这样做时 select * from <table> where partition_key=<key on node 2>
,(其他 2 个节点已关闭)它给了我一致的结果,因为这次 node2 拥有请求的分区。