我是卡桑德拉的新手。我遇到了执行每个分区删除的情况。删除整个分区会创建墓碑吗?现在空间在删除后没有被释放。
3 回答
是的,删除整个分区会创建一种特殊类型的墓碑,它会“隐藏”分区中的所有数据。但与其他墓碑一样,它会保留 gc_grace_seconds,并且仅在收集之后。
The Last Pickle有一篇很棒的博客文章详细解释了墓碑
如前所述,您可以将 gc_grace_seconds 更新为 0,但我不建议您这样做,除非您的集群中只有一个节点或者您的 RF=1。您可以尝试将 GC 宽限期减少到您可以接受的时间。我想给出我认为 Cassandra 节点可以保持关闭的最长时间。
立即释放空间的另一种选择是将数据模型更改为使用截断/删除。例如,如果您只需要 24 小时的数据,您可以每天创建一个表,并在某个时候删除您不需要的表。
我用相同的分区键删除后插入新数据进行了测试。
create table message_routes (
user_id bigint,
route_id bigint,
primary key ((user_id), service_id)
)
insert into message_routes (user_id, route_id) values (1, 2)
delete from message_routes where user_id = 1
insert info message_routes (user_Id, route_id) values (1, 3)
在每个阶段执行之后,nodetool flush & nodetool compact,但是第 2 阶段的墓碑没有被驱逐,如 sstablemetadata 所示。删除后执行新插入。我希望 Cassandra 能够针对这种情况进行优化。
有趣的是,如果删除频繁,这个墓碑如何影响分区键的选择查询?
select * from message_routes where user_id = 1