cassandra 查询超时
背景介绍
在对某个表做count时出现如下错误(在做业务性测试,生产环境请不要简单粗暴做count操作,耗时还可能不准)
Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded)
很奇怪,另外一个表应该是跟他相同条数的,都能直接count出来,但是当前表count一直报错,而且数据还差2两条(跟ES里面的数据对比后得知)
问题查找
在网上可以直接查询相关问题,结果也出来了很多。其中我给出几个具有参考性的链接
- 【stackoverflow】Cassandra timeout during read query at consistency LOCAL_ONE
- 【datastax】ReadTimeoutException seen when using the java driver caused by excessive tombstones
- 【datastax】Message seen in logs "Maximum memory usage reached (512.000MiB), cannot allocate chunk of 1.000MiB"
- 【stackoverflow】Server-side warning: Aggregation query used without partition key
- 【stackexchange】Querying Cassandra without a partition key
日志跟踪
在 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参数拆分令牌范围,可以减少每个查询计数的数量并减少超时的可能性。
目前使用下来效果还非常不错
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
详解Vue响应式原理
摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有。 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。这使得状态管理非常简单直接,不过理解其工作原理同样重要,这样你可以避开一些常见的问题。----官方文档 本文将针对响应式原理做一个详细介绍,并且带你实现一个基础版的响应式系统。本文的代码请猛戳Github博客 什么是响应式 我们先来看个例子: <div id="app"> <div>Price :¥{{ price }}</div> <div>Total:¥{{ price * quantity }}</div> <div>Taxes: ¥{{ totalPriceWithTax }}</div> <button @click="changePrice">改变价格</button> </div> var...
- 下一篇
基于SenchaCmd搭建ExtJS 6.2版本开发环境(图文教程)
因为各种原因,需要在extjs项目中开发点新功能,由于之前没好好接触过extjs,我前端领域主要学的是React技术栈。所以开始找资料搭建ExtJs运行环境。 说一段小插曲,由于看见extjs项目下有index.html文件,于是,在webstorm工程中用浏览器打开index.html文件,试图把项目跑起来,在浏览器中打开index.html的时候,是一片空白,活生生的打脸了。我潜意识的意识到,跑项目肯定需要搭建extjs的开发环境的。然而我也不知道需要用什么工具来搭建,没有关键字,搜索百度也是徒劳。我在项目代码中偶然看见了SenchaCmd这个关键字,于是百度下来,就能顺利找到资料了,知道要安装好SenchaCmd。 大家需要学习ExtJS可以上中文网站 http://extjs.org.cn/ 看这本书:《ExtJS 6.2实战》 安装软件 安装SenchaCmd-6.7.0.63-windows-64bit 安装Cmd: SenchaCmd-6.7.0.63-windows-64bit 安装ext-6.2.0-gpl 安装SDK:ext-6.2.0-gpl 安装步骤 解压安装压...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G