cassandra 读取性能在某些行跳跃

Posted

技术标签:

【中文标题】cassandra 读取性能在某些行跳跃【英文标题】:cassandra read performance jumps at certain rows 【发布时间】:2014-01-22 23:43:55 【问题描述】:

为了找出为什么 cassandra 读取需要这么长时间,我使用了跟踪并限制了行数。奇怪的是,当我查询 600 行时,我会在大约 50 毫秒内得到结果。但是 610 行需要将近 1 秒!

cqlsh> select containerdefinitionid from containerdefinition limit 600;
... lots of output ...

Tracing session: 6b506cd0-83bc-11e3-96e8-e182571757d7

 activity                                                                                        | timestamp    | source        | source_elapsed
-------------------------------------------------------------------------------------------------+--------------+---------------+----------------
                                                                              execute_cql3_query | 15:25:02,878 | 130.4.147.116 |              0
                                                                               Parsing statement | 15:25:02,878 | 130.4.147.116 |             39
                                                                              Peparing statement | 15:25:02,878 | 130.4.147.116 |            101
                                                                   Determining replicas to query | 15:25:02,878 | 130.4.147.116 |            152
 Executing seq scan across 1 sstables for [min(-9223372036854775808), min(-9223372036854775808)] | 15:25:02,879 | 130.4.147.116 |           1021
                                                                Scanned 755 rows and matched 755 | 15:25:02,933 | 130.4.147.116 |          55169
                                                                                Request complete | 15:25:02,934 | 130.4.147.116 |          56300
cqlsh> select containerdefinitionid from containerdefinition limit 610;
... just about the same output and trace info, except...

                                                            Scanned 766 rows and matched 766 | 15:25:58,908 | 130.4.147.116 |         739141

这些特定行中的数据似乎没有什么异常: - 值与之前和之后的值相似。 - 使用 COPY 命令我可以导出整个表并在不同的集群上导入,性能很好。 - 这些行是第一个示例,但似乎还有其他地方查询时间也会跳跃。整个表只有约 3000 行,但列出所有主键需要约 15 秒。

数据 STORAGE 似乎确实有一些不寻常的地方: - 将快照复制到另一个集群并导入会给出相同的结果和相同的限制 - 将数据复制到 CSV,然后复制到另一个集群不会,性能很棒

尝试过压缩、修复、重新索引、清理和刷新。没有效果。

我意识到我可以通过向外复制数据来“修复”数据,但我正试图弄清楚这里发生了什么,以避免它在生产中发生在一张太大而无法使用 COPY 修复的表上。

表有17列,3个索引,TEXT主键,2个LIST列和2个TIMESTAMP列;其余的是 TEXT。可以重现 SimpleStrategy 和 DC 感知复制的问题。可以在 4 台服务器上复制 4 份数据,在 2 台服务器上复制 2 份数据,在 2 台服务器上复制 1 份数据(因此无论查询是在本地执行还是涉及多台服务器都无关紧要)。 Cassandra-1.2 与 cqlsh。

有什么想法吗?有什么建议吗?

【问题讨论】:

此表在过去几天是否收到大量DELETEUPDATE 流量?您可能有大量的墓碑单元聚集在表中的几个大热点中。查看datastax.com/dev/blog/…了解更多详情。 【参考方案1】:

您是否有可能为特定分区启用行缓存? 行缓存包含内存中最近访问的所有行,因此可能会提供更好的性能。

包含分区键缓存及其在磁盘上的偏移量的键缓存也可以提供更好的性能。

能否告诉我你当前使用的行缓存、键缓存的设置是什么

【讨论】:

以上是关于cassandra 读取性能在某些行跳跃的主要内容,如果未能解决你的问题,请参考以下文章

Meet Professor Cassandra Fraser

Cassandra 更新无法正常工作

Cassandra 数据模型

JAVA操作cassandra数据库

如何从cassandra中非常大的表中读取所有行?

Cassandra 分页在并发插入时的行为方式