维护datastax中的动态一致性级别

时间:2015-01-01 02:46:43

标签: cassandra high-availability datastax consistency

我有一个5节点集群和密钥空间,复制因子为3.操作的性质使得写入比读取更重要,但读取操作的频率比写入高出约10倍。为了在提高整体性能的同时实现一致性,我选择将写入的一致性级别设置为ALL,将ONE设置为读取。但即使一个节点关闭,这也会导致操作失败。

是否有一种方法可以同时将(写入,读取)的一致性级别从(ALL,ONE)更改为(QUORUM,QUORUM),如果检测到一个节点,或者是否存在查询执行异常;另外,这样做的方式是没有操作通过临时阶段,它会看到临时(QUORUM,ONE)设置。

我们还计划扩展到两倍的容量,3个数据中心,每个节点有4个节点。是否可以定义自定义一致性级别,例如,(任何一个数据中心的ALL级别和其他数据中心的ONE级别)。我认为读取的级别(EACH_ONE)与上面的写入级别相结合将确保一致性,但即使节点出现故障,群集仍然可用。

1 个答案:

答案 0 :(得分:3)

由于您可以根据请求设置一致性级别,因此具有灵活性。根据您使用的客户端,有一些不错的功能。例如,java driver有一个称为DowngradingConsistencyRetryPolicy的东西,如果请求失败,它将以下一个最低一致性级别重试,直到请求成功为止。这推动了重试进入客户端的复杂性,因此您不必为此编写一堆代码,这真的很棒!

java驱动程序还允许您使用Statement#setConsistencyLevel()

为每个请求配置一致性级别

就自定义一致性级别而言,这不是您可以使用的选项(不更改cassandra源代码),但我认为提供的内容应该足够了。

对于读取,我在确保读取数据中心之间的一致性方面没有多大价值。我认为LOCAL_QUORUM已经绰绰有余了,但是如果您真的关心,可以使用类似EACH_QUORUM的东西来确保所有数据中心都同意,但这会严重影响您的响应时间和可用性。例如,如果您的某个数据中心完全关闭,则您根本无法进行读取(除非降级)。

对于写入,如果您关心响应时间和可用性,我强烈建议您不要在多数据中心设置中使用ALL。根据您的要求,LOCAL_QUORUM可能绰绰有余。

虽然Cassandra的一个好处是一致性是可调的,但您可以拥有尽可能多的强一致性,但请记住,Cassandra最适合作为高度可用的分区容忍系统。

关于一致性的一个非常好的演示,我认为真正指出了很多这些要点是Christos Kalazantis' talk 'Eventual Consistency != Hopeful Consistency'表明ONE的一致性水平足以满足很多用例。