当前位置: 首页 > news >正文

【数据库维护】Clickhouse数据库维护关键系统表相关指标说明,支撑定位慢SQL及多实例场景下分析各实例运行情况

背景

当前使用环境上以Docker容器化部署Clickhouse服务8个实例,但在实际运行过程中,发现8个实例内存负载不均衡,ck-0实例在固定时间段内存会直线上升,直至服务报错memory exceeded max memory limit。
为排查ck-0节点内存直线上升阶段,对应实例执行任务情况等,梳理clickhouse系统库相关表关键指标说明。

system系统库关键表说明

注意点:system系统库各表数据分别存储在各实例上,各实例情况统计须查询各实例具体情况。
即:节点一的运行指标/merge进程/insert进程/查询进程等,须登录实例一查看。

system.metrics表

记录当前实例运行过程各项关键指标数据,可以支撑分析问题发生情况下各指标趋势。
表字段说明

字段名称字段说明
metric指标名称
value指标值
description指标说明
name指标别名

关键指标说明

指标名称指标说明
Query正在执行的查询数量
Merge正在执行的merge数量
TCPConnectionTCP连接数量
HTTPConnectionHTTP连接数量
PartsActive活跃的数据分块,小而多的数据库会对性能有影响
AddressesActive正在连接的客户端IP地址数量

查询方式

查询所有可用指标

select * from system.metrics;

查询特定指标的值
如查询所有Connection相关的指标

select metric,value from system.metrics where metric like '%Connection%';

system.processes表

记录当前实例正在运行的查询/插入等操作,与show processlist 命令查询结果一致。
表关键字段说明

字段名称字段说明
user执行本次操作的数据库用户
address执行本次操作的客户端IP地址,IPV6格式,K8S场景下为实例IP
elapsed操作耗时,秒
read_rows读取行数
read_bytes读取字节数
written_rows读取行数
written_bytes读取字节数
memory_usage内存使用情况,字节
query执行的具体脚本,insert脚本不包含数据部分
is_cancelled是否取消查询
is_all_data_sent所有数据是否已发送给客户端,可用于判断服务端查询是否已完成

查询方式

关注当前实例正在运行的查询个数,可通过count计数

select count(*) from system.processes;

关注当前实例内存占用情况,可用过sum求和

select count(*) as total_process,sum(memory_usage)/1024/1024 as total_memory_Mb from system.processes;

如通过上述命令得到某实例内存占用过大,可通过下面语句查询具体详情。

select memory_usage/1024/1024 as memory_Mb,elapsed,read_rows,written_rows,address,user,query from system.processes order by memory_usage desc;

说明:

  • 除以1024,是进行单位转换,方便理解
  • 可以根据实际需求选择排序字段
  • read_rows和written_rows两个字段,根据查询类型不同一般只有一个字段有值

system.merges

记录当前实例正在进行的merge合并操作,消耗内存的主要行为之一,将插入clcikhouse中的一个分区中的小片段数据根据系统配置阈值进行合并操作。
表关键字段说明

字段名称字段说明
database数据库名称
table表名
elapsed耗时,秒
progress进度,0-1之间
num_parts需要被merge的数据分块数量
result_part_name合并后的数据分块名称,对应磁盘上一个文件
total_size_bytes_compressed压缩数据总大小
rows_read读取行数
bytes_read_uncompressed读取未压缩字节大小
rows_written写入行数
bytes_written_uncompressed写入未压缩字节大小
memory_usage内存占用字节
merge_type合并类型
merge_algorithm合并算法

查询方式

查询当前实例正在执行的merge个数,可通过count(*)查询;查询当前实例正在运行的merge进程对应的内存消耗。

select count(*), sum(memory_usage)/1024/1024 as memory_Mb from system.merges;

查询具体merge进程详情(大于10秒的)

select database,tables,memory_usage/1024/1024 as memory_Mb,elapsed,num_parts,rows_read,rows_written from system.merges where elapsed > 10 order by memory_usage desc;

说明:
可根据实际关注点,参考字段说明,自行调整sql

system.query_log

记录当前实例已经运行过的SQL信息,SQL执行开始和结束均会写入一条记录,可以协助定位慢SQL等相关信息。
须注意数据保留周期。
表关键字段说明

字段名称字段说明
type类型,包含QueryStart,QueryFinish,ExceptionBeforeStart,ExceptionWhileProcessing,一般情况下关注已执行成功记录。
event_date开始日期,如20255-02-16
event_time开始时间
event_time_microseconds开始时间,带毫秒
query_duration_ms执行耗时
read_rows读取行数
read_bytes读取字节数
written_rows写入行数
written_bytes写入字节数
result_rows结果行数,read或者written
result_bytes结果字节数
memory_usage内存占用情况
query执行的脚本
query_kind查询的类型
databases数据库信息
tables表信息
partitions分区信息,尽量一次查询/写入操作同一个分区,效率会更高
exception_code异常编码
exception异常信息
stack_trace堆栈信息
is_initial_query是否初始化查询,对应其他initial字段
user数据库用户
address客户端地址,即谁发起的查询
interfaceTCP/HTTP

查询方式

查询指定时间段内耗时大于10秒的记录

select event_time,query_duration_ms/1000 as duration_s,query_kind,result_rows,result_bytes/1024/1024 as result_Mb,memory_usage/1024/1024 as   memory_usage_Mb,address,partitions,query,exception from system.query_log where query_duration_ms > 10000 order by memory_usage desc

说明:
具体查询字段,过滤字段以及排序字段,根据字段说明自行调整。

其他附录说明

多实例场景下批量查询方式

for number in 0 1 2 3 4 5 6 7;do echo "------------------"; ./clickhouse-client -h 实例IP或者K8S域名-$number --port 26734 -u clickhouse用户名 --password 用户名对应的密码 --query "select metric,value from system.metrics where metric like '%Connection%' "; echo "------------------"; done   

说明:

  • in后面数字代表不同的实例编号,-h使用k8s域名如clickhouse-0.xxx.com,可以通过$number获取变量,实现批量查询各个节点信息
  • echo打印一堆横杠,以区分不同实例打印结果
  • –query参数输入待执行的SQL脚本

K8s集群场景下,根据已查询到的客户端address确认具体的实例名称

K8s容器部署场景下,已获取address情况下,期望明确具体的发起查询的服务实例,可通过以下命令查询

kubectl get pod -A -o wide | grep 实例IP

-A可以根据实际情况修改为具体的命名空间,查询范围更具体一些,当前查询所有命名空间。

http://www.lryc.cn/news/537976.html

相关文章:

  • 委托构造函数与继承构造函数
  • DeepSeek操作Excel,实现图表自动化生成
  • 3.5 企业级AI Agent运维体系构建:从容器化部署到智能监控的工业级实践指南
  • 基于51单片机的定时器实现LED闪烁控制(CT107D)
  • 【java】作业1
  • 2025有哪些关键词优化工具好用
  • 【WPSOffice】汇总
  • 海康摄像头IPV6模式,手动,自动,路由公告
  • Transformer(3): Add Norm
  • SpringBoot多数据源实践:基于场景的构建、实现和事务一体化研究
  • SOCKET建立简单的tcp服务端与客户端通信
  • C语言-章节 1:变量与数据类型 ——「未初始化的诅咒」
  • 【HarmonyOS Next】图片选择方案
  • 【C语言】移除元素
  • Python----Python高级(网络编程:网络高级:多播和广播,C/S架构,TCP,UDP,网络编程)
  • CES 2025 上的创新方案——无电池智能纸尿裤-AP4470
  • Java 运算符
  • 【一文读懂】什么是MVVM?
  • GCD of Subset
  • BY组态:工业自动化的未来,触手可及
  • DeepSeek在linux下的安装部署与应用测试
  • 华为昇腾920b服务器部署DeepSeek翻车现场
  • JavaScript 内置对象-数组对象
  • Qt——连接MySQL数据库之ODBC的方法详细总结(各版本大同小异,看这一篇就够了)
  • 进程令牌:Windows 安全架构中的关键元素
  • 基于springboot的超时代停车场管理平台(源码+文档)
  • 缓存穿透、缓存击穿、缓存雪崩的区别与解决方案
  • 箭头函数的this指向谁
  • 【愚公系列】《Python网络爬虫从入门到精通》012-字符串处理
  • 【Python】01-基础