了解cassandra复制因子与一致性级别

了解cassandra复制因子与一致性级别,cassandra,Cassandra,我想澄清Cassandra中复制因子和一致性级别的基本概念。如果有人能回答以下问题,我们将不胜感激 射频复制因子 RC-读取一致性 WC-写一致性 2个cassandra节点(例如:A、B)RF=1、RC=1、WC=1或任意 我可以将数据写入节点A并从节点B读取吗 如果A下降会发生什么 3个cassandra节点(例如:A、B、C)RF=2,RC=QUORUM,WC=QUORUM 我可以将数据写入节点A并从节点C读取吗 如果节点A发生故障,会发生什么情况 3个cassandra节点(例如

我想澄清Cassandra中复制因子和一致性级别的基本概念。如果有人能回答以下问题,我们将不胜感激

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

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

  • 我可以将数据写入节点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发生故障,会发生什么情况

简短摘要:复制因子描述数据存在的拷贝数。一致性级别描述客户端看到的行为。也许有更好的分类方法


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

现在,假设在这个例子中,您编写的一致性级别为1。客户端将在对一个节点进行写入后收到成功确认,而无需等待第二次写入。如果您写了一封CL为ALL的信,那么对客户的确认将一直等到两份副本都写完。还有很多其他一致性级别选项,太多了,无法涵盖这里的所有变体。尽管如此,阅读这篇文章还是能很好地解释它们

在同一示例中,如果以一致性级别1进行读取,则在单个副本响应后,将向客户端发送响应。另一个复制副本可能有较新的数据,在这种情况下,响应将不是最新的。在许多情况下,这已经足够了。在其他情况下,客户机将需要最新的信息,您将在读取时使用不同的一致性级别—可能是所有级别。通过这种方式,Cassandra和其他后关系数据库的一致性可以以关系数据库通常不具备的方式进行调整

现在回到你们的例子

示例一:是的,您可以向A写入数据并从B读取数据,即使B没有自己的副本。B将代表你的客户向A索要。对于节点都已启动的其他情况也是如此。当他们都准备好了,你可以给他们写信,也可以从他们那里阅读

对于写入,在WC=1的情况下,如果单个副本的节点已启动并且是您连接到的节点,则写入将成功。如果是针对另一个节点,写入将失败。如果您使用了ANY,那么写入将成功,前提是您正在与启动的节点通信。我认为您还必须为此启用了提示切换。下行节点稍后将获取数据,在此之后,您将无法读取数据,即使是从上行节点也是如此


在另外两个示例中,复制因子将影响最终写入的拷贝数,但不会影响客户机行为,超出了我上面所述的范围。仲裁将影响客户端行为,因为必须有足够数量的节点启动并响应写入和读取操作。如果幸运的话,至少(nodes/2)+1个节点超出了所需的节点,那么写入和读取将成功。如果没有足够多的节点来启动副本,则读写操作将失败。总的来说,如果某个节点停机,假设该节点不需要存储您的副本,或者该节点停机后仍有足够的副本节点可用,则某些仲裁读写操作可能会成功。

请查看这个简单的计算器,它允许您模拟不同的场景:

例如,对于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.

“例如,您可以将复制系数设为2。写入时,将始终存储两个副本”-这意味着将存储三个数据“实例”(一个“原始”和两个“副本”),还是两个?我想我要问的是,复制工厂是基于0还是基于1?复制因子为2意味着总共将存储2个实例。解释得很好-谢谢you@Jaydatt-谢谢。:)这是Datastax文档链接:答案中链接的那一个不再起作用。这两个类似问题的其他答案比下面的答案要好。IMO:即使节点数很高,这个答案也真的很糟糕-例如10,如果RF=1,WC=1,RC=1。为什么读数高度一致。当WC=1时,假设节点1被写入,然后如果节点1关闭,RC为1,则从另一个节点读取的内容不会返回写入的内容?因为复制因子为1,因此,只有一个数据副本。因此,如果包含数据的节点宕机,我们将无法获取数据(这并不意味着我们将获得错误的数据)。请记住,如果R+W>RF(R->读取一致性,W->写入一致性,RF是复制因子),则可以确保强一致性。在你的情况下,R+W=2>1(RF)。因此,这是一个强一致性的情况。但正如您所指出的,在某些情况下,可用性会受到影响。@bcattle如果复制因子为1,这意味着数据的单个副本,它将如何与1的读取一致性(RC)保持一致?如果RC为1,WC为1,则表示可以从没有最新数据副本的其他节点读取数据。不是吗?