使用lcs的Cassandrattl墓碑是否在同一级别的数据中进行了cretaed?

qoefvg9y  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(377)

我使用的是lcs和一个相对较大的ttl,对于所有插入的行,ttl为2年,我担心的是c会删除相应的tombstone(既不执行显式删除也不执行更新)。
从丢失的分层压缩策略手册,墓碑压缩在Cassandra和删除没有墓碑或TTL我明白
除l0之外的所有级别都包含不重叠的sstable,但是分区键可能存在于每个级别的一个sstable中(即分布在所有级别中)。
为了使压缩能够删除墓碑,必须确保正在压缩包含de数据的所有sstable,以防止僵尸数据(这是通过检查bloom过滤器完成的)。它还考虑gc\u grace\u秒
因此,对于我的特定用例(2年ttl和write重载),我可以得出结论,ttled数据将处于最高级别,因此我想知道那些具有ttled数据的sstables何时会与包含相应sstables的sstables压缩。
主要的问题是:墓碑(来自ttl)是在哪里创建的?是在级别0创建的,因此需要很长时间才能到达最高级别(因此释放磁盘空间需要很长时间)?
在一篇关于删除和墓碑的评论中,阿兰说
然而,使用ttls有助于减少数据在sstables之间被碎片化的机会,这些数据在短时间内不会被压缩在一起。使用任何压缩策略,如果删除在行历史记录中出现得比较晚,则逻辑删除的'upsert'/'insert'将转到一个新的sstable。这个墓碑可能需要时间才能找到正确的压缩“桶”(与行的其余部分一起),Cassandra最终能够释放空间。
我的理解是,有了ttls,墓碑就被创建到位了,因此,出于许多原因,摆脱ttls通常比删除更容易、更安全。
另一个需要探索的线索是,如果合适的话,可以使用ttl作为默认值。在c
3.0+中,在表级别设置为“default\u time\u to\u live”的TTL不应生成任何逻辑删除。我手上没有测试,但我读到了。
我不知道“就地”是什么意思,因为sstables是不可变的。
(我对它所说的使用也有些怀疑 default_time_to_live 我在《Cassandra》中问过,默认的“生存时间”将如何删除没有墓碑的行。
我的猜测是指在压缩期间由以下原因之一触发的TTLE数据在同一级别(但不同的sstables)中创建的墓碑:
“从最高级别开始,任何得分高于1.001的级别都可以由压实线程选择”分层压实策略缺失手册
“如果我们走25轮没有在最高级别的压缩,我们开始把sstables从该级别到较低级别的压缩”丢失的手册为水平压实策略
“当没有其他压缩要做时,如果sstable中有超过x%的可删除逻辑删除,我们将触发单个sstable压缩。”cassandra-7019由于逻辑删除是在压缩过程中创建的,我认为它可能使用sstable元数据来估计可删除逻辑删除。
因此,契约(2)和(3)应该在最高级别创建/删除墓碑,因此使用具有大ttl的lc本身不应该是一个问题。
对于creating/droping,我的意思是,相同类型的压缩将为过期数据创建墓碑,和/或如果gc周期已经过去,则删除墓碑。
链接到源代码,澄清这种情况将是伟大的,谢谢。

oknwwptz

oknwwptz1#

阿兰罗德里格斯的邮件列表的答案
另一个需要探索的线索是,如果合适的话,可以使用ttl作为默认值。在c*3.0+中,在表级别设置为“default\u time\u to\u live”的TTL不应生成任何逻辑删除。我手上没有测试,但我读到了。
正如在平行线上所解释的,这是错误的,我的错。我相信我其余的评论仍然有效(希望:)。
我不知道“就地”是什么意思,因为sstables是不可变的。我猜这是指墓碑被创造在同一个地方
是的,我相信在到期日之后的下一次压缩过程中,条目被“转化”为墓碑,并生活在压缩结果的sstable中,在这个sstable放入的水平面/桶上。这就是为什么我说“就地”,这对于不变的数据来说确实有点奇怪。
作为你问题的一个附带想法,关于“现代”版的Cassandra(我不记得那个版本了,这就是“现代”的意思;-),您可以在非高峰时段定期(不一定频繁)运行“nodetool garbagecollect”。当您不需要集群资源来占用一些磁盘空间时,它们可能会使用集群资源。另外,确保一个2年的记录没有被设计定期更新肯定会有所帮助。在编写一次数据(从未更新)的极端情况下,以ttl为例,我认为没有理由不正确地删除2年前的数据。只要磁盘能增长,就应该没事。
我不会太害怕它,因为有'总是'的方式删除墓碑。不过,事先考虑一下设计是很好的事实上,一般来说,如果您可以随时间旋转分区,而不是重用旧分区,这是很好的。

相关问题