1

我在从单行读取数据时出现 Cassandra v1.2.5 性能下降,其中只有很少或零列,但之前添加和删除了许多不同的列。

为了测试,我执行以下操作:

  • 创建一个新的列族
  • 测量一行的读取速度 100 次 - 每次读取平均 4.6 毫秒,返回零列
  • 将 500000 列添加到行
  • 从行中删除所有 500000
  • 再次测量读取速度 100 次 - 每次读取平均 282.4 毫秒,返回零列

因此,在那之后的阅读速度比我添加和删除 500000 列之前慢了约 70 倍。

尝试压缩、冲洗、修复 - 没有任何帮助。速度略微提高到 208.7 毫秒

唯一有助于恢复读取性能的方法是完全删除该行。写入和读取其他行仍然很快。

为什么会发生这种读取速度下降?以及如何解决?

4

1 回答 1

2

退化是因为墓碑。Cassandra 不能只删除列,因为如果副本没有收到删除,则当该节点重新联机时,列会重新出现。出于这个原因,Cassandra 将删除存储为墓碑,这就像值一样,但带有一个标记,表示该列已被删除。

墓碑在 gc_grace_seconds 之后被删除。此时,假设所有副本都已看到删除,因此可以安全地删除墓碑。默认值为 10 天。您可以控制它(每个列族) - 如果在您的用例中您以一致性级别 ALL 删除,或者列恢复活力并不重要,您甚至可以将其降低到 0。

或者,如果要删除整行,可以执行行删除而不是删除单个列。这将插入一个行墓碑,在压缩之后,这意味着读取该行应该与您从未插入现在已删除的列一样快。

于 2013-06-15T20:44:00.100 回答