带ttl的cassandra墓碑

r1wp621o  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(467)

我和Cassandra共事了很长一段时间(dse),我试图理解一些不太清楚的东西。我们正在运行dse 5.1.9以获取此演示。它是一个单节点集群(如果您有一个多节点集群,请确保rf=nodecount以使事情更简单)。
这是一个非常简单的示例:创建以下简单的表:

CREATE TABLE mytable (
    status text,
    process_on_date_time int,
    PRIMARY KEY (status, process_on_date_time)
) WITH CLUSTERING ORDER BY (process_on_date_time ASC)
AND gc_grace_seconds = 60

我有一段代码,每次插入5k条记录,总计20万条记录,ttl为300秒。状态总是“挂起”,进程在日期时间是一个从1开始递增1的计数器(所有唯一的记录基本上都是1-200k)。
我运行代码,完成后,将memtable刷新到磁盘。只创建了一个sstable。在这之后,没有压缩,没有修复,没有其他运行会创建或更改sstable配置。
在sstable转储之后,我进入cqlsh,打开跟踪,将一致性设置为local\u one并关闭分页。然后我重复运行:

SELECT * from mytable where status = 'pending' and process_on_date_time <= 300000;

有趣的是我看到了这样的事情(为了可读性删去一些文字):

Run X) Read 31433 live rows and 85384 tombstone cells (31k rows returned to my screen) 
Run X+1) Read 0 live rows and 76376 tombstone cells (0 rows returned to my screen - all rows expired at this point) 
Run X+2) Read 0 live rows and 60429 tombstone cells 
Run X+3) Read 0 live rows and 55894 tombstone cells 
... 
Run X+X) Read 0 live rows and 0 tombstone cells

怎么回事?sstable没有改变(很明显它是不可变的),没有其他插入、刷新等内容。为什么墓碑计数会一直减少到0?是什么导致这种行为?
我希望看到每次运行:读取10万个逻辑删除,查询中止,因为单个sstable中的所有ttl都已过期。

fykwrbwg

fykwrbwg1#

对于其他可能对这个答案感到好奇的人,我打开了一张datasax的罚单,下面是他们提到的:
在逻辑删除通过gc\u grace\u秒之后,它们将在结果集中被忽略,因为它们在通过该点之后被过滤掉。因此,您的假设是正确的,即墓碑警告发布的唯一方法是使数据超过其ttl,但仍在gcu宽限期内。
因为它们被忽略/过滤掉了,所以它们不会对系统产生任何有害影响,因为就像你说的,它们被跳过了。
所以这意味着,如果ttl过期,但是在gc宽限期内,那么当查询它们时,它们将被算作墓碑。如果ttl过期并且gc宽限时间也过期,它们将不会被计为逻辑删除(跳过)。系统仍然要通过过期的ttl记录进行“除草”,但除了处理时间外,对查询都没有“危害”。我发现这很有趣,因为我在任何地方都看不到这一点。
我认为其他人可能对这些信息感兴趣,如果他们的经历不同,他们可以补充这些信息。

相关问题