删除大量数据后,Cassandra查找查询变得非常缓慢

5

当前,我有一个包含超过十万行数据的cassandra列族。现在,我想删除这个列族中的所有数据,但是问题出现了:

当所有数据被删除后,在这个列族中执行查找查询时,cassandra将需要几十秒才能返回一个空查询结果。原有数据越大,时间开销将成线性增长。

这是由于在从cassandra数据库中删除数据时,tombstone feature引起的。直到下一次GC启动之前,查询速度才会恢复正常。请参阅Cassandra Distributed Deletes

由于我的系统经常使用此类查询操作,我无法忍受数秒钟的巨大延迟。

请给我提供解决此问题的方案,谢谢。


也许使用时间序列模型是一个不错的方法? - deFreitas
2个回答

3
这听起来是一种非常糟糕的使用数据库的方法。填充它,清空它,重复。您可以通过每次使用不同的CF名称来解决问题,例如在清空数据并开始重新填充时,创建一个新的列族并仅使用该列族,然后删除其他列族但这很hacky
我建议使用压实(尽可能清除所有墓碑)来解决您的问题,虽然它会占用CPU,但比等待十几秒钟来响应查询要好。您可以通过提供要压缩的特定ks和cf使任务对您的机器 less 重要:
./nodetool compact <ks_name> <cf_name>

Ritchard提出了一个很好的观点,gc_grace_seconds默认设置为10天,因此您可能需要调整它以允许压实以清除墓碑。


1
请注意,压缩只会在自删除墓碑插入后 gc_grace_seconds 经过后才会移除该墓碑。 - Richard
@Lyuben,我不能清空整个列族,因为存储在其中的用户数据超过1000个,每个用户都有超过100,000行的数据。每个删除操作都是在单个用户的数据上执行的。 对于列族的紧凑操作可能是一个选择,但是触发此操作的时间是什么?如果每次一个用户删除一些数据时就触发它,它可能会影响其他所有用户。你对此有什么建议吗? 再次感谢! 并感谢Richard提醒_gc_grace_seconds_。 - Fify

0

@Fify

如果您的列族经常被修改(读取,然后更新,再次读取更新...),您应该使用层级压实策略

为了更快地删除列,请更改您的列族的gc_grace_seconds属性


感谢您的回复。1)我的列族最常用的操作是插入,然后是读取,删除有时会发生,但概率非常低(比如说100次操作中只有1次)。2)gc_grace_seconds不能太短,因为数据库中存储了数TB的数据。 - Fify

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