我想澄清一下Cassandra中复制因子和一致性级别的基本概念。非常感谢有人能为以下问题提供答案。
RF-复制因子 RC-读一致性 WC-写入一致性
2个cassandra节点(例如:A,B)RF = 1,RC = ONE,WC = ONE或ANY
3个cassandra节点(例如:A,B,C)RF = 2,RC = QUORUM,WC = QUORUM
3个cassandra节点(例如:A,B,C)RF = 3,RC = QUORUM,WC = QUORUM
答案 0 :(得分:94)
简短摘要:复制因子描述了存在多少份数据副本。一致性级别描述客户端看到的行为。也许有更好的方法对这些进行分类。
例如,您可以将复制因子设置为2.编写时,假设有足够的节点,则始终会存储两个副本。当一个节点关闭时,该节点的写入被隐藏起来并在它重新启动时写入,除非它足够长,以至于Cassandra认为它已经消失了。
现在说在那个例子中你用一致性等级写作。在对一个节点进行写入之后,客户端将收到成功确认,而不等待第二次写入。如果您使用CL为ALL进行写入,则对客户端的确认将等待,直到写入两个副本。还有很多其他一致性级别选项,这些选项太多而无法覆盖所有变体。但请阅读Datastax doc,它可以很好地解释它们。
在同一示例中,如果您使用一致性级别ONE读取,则响应将在单个副本响应后发送到客户端。另一个副本可能有更新的数据,在这种情况下,响应将不是最新的。在许多情况下,这已经足够了。在其他情况下,客户端将需要最新的信息,并且您将在读取时使用不同的一致性级别 - 也许是级别ALL。通过这种方式,Cassandra和其他后关系数据库的一致性可以通过关系数据库通常不可调整的方式进行调整。
现在回到你的例子。
示例一:是的,您可以写入A并从B读取,即使B没有自己的副本。 B将代表您的客户向A询问。对于节点全部启动的其他情况也是如此。当它们全部结束时,你可以写一个并从另一个读取。
对于写入,如果WC = ONE,如果单个副本的节点已启动并且是您要连接的节点,则写入将成功。如果是另一个节点,写入将失败。如果您使用ANY,则写入将成功,假设您正在与正在进行的节点通信。我想你也必须为此启用暗示切换。 down节点将在稍后获取数据,并且在此之后您将无法读取数据,甚至不会从该节点开始读取。
在另外两个示例中,复制因素将影响最终写入的副本数,但不会影响客户端行为,超出上述描述。 QUORUM将影响客户端行为,因为您必须拥有足够数量的节点并响应写入和读取。如果你运气好,并且至少(nodes / 2)+ 1个节点在你需要的节点之外,那么写入和读取将成功。如果没有足够的节点包含副本,则读取和写入将失败。总的来说,如果某个节点出现故障,一些QUORUM读写操作就会成功,假设该节点不需要存储您的副本,或者它的中断仍然有足够的副本节点可用。
答案 1 :(得分:44)
查看这个简单的计算器,它可以模拟不同的场景:
http://www.ecyrd.com/cassandracalculator/
例如,有2个节点,复制因子为1,读取一致性= 1,写入一致性= 1:
public class MainActivity extends AppCompatActivity {
答案 2 :(得分:-1)
这个webform允许您为Apache Cassandra集群尝试不同的值,看看对您的应用程序有何影响。