【问题标题】:If lower consistency level is good then why we need to have a higher consistency(QUORUM,ALL) level in Cassandra?如果较低的一致性级别很好,那么为什么我们需要在 Cassandra 中具有较高的一致性(QUORUM,ALL)级别?
【发布时间】:2018-03-20 03:10:15
【问题描述】:

在阅读 Datastax 教程时,我了解到 1)较低的一致性级别读取和写入更快,而如果我们使用较高的一致性级别,则读取和写入的时间要长得多 2) 较低的一致性级别也保证了数据的高可用性。

我的问题是 如果较低的 CL 是好的,那么我们总是可以将 CL 设置为 ONE, 为什么我们需要 QUORUM 和 ALL 一致性级别?

【问题讨论】:

  • 低一致性并不能保证数据的高可用,它保证了集群的高可用。例如,如果您的复制因子为 3,那么在一致性级别为 1 的情况下,您可能会丢失 2 个副本并仍然留在游戏中。如果您从客户端的角度需要高一致性,同时容忍可用性问题,您应该使用 Quorum。如果您始终按 quorum 读写,您将克服 cassandra 的最终一致性(== 不保证一致性)。
  • 如果锤子好,我为什么需要锯子?这一切都是为了使用正确的工具来完成工作。或者,正如我们的英国朋友如此富有诗意地表述的那样,“课程用马”。

标签: cassandra


【解决方案1】:

这最终取决于使用 Cassandra 的应用程序。如果应用程序可以提供可能复制不足或稍微陈旧的数据,那么LOCAL_ONE 应该没问题。如果应用程序绝对不能提供错误的答案,或者写入的行没有被一致地成功读取,那么LOCAL_QUORUM 可能更适用。

我告诉我的应用程序团队同样的事情。从LOCAL_ONE 开始,并通过测试使用它。如果您没有任何问题,请继续使用它。如果您确实遇到过旧数据,并且您的应用程序对读取更加敏感,请尝试编写LOCAL_QUORUM 并继续阅读LOCAL_ONE。如果这没有帮助,那么也许应用程序可能需要QUORUM.

同样,这就是应用程序团队需要进行彻底测试的原因。

为了解决这个问题,ALL 是一个有用的一致性级别,因为它会调用读取修复。本质上,如果您知道有一个表缺少数据,并且您不想在其上运行昂贵的nodetool repair,您可以将一致性设置为ALL 并从中读取。我发现这个技巧在解决system_auth 问题的多 DC 集群问题时最有用。

但您可能不想在应用程序中使用ALL。或者,如果您这样做了,那将是针对非常具体的边缘情况。

【讨论】:

    【解决方案2】:

    像 Cassandra 这样的数据库真正的核心是“最终一致性”:当您第一次将数据写入数据库时​​,它不会强制执行强一致性。相反,它使您可以选择选择较弱的一致性级别(例如“one”)以达到较高的写入性能,然后在稍后查询数据时,只要此规则“Read_Consistency_level + Write_consistency_level >= RF 策略(复制因子)" 满足,你不会有过时的数据。

    如果您无法满足上述规则,则存在风险,因为您可能会获得陈旧或相互矛盾的(有时是新的,有时是旧的)数据。

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2015-09-25
      相关资源
      最近更新 更多