【问题标题】:Cassandra row with few columns read performance degradationCassandra 列数少的行读取性能下降
【发布时间】:2013-06-12 05:35:21
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: database performance cassandra


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢理查德的回答!我用 250 万条记录进行了更多测试。测试读取前为 7 ms;插入和删除 2.5m 记录后,读取时间约为 1100 ms;将 gc_grace_seconds 设置为 0 后,读取时间约为 630 毫秒;如何再次恢复 7 毫秒?
    • 你是在删除之前还是之后设置了gc_grace_seconds?你应该先改变它。或者如果你之后改变它,你可能需要运行'nodetool compact'。
    • 我之前做过,我什至用 gc_grace_seconds=0 创建了一个新的列族,我仍然有 ~630 毫秒(是的,它比 1100 毫秒好)。是的,如果我做紧凑,我会得到大约 7 毫秒的回复。我可以立即获得 7 毫秒吗?
    • 似乎在任何情况下都应该进行一些压缩,我不能立即恢复 7 毫秒,对吧?
    • 我不认为你可以立即恢复 7 毫秒 - 墓碑还用于消灭已经溢出到磁盘的数据,因此即使 gc_grace_seconds=0 它们仍然存储在 memtable 和可能的 SSTables 中。保证它们消失的唯一方法是运行完全压缩。
    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2023-03-27
    • 1970-01-01
    • 2020-01-26
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多