如果 Cassandra 配置为从不执行 gc 并且所有读取和写入都是仲裁,是不是需要 nodetool 修复?

Posted

技术标签:

【中文标题】如果 Cassandra 配置为从不执行 gc 并且所有读取和写入都是仲裁,是不是需要 nodetool 修复?【英文标题】:Is nodetool repair necessary if Cassandra is configured never to perform gc and all reads and writes are quorum?如果 Cassandra 配置为从不执行 gc 并且所有读取和写入都是仲裁,是否需要 nodetool 修复? 【发布时间】:2014-10-23 22:50:38 【问题描述】:

这是一个关于节点工具修复和垃圾收集的两部分问题。

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

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

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

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

【问题讨论】:

【参考方案1】:

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

假设“GC”意味着压缩,我认为 nodetool repair 不足以删除墓碑或处理其他压缩任务。 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

【讨论】:

似乎该帖子确实表明仲裁在用于读取和写入时就足够了(根据此问题中的标题)。 是的,如果你能容忍某种程度的失败,QUORUM 会给你强大的一致性:datastax.com/documentation/cassandra/2.1/cassandra/dml/…

以上是关于如果 Cassandra 配置为从不执行 gc 并且所有读取和写入都是仲裁,是不是需要 nodetool 修复?的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra无法创建Java虚拟机

在Cassandra中加载cassandra.yaml之外的其他配置文件

Cassandra:将新节点引导到集群时,Long Par New GC 暂停

LCS 上的主要压缩

kafka GC配置

设置 gc.refLogExpire