【故障调查】一个查询导致ClickHouse集群崩溃?

背景

ClickHouse 在我们监控系统中发挥着举足轻重的作用,目前不仅承担着日志的写入,调用链、指标以及前端监控都有广泛的使用。 下面是一个异常查询导致的集群无响应的排查案例。

问题现象

从酷家乐监控系统看板来分析,17:45 cpu、负载均飙高,线程和 tcp 连接数陡增。在 16:03 对集群 重启后恢复正常; 观察到的异常请求: 这个是测试组周期性地查询我们的日志数据,测试平台会定时查询监控数据做问题分析。从图上看集群异常时,测试组正好在大规模请求。但是这个规模的请求平时也有,应该不是他们导致的。

问题排查

重启前下载了全量 CK 日志 日志中报的基本都是网络问题,发现有耗时很高的查询 过滤查询异常的日志,这几个耗时的确不正常,这个时刻确实发生在集群无响应的前几分钟:

查看数据库自带的 system.query_log 表 query 日志

  • 根据耗时倒序,前几个查询是 来自 即席查询 的 terms 查询,理论上不会有用户直接在即席查询查询日志监控项。输入了 message 的模糊匹配,在 distinct 当天的 hostgroup。这种查询肯定是有问题的,几乎要读取当天的所有日志数据。
  • 同时查询了附近几天是否存在类似的查询,很显然并没有,这几个查询恰好发生在集群无响应之前一两分钟。

问题复现

挑选两个集群中的节点,分别执行上面的 sql 语句。根据观察,指标出现了和周五异常时刻相似的状态:

  • CPU 负载飙高,磁盘读取突增,写入下降;
  • 因为这个查询,需要大量读取磁盘和并解压,于是cpu飙高,cpu 飙高导致 merge 速度下降,触发磁盘写入效率下降。于是后续的写入和查询会被阻塞。
  • 看到这个趋势复现后,我立即手动 kill 掉了这个查询(可以参考:clickhouse.com/docs/en/sql...),防止影响正常数据写入。

解决方案

  1. 在对外查询中关掉对该数据的直接查询;
  2. 调整 CK 集群本身处理请求的超时时间,目前配置的100s;
  3. 在酷家乐监控系统指标统一查询层实现 cancel query 的功能,超时时自动执行 kill 语句;
相关推荐
captain37632 分钟前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02141 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川1 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组1 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制
zhangjw342 小时前
1-5 PostgreSQL 数据类型全集:基础类型、字符串、数值、时间类型
数据库·postgresql
IT_陈寒2 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
泡海椒2 小时前
05-雷达图多维画像-信用评级多维画像
后端
王中阳Go2 小时前
5.27 分钟干完后端和全部测试:一场三小时笔试的五个失分点,四个不在代码上
大数据·数据库·人工智能·后端·大语言模型
大哥43092 小时前
Modbus 的"字序":一个配错就变成天文数字,或者干脆变成 0
后端
岩钧2 小时前
New API 源码解析:一个生产级 AI 网关的架构与实现
后端