我有一个复制因子为3的5节点集群和密钥空间。操作的本质是写入比读取重要得多,但读取操作的频率大约是写入的10倍。为了在提高整体性能的同时实现一致性,我选择将写入的一致性级别设置为ALL,将读取的一致性级别设置为1。但这会导致即使有一个节点出现故障,操作也会失败。
我们还计划扩展到容量的两倍,3个数据中心,每个数据中心有4个节点。是否可以定义自定义一致性级别,例如(在任何一个数据中心中定义一个级别,在其他数据中心中定义一个级别)。我认为,读的级别(EACH_ONE),再加上写的级别以上,将确保一致性,但即使节点宕机,集群也可以保持可用。
发布于 2015-01-01 11:41:20
灵活性是存在的,因为您可以在每个请求的基础上设置一致性级别。根据您使用的客户端,有一些不错的功能。例如,java driver有一个称为DowngradingConsistencyRetryPolicy的东西,如果请求失败,将使用下一个最低的一致性级别进行重试,直到请求成功。这将重试的复杂性推到了客户端,这样你就不必为它写一堆代码了,这真的很好!
java驱动程序还允许您使用Statement#setConsistencyLevel()配置每个请求的一致性级别
对于读取,我没有发现在读取时确保数据中心之间的一致性有多大价值。我认为LOCAL_QUORUM已经足够了,但是如果你真的关心,你可以使用像EACH_QUORUM这样的东西来确保所有数据中心都同意,但这将严重影响你的响应时间和可用性。例如,如果您的一个数据中心完全崩溃,您将无法进行读取(除非降级)。
对于写入,如果您关心响应时间和可用性,我强烈建议不要在多数据中心设置中使用ALL。根据您的需求,LOCAL_QUORUM可能已经足够了。
虽然Cassandra的好处之一是一致性是可调的,但您可以随心所欲地获得更强的一致性,但请记住,Cassandra作为一个高可用性、分区容错系统处于最佳状态。
Christos Kalazantis的talk 'Eventual Consistency != Hopeful Consistency'是关于一致性的一个非常好的演示,我认为它确实解决了这些问题,它建议一致性级别为1就足以满足许多用例。
https://stackoverflow.com/questions/27727952
复制相似问题