我遇到了Cassandra 2.1.17的问题。我有一张桌子,里面有大约40k“行”。我遇到问题的一个分区可能有大约5k个条目。
表是:
create table billing (
accountid uuid,
date timeuuid,
credit double,
debit double,
type text,
primary key (accountid,date)
) with clustering order by (date desc)
因此,此表中插入和删除了很多内容。
我的问题是,我认为它似乎变得腐败了,因为我不再能够从分区中选择超过某一点的数据。
从cqlsh我可以像这样运行。
SELECT accoutid,date,credit,debit,type FROM billing WHERE accountid = XXXXX-xxxx-xxxx-xxxxx ... AND date< 3d466d80-189c-11e7-8a57-f33cbced2fc5 limit 2;
首先,我选择了10000的限制,它通过它们进行了大约5000行的分页,然后到最后它会发出超时错误。
然后我使用上次timeuuid中的第二个并选择限制2它将失败限制1将起作用。
如果我使用最后一个timeuuid作为<并且限制为1也会失败。
所以只是在寻找我能在这里做的事情,我不确定出了什么问题,也不确定如何修复/诊断发生的事情。
我已经厌倦了修理并强行压实。但它似乎仍有问题。
感谢您的帮助。
答案 0 :(得分:4)
答案 1 :(得分:3)
我认为你在这个分区里有太多的墓碑。
什么是墓碑?
要记住记录已被删除,Cassandra会创建一个名为“墓碑”的特殊值。墓碑有任何其他值的TTL,但它不像任何其他值那样容易压缩。 Cassandra保持更长的时间以避免数据重新出现时的不一致。
如何观看墓碑?
nodetool cfstats 让您了解每个切片平均有多少个墓碑
如何解决问题?
保留墓碑的持续时间为 gc_grace_seconds 。您必须减少它,然后运行主要压缩来解决问题。
答案 2 :(得分:2)
在我看来,当你选择时,你会看到很多墓碑。事情就是他们在那里,卡桑德拉仍然需要克服他们。可能有多个因素,如ttl with insert语句,大量删除,插入空值等。
我打赌你需要在桌面上调整gc_grace_seconds并更频繁地运行修复。但要小心,不要将其设置为低(在此时间之前必须完成一轮修复)。
这里有很好的解释: https://opencredo.com/cassandra-tombstones-common-issues/