Cassandra墓碑警告和失败阈值被触发

7
我们正在运行一个由Cassandra作为持久化存储支持的Titan Graph DB服务器,但遇到了达到Cassandra墓碑阈值限制的问题,导致数据积累时查询周期性失败/超时。似乎压缩无法跟上添加的墓碑数量。
我们的用例支持:
1.高读/写吞吐量。
2.对读取非常敏感。
3.Titan中节点值频繁更新,导致在Cassandra中更新行。
鉴于以上用例,我们已经通过以下方式优化Cassandra:
1.使用分层压缩策略进行积极压缩。
2.将tombstone_compaction_interval设置为60秒。
3.将tombstone_threshold设置为0.01。
4.将gc_grace_seconds设置为1800。
尽管进行了以上优化,我们仍然在Cassandra日志中看到类似以下的警告:
[WARN] (ReadStage:7510) org.apache.cassandra.db.filter.SliceQueryFilter:在.graphindex中读取0个活动单元格和10350个墓碑单元格(请参见tombstone_warn_threshold)。请求了8001列,切片=[00-ff],delInfo={deletedAt=-9223372036854775808, localDeletion=2147483647}
随着时间的推移,偶尔会看到失败阈值被突破并导致错误。
我们的cassandra.yaml文件中,tombstone_warn_threshold设置为10000,tombstone_failure_threshold远高于推荐值250000,但没有真正明显的好处。
如果还有进一步优化的空间,请指导我们正确的配置。非常感谢您的时间和帮助。

你经常删除数据吗?据我了解,只有在数据被明确删除或过期时才会创建墓碑。 - Andy Tolbert
我们的信念是,Titan GraphDb 在内部处理与 Cassandra 的所有交互时可能会对每次更新执行删除和新创建操作,这会增加删除操作的数量。 - Rohit
确认一下是否是这种情况会很好。您能否在其中一个Cassandra节点上启用概率跟踪(http://www.datastax.com/documentation/cassandra/2.0/cassandra/tools/toolsSetTraceProbability.html),以查看删除操作的情况?另一个可能性是列已过期(设置了TTL),您认为这也可能发生在这里吗? - Andy Tolbert
2
我今天会尝试这个。再次感谢您的指导。 - Rohit
@Rohit今天看到了这篇文章。它应该能帮助你理解何时创建墓碑。https://groups.google.com/forum/#!msg/aureliusgraphs/XMG7DKkAll0/Anq7VF680J4J - Curtis Allen
4个回答

7
似乎你问题的根源在于你的数据模型。你已经尽了一切努力来减轻TombstoneOverwhelmingException的发生。由于你的数据模型需要频繁更新,导致墓碑创建,而Cassandra这样的最终一致性存储可能不适合你的用例。当我们遇到这些问题时,我们必须改变我们的数据模型以更好地适应Cassandra的优势。
关于删除http://www.slideshare.net/planetcassandra/8-axel-liljencrantz-23204252(幻灯片34-39)

1
谢谢Curtis。我会看一下这个,看看我们是否可以对数据模型进行更改。问题的一部分是使用Titan图形服务器时,数据模型被抽象出来了。 - Rohit
1
嗨@Rohit,您可以从这里了解Titan如何持久化数据:http://s3.thinkaurelius.com/docs/titan/0.5.4/data-model.html。基本上,我们所做的就是尽量减少删除顶点和边缘的数量。 - Curtis Allen

6

在表的gc_grace_seconds配置已经过去一定时间后,墓碑才会被清除。因此,即使增加了压缩间隔,墓碑也不会在gc_grace_seconds(默认为10天)到期之前被删除。您可以尝试将gc_grace_seconds调整为较低的值,并更频繁地执行修复操作(通常希望安排修复操作每gc_grace_seconds_in_days - 1天发生一次)。


感谢您回复,安迪。您提到的很有道理。我们也将Gc优惠秒数设置为1800。我编辑了我的帖子以反映我们的尝试。 - Rohit

2

大家都是正确的。如果您经常进行修复和压缩,您可以减少gc_grace_seconds数字。

然而,值得考虑的是插入空值等同于删除操作。这将增加您的墓碑数。相反,如果您使用预处理语句,则需要插入UNSET_VALUE。对于您来说可能太晚了,但如果其他人来到这里,这也许会有所帮助。


1
这是一个非常重要的事实,非常感谢!空字段会对性能产生巨大影响,因为它会导致墓碑问题!我已经解决了我的问题。我曾经在这里提出过这个问题:https://stackoverflow.com/questions/56125982/why-cassandra-count-on-a-specific-partition-takes-really-long-on-relatively-s?noredirect=1#comment98892788_56125982 - kosgeinsky

1
您调整的变量有助于过期tombstones,但值得注意的是,尽管tombstones在gc_grace_seconds之前无法清除,但Cassandra并不保证tombstones将在gc_grace_seconds时清除。实际上,tombstones直到包含tombstone的sstable被压缩才会被压缩,即使在这种情况下,如果存在包含被遮蔽单元格的另一个sstable,则不会消除它。
这导致tombstones可能会持续很长时间,特别是如果您使用的是很少压缩的sstables(例如,非常大的STCS sstables)。为解决此问题,存在一些工具,例如JMX端点来forceUserDefinedCompaction - 如果您不擅长使用JMX端点,则存在自动为您执行此操作的工具,例如http://www.encql.com/purge-cassandra-tombstones/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接