如果配置Cassandra永远不执行gc并且所有读取和写入都是仲裁,那么是否必须修复nodetool?

时间:2014-10-23 22:50:38

标签: cassandra

这是关于nodetool修复和垃圾收集的两部分问题。

让我们考虑所有表的复制因子为3,并假设读取和写入需要两次成功确认才能成功。根据我对Cassandra的理解,只要读取需要至少两个响应,只接受最新的时间戳,成功的写入或删除将永远不会有被遗漏的危险。这对我来说很有意义,但它是否正确?

作为一个密切相关的问题,如果我配置Cassandra从不执行GC,但仍然定期执行nodetool修复,这是否足以垃圾收集旧的墓碑?直观地说,成功修复的关键范围不需要保留墓碑,因此理论上它们可以在执行修复时被丢弃。是这种情况吗?

如果我的上述两个假设是正确的,那么我们似乎可以实现以下目标:

  1. 没有复活数据的一致读写(由于仲裁读写和完全避免GC)
  2. 陈旧的墓碑没有无限制的增长(由于定期运行nodetool修复,如果我的上述假设正确,希望执行GC)

1 个答案:

答案 0 :(得分:1)

这篇文章解释了仲裁不保证一致性:Read Operation in Cassandra at Consistency level of Quorum?

假设“GC”意味着压缩,我认为nodetool修复不足以删除逻辑删除或处理其他压缩任务。 https://issues.apache.org/jira/browse/CASSANDRA-6602描述了一个无压缩的场景,听起来就像你正在考虑的那样。如果您正在进行此操作,建议的解决方案是使用DateTieredCompactionStrategy(DTCS)将在特定时间段内写入的数据存储在同一个SSTable中。 DTCS今天在Cassandra 2.1.1中发布,在此处描述:http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/tabProp.html?scroll=tabProp__moreCompaction