cassandra 查询超时

简介: cassandra count 超时及建议解决方式

背景介绍

在对某个表做count时出现如下错误(在做业务性测试,生产环境请不要简单粗暴做count操作,耗时还可能不准)

Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded)

很奇怪,另外一个表应该是跟他相同条数的,都能直接count出来,但是当前表count一直报错,而且数据还差2两条(跟ES里面的数据对比后得知)

问题查找

在网上可以直接查询相关问题,结果也出来了很多。其中我给出几个具有参考性的链接

日志跟踪

在 cassandra system.log 看到了count产生的日志,前面后后观察了很长的日志,结果会出现如下一些情况

Redistributing index summaries


INFO  [ReadStage-18] 2019-07-08 23:02:30,820 NoSpamLogger.java:91 - Maximum memory usage reached (536870912), cannot allocate chunk of 1048576


ggregation query used without partition key

上面是3个有不同于常见日志的信息,下面是常见的日志信息

WARN  [ReadStage-1] 2019-07-10 03:27:07,652 ReadCommand.java:569 - Read 1221 live rows and 1221 tombstone cells for query SELECT * FROM data_repository.crawler_forecast_weather WHERE token(city_code) > -8205240754366621005 AND token(city_code) <= -8009162018439875451 LIMIT 5000 (see tombstone_warn_threshold)
WARN  [ReadStage-9] 2019-07-10 03:27:07,654 ReadCommand.java:569 - Read 1275 live rows and 1275 tombstone cells for query SELECT * FROM data_repository.crawler_forecast_weather WHERE token(city_code) > -4148410870856401753 AND token(city_code) <= -3960705342382018938 LIMIT 5000 (see tombstone_warn_threshold)

可能原因

这个问题曾经以为被定位到问题,但是最终却发现还是无能为力。这里说下历程

第一次以为找到缘由

做count 操作操作时,就跟其他读操作一样,需要将数据加载到缓存中。数据来源包括 SSTables,tombstone标记,这些数据都放在缓存中。

缓存的大小由cassandra.yaml中的 file_cache_size_in_mb设置控制。 默认大小为 512 MB

count出问题这张表是因为有一个字段存了很长的文本内容,count整个表时,将所有数据(完整的每行数据)加载到内存就导致内存不足。

第二次

根据上面的方式解决count超时不久后又发现超时,但这次却是不同之前说的两个表。这次没有再去调配置大小,而是在社区朋友的指导下 跟踪了cpu idle 跟磁盘的 %util

在跟踪的过程中刚好出现 %util 达到 100%, 99% 的情况。然后他认为是磁盘性能造成的超时。但是我跟踪了磁盘负载很高的时间刚好是定时任务在往cassandra里面写数据。那%util高应该是写入造成的,我在定时任务跑完然后再去执行count 也还是超时,所以我不太认同时磁盘性能造成count超时。当然,我们的确实存在磁盘性能,这个后续需要好好调优

最终无果

我之前执行count sql 时一直在 datagrip (一种cassandra的可视化管理)中操作。偶然想去cassandra 终端使用cqlsh执行,结果竟然有意外之喜

在cqlsh 首次执行也是超时,但是后面执行就能成功统计。而在datagrip中统计却一直出现超时错误。那这两个有什么表现不一样么

观察日志发现:在datagrip做操作时,system.log 会输出很多(全是查询的sql语句),而在cqlsh中进行统计时,发现system.log 竟然只有少量的日志输出,甚至没有常见的查询日志,也是异常奇怪。目前找不到更多原因,只能记录存档了。

对于这个问题花费了很多力气,查过缓存不足,tombstone太多,cpu, 硬盘。但最后我更倾向这个操作违反了cassandra的设计,cassandra 是分布式的,记录是分区存储。当在做 聚合查询 时 却没有带where带上分区键限制,那么很可能不能得到你预期的结果。count可以对一个数据量小小的table进行,但是数据量稍微大一点,可能就不能这么用了。

对于其他聚合查询请点击下面链接

建议解决

如果是业务层需要做count统计,需要根据分区键去做count

如果只是观察数据总条数,建议直接在cqlsh上进行统计(不要使用其他工具),当然这个也依然存在超时的问题。所以这里推荐 一个 非常好的统计工具 brianmhess/cassandra-count

这个工具通过使用numSplits参数拆分令牌范围,可以减少每个查询计数的数量并减少超时的可能性。

目前使用下来效果还非常不错

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
NoSQL Java
简析Cassandra的BATCH操作
cassandra中批量写入的操作称为batch,通过batch操作可以将多个写入请求合并为一个请求。这样有如下作用: 把多次更新操作合并为一次请求,减少客户端和服务端的网络交互。 batch中同一个partition key的操作具有隔离性。
7135 0
|
虚拟化
安装VMware提示无法访问网络位置*:\VMware\......
安装VMware提示无法访问网络位置*:\VMware\......
1284 0
|
NoSQL 前端开发
cassandra nodetool常用命令介绍
简介 nodetool是cassandra自带的外围工具,通过JMX可以动态修改当前进程内存数据,注意cassandra是无主对等架构,默认的命令是操作本机当前进程,例如repair,如果需要做全集群修复,需要在每台机器上执行对应的nodetool命令。
4249 0
|
XML Java 关系型数据库
Spring Boot 异常处理回滚事务详解(自动回滚、手动回滚、部分回滚)
Spring Boot 异常处理回滚事务详解(自动回滚、手动回滚、部分回滚)
3921 0
|
SQL NoSQL 数据库
Cassandra数据库与Cql实战笔记
Cassandra数据库与Cql实战笔记
218 1
Cassandra数据库与Cql实战笔记
|
运维 关系型数据库 Java
DataKit6.0将MySQL8.0迁移至openGauss6.0
DataKit6.0将MySQL8.0迁移至openGauss6.0
|
存储 API 流计算
Flink - checkpoint Failure reason: Not all required tasks are currently running
Flink 程序增加 readFile 生成文件流后,最初运行期间 CheckPoint 存储没有问题,待文件流 Finished 后 CheckPoint 存储报错: checkpoint Failure reason: Not all required tasks are currently running,下面分析并解决下。
3298 0
Flink - checkpoint Failure reason: Not all required tasks are currently running
|
Shell Python
Python教程:return和yield的区别
Python教程:return和yield的区别
576 0
Python教程:return和yield的区别
|
缓存 监控 负载均衡
Cassandra 调优
Cassandra 调优
361 0
|
存储 SQL JSON
5、DataX(DataX简介、DataX架构原理、DataX部署、使用、同步MySQL数据到HDFS、同步HDFS数据到MySQL)(一)
5、DataX(DataX简介、DataX架构原理、DataX部署、使用、同步MySQL数据到HDFS、同步HDFS数据到MySQL)(一)