我刚认识Cassandra。我遇到过这样的情况,每个分区都要执行删除操作。删除整个分区是否会创建墓碑?现在删除后空间没有被释放。
是的,删除整个分区会创建一个特殊类型的"阴影"墓碑。分区中的所有数据。但是像其他墓碑一样,它被保存gc_grace_seconds,并且只在此之后被收集。
the Last Pickle有一篇很棒的博客文章详细解释了墓碑
如前所述,您可以将gc_grace_seconds更新为0,但我不建议这样做,除非您的集群中只有一个节点或您的RF=1。您可以尝试将GC宽限期减少到您可以接受的时间。我想把我认为Cassandra节点可以保持down的最长时间。
立即释放空间的另一个选择是将数据模型更改为使用truncate/drop。例如,如果你只需要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 &节点工具紧凑,但是阶段2的墓碑没有被清除,如sstablemetadata所示。删除执行后,新的插入。我希望Cassandra对这种情况有优化。
这是有趣的墓碑如何影响选择查询分区键如果删除将是频繁的?select * from message_routes where user_id = 1