我知道删除行是一种cassandra反模式(更多的是 - 经常这样做),但在我的简单用例中,我使用了一个本地cassandra(单个实例,复制因子设置为1)对于单元测试,在运行之前删除所有表,自然地用 clean slate 执行测试。
随着时间的推移,这个cassandra实例的性能极度下降。让我感到有些惊讶的是,丢掉键空间根本没有帮助。只有手动删除cassandra数据目录中的所有内容,我才能恢复所有性能。
这个解决方案对我来说非常好,因为我不关心我一遍又一遍地删除的测试数据,但是在文件系统上手动删除这些东西当然感觉有点奇怪。有没有更好的方法来处理这种情况?或者我是否完全错了这整个案例?
答案 0 :(得分:3)
根据提供的少量信息,我将提供一些信息:
首先,删除数据会在cassandra中创建逻辑删除。默认行为是将这些墓碑保留10天,由变量gc_grace_seconds设置。
假设您只有一个节点并且在删除数据后不关心数据,则可以将gc_grace_seconds设置为零。您还可以确保在执行大量删除操作后运行压缩。
此处的文档:
http://docs.datastax.com/en/cql/3.1/cql/cql_reference/tabProp.html
http://docs.datastax.com/en/cassandra/2.0/cassandra/tools/toolsCompact.html
最后,还有一个名为TTL,Time To Live的功能。您可以使用它而不是删除,并让数据库在数据到期后执行“删除”。如果你走这条路,我仍然会将gc_grace_seconds设置为零并运行压缩(通过每小时的cronjob,因为它是一个开发环境)。