Cassandra是如何知道它已经完成法定人数的?

q8l4jmvw  于 2023-01-17  发布在  Cassandra
关注(0)|答案(2)|浏览(141)

我一直在spark应用中使用Cassandra,但我从来没有想过它内部是如何工作的。阅读Cassandra文档时,我有一个小小的疑问(可能是初学者的疑问)。我在一本书(Cassandra权威指南)和官方的Cassandra文档中读到公式是:(RF / 2)+1。
因此,理论上讲,如果我有一个包含6个节点的集群,复制因子为3,我只需要来自2个节点的响应。
这里有一些小小的疑问:1 -此响应是什么?(查询返回数据?)2 -如果查询中使用的筛选器没有数据,则空返回是否视为响应?3 -最后但并非最不重要的是,如果空返回视为响应,则如果完成QUORUM的这两个节点还没有副本数据,执行SELECT的应用程序将理解数据库中不存在这些数据,对吗?

a2mppw5e

a2mppw5e1#

  • 1 -此响应是什么?(查询返回数据?)*

协调器节点将等待3个副本的2个副本(因为CL=QUORUM)响应查询(带有请求结果),然后将响应发送到客户端。

  • 2 -如果查询中使用的筛选器没有数据,则空返回是否视为响应?*

是的,空响应就足够了,并将被视为有效响应。请注意,存在一种机制,即在发生冲突时使用last-write-wins(基于行写入时间)。

  • 3 -最后但并非最不重要的一点是,如果空返回被视为响应,那么如果完成QUORUM的这两个节点还没有副本数据,执行SELECT的应用程序将理解此数据不存在于数据库中,对吗?*

您必须了解Apache Cassandra使用最终一致性,这意味着客户端将决定所需的CL。如果您有很强的一致性,这意味着您有一个写CL和读CL的重叠(写CL +读CL〉RF),那么将总是检索最后的数据。我建议您观看这个视频:https://www.youtube.com/watch?v=Gx-pmH-b5mI

3vpjnl9f

3vpjnl9f2#

基本上,如果您在LOCAL_QUORUM阅读数据并且RF为3,协调器可能会接受来自两个不一致副本的响应,而忽略具有一致数据的第三个副本。
这是Cassandra被认为是最终一致的数据库的原因之一,也是定期修复数据对生产数据库如此重要的原因。当然,如果一致性比其他一切都重要,您可以始终使用CL ALL进行读取,但您会牺牲一定量的响应时间作为代价。假设数据库配置良好,虽然这肯定是可能的。只有一个副本接收到传入的写操作是不太可能的,除非您养成了只在CL为ONE/LOCAL_ONE时进行写操作的习惯。如果一致性很重要,您应该使用至少为LOCAL_QUORUM的CL写入数据库,以避免这种情况。
要尝试直接回答您的问题,请回答是,没有数据可返回可能是有效的回答,如果协调员选择的两个副本都同意没有数据可返回,则应用程序将报告该结果。

相关问题