【问题标题】:Understand cassandra replication factor versus consistency level了解 cassandra 复制因子与一致性级别
【发布时间】:2014-08-26 14:15:40
【问题描述】:

我想澄清 Cassandra 中复制因子和一致性级别的非常基本的概念。非常感谢有人能回答以下问题。

RF- 复制因子 RC-读取一致性 WC- 写一致性

2 个 cassandra 节点(例如:A、B)RF=1、RC=ONE、WC=ONE 或 ANY

  • 我可以将数据写入节点 A 并从节点 B 读取吗?
  • 如果 A 出现故障会怎样?

3 个 cassandra 节点(例如:A、B、C)RF=2,RC=QUORUM,WC=QUORUM

  • 我可以将数据写入节点 A 并从节点 C 读取吗?
  • 如果节点 A 宕机会发生什么?

3 个 cassandra 节点(例如:A、B、C)RF=3,RC=QUORUM,WC=QUORUM

  • 我可以将数据写入节点 A 并从节点 C 读取吗?
  • 如果节点 A 宕机会发生什么?

【问题讨论】:

标签: cassandra


【解决方案1】:

简短摘要:复制因子描述了您的数据存在多少副本。一致性级别描述了客户端看到的行为。也许有更好的方法来对这些进行分类。

例如,您可以将复制因子设置为 2。当您写入时,将始终存储两个副本,假设有足够的节点启动。当一个节点关闭时,该节点的写入将被隐藏起来,并在它恢复时写入,除非它关闭的时间足够长以至于 Cassandra 认为它已经永远消失了。

现在说在那个例子中你写的一致性级别是 ONE。客户端将在对一个节点完成写入后收到成功确认,而无需等待第二次写入。如果您使用 ALL 的 CL 进行写入,则对客户端的确认将等到两个副本都被写入。还有很多其他的一致性级别选项,太多了,无法涵盖这里的所有变体。不过,请阅读Datastax doc,它很好地解释了它们。

在同一个例子中,如果你读取的一致性级别为 ONE,则响应将在单个副本响应后发送给客户端。另一个副本可能有更新的数据,在这种情况下,响应将不是最新的。在许多情况下,这已经足够了。在其他情况下,客户端将需要最新信息,并且您将在读取时使用不同的一致性级别 - 可能是 ALL 级别。这样一来,Cassandra 和其他后关系数据库的一致性就可以以关系数据库通常不具备的方式进行调整。

现在回到你的例子。

示例一:是的,您可以写入 A 并从 B 读取,即使 B 没有自己的副本。 B 将代表您的客户向 A 索要。对于节点全部启动的其他情况也是如此。当它们都启动时,您可以写入其中一个并从另一个读取。

对于写入,当 WC=ONE 时,如果单个副本的节点已启动并且是您要连接的节点,则写入将成功。如果是其他节点,写入会失败。如果您使用 ANY,则写入将成功,假设您正在与启动的节点通信。我认为您还必须为此启用提示切换。 down 节点稍后会获取数据,直到在那之后你才能读取它,即使是从 up 节点也不行。

在其他两个示例中,复制因子将影响最终写入的副本数量,但不会影响超出我上面描述的客户端行为。 QUORUM 将影响客户端行为,因为您必须有足够数量的节点启动并响应写入和读取。如果您很幸运并且至少 (nodes/2) + 1 个节点超出了您需要的节点,那么写入和读取将成功。如果您没有足够的节点来启动副本,则读取和写入将失败。总体而言,如果某个节点关闭,则一些 QUORUM 读取和写入可以成功,假设该节点不需要存储您的副本,或者如果它的中断仍然有足够的副本节点可用。

【讨论】:

  • “例如,您可以有一个复制因子 2。当您写入时,将始终存储两个副本” - 意味着将存储三个数据的“实例”(一个“原始'和两个'副本'),还是两个?我想我要问的是,复制工厂是基于 0 还是基于 1?
  • 复制因子为 2 表示总共将存储 2 个实例。
  • 解释得很好 - 谢谢
  • @Jaydatt - 谢谢。 :)
  • 这里是 Datastax 文档链接:docs.datastax.com/en/archived/cassandra/2.0/cassandra/dml/… 答案中链接的那个不再有效。
【解决方案2】:

看看这个简单的计算器,它可以让你模拟不同的场景:

http://www.ecyrd.com/cassandracalculator/

例如有 2 个节点,复制因子为 1,读一致性 = 1,写一致性 = 1:

Your reads are consistent 
You can survive the loss of no nodes. 
You are really reading from 1 node every time. 
You are really writing to 1 node every time. 
Each node holds 50% of your data.

【讨论】:

  • 这个答案真的太棒了
  • 即使节点数很高 - 例如 10,如果 RF =1 和 WC =1 和 RC =1。为什么读取高度一致。 WC =1,假设节点1被写入,然后如果节点1宕机,RC为1,从另一个节点读取将不会返回写入的内容?
  • 由于复制因子为 1,因此,只有 1 个数据副本。因此,如果包含数据的节点出现故障,我们将无法获取数据(这并不意味着我们会得到错误的数据)。永远记住,如果 R+W>RF(R->读取一致性,W->写入一致性,RF 是复制因子),则可以确保强一致性。在您的情况下,R+W=2>1(RF)。因此,这是一个强一致性的案例。但正如您所指出的,在某些情况下可用性会受到影响。
  • @bcattle 如果复制因子为 1,这意味着数据的单个副本,它将如何与 1 的读取一致性(RC)保持一致?如果 RC 为 1 且 WC 为 1,则表示可以从没有最新数据副本的其他节点读取数据。不是吗?
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 2015-09-25
  • 2018-12-24
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2018-06-13
相关资源
最近更新 更多