95.【数据库】ClickHouse从入门到放弃-服务监控

331 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情 

文档参考:《ClickHouse原理解析与应用实践(数据库技术丛书)(朱凯)》

作为clickhouse系列最后一章,本章节主要学习clickhouse 的服务监控

服务监控

基于原生功能对ClickHouse进行监控,可以从两方面着手——系统表和查询日志。接下来分别介绍它们的使用方法。

1 系统表

在众多的SYSTEM系统表中,主要由以下三张表支撑了对ClickHouse运行指标的查询,它们分别是metrics、events和asynchronous_metrics。

1.metrics

metrics表用于统计ClickHouse服务在运行时,当前正在执行的高层次的概要信息,包括正在执行的查询总次数、正在发生的合并操作总次数等。该系统表的查询方法如下所示:

SELECT * FROM system.metrics LIMIT 5
┌─metric──────┬─value─┬─description─────────────────────┐
│ Query           │     1  │ Number of executing queries                     │
│ Merge0  │ Number of executing background merges           │
│ PartMutation    │     0  │ Number of mutations (ALTER DELETE/UPDATE)       │
│ ReplicatedFetch │     0  │ Number of data parts being fetched from replica │
│ ReplicatedSend  │     0  │ Number of data parts being sent to replicas     │
└──────────┴─────┴─────────────────────────────┘

2.events

events用于统计ClickHouse服务在运行过程中已经执行过的高层次的累积概要信息,包括总的查询次数、总的SELECT查询次数等,该系统表的查询方法如下所示:

SELECT event, value FROM system.events LIMIT 5
┌─event─────────────────────┬─value─┐
│ Query                                   │   165  │
│ SelectQuery                             │    92  │
│ InsertQuery                             │    14  │
│ FileOpen                                │  3525  │
│ ReadBufferFromFileDescriptorRead        │  6311  │
└─────────────────────────┴─────┘

3.asynchronous_metrics

asynchronous_metrics用于统计ClickHouse服务运行过程时,当前正在后台异步运行的高层次的概要信息,包括当前分配的内存、执行队列中的任务数量等。 该系统表的查询方法如下所示:

SELECT * FROM system.asynchronous_metrics LIMIT 5
┌─metric───────────────────────┬─────value─┐
│ jemalloc.background_thread.run_interval      │            0   │
│ jemalloc.background_thread.num_runs          │            0   │
│ jemalloc.background_thread.num_threads       │            0   │
│ jemalloc.retained                            │     79454208   │
│ jemalloc.mapped                              │    531341312   │
└────────────────────────────┴──────────┘

2 查询日志

查询日志目前主要有6种类型,它们分别从不同角度记录了ClickHouse的操作行为。所有查询日志在默认配置下都是关闭状态,需要在config.xml配置中进行更改,接下来分别介绍它们的开启方法。在配置被开启之后,ClickHouse会为每种类型的查询日志自动生成相应的系统表以供查询。

1.query_log

query_log是最常用的查询日志,它记录了ClickHouse服务中所有已经执行的查询记录,它的全局定义方式如下所示:

<query_log>
    <database>system</database>
    <table>query_log</table>
    <partition_by>toYYYYMM(event_date)</partition_by>
    <!—刷新周期-->
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>

如果只需要为某些用户单独开启query_log,也可以在user.xml的profile配置中按照下面的方式定义:

<log_queries> 1</log_queries>

query_log开启后,即可以通过相应的系统表对记录进行查询:

SELECT type,concat(substr(query,1,20),'...')query,read_rows, 
query_duration_ms AS duration FROM system.query_log LIMIT 6
┌─type──────────┬─query───────────┬─read_rows─┬─duration─┐
│ QueryStart           │ SELECT DISTINCT arra... │         00  │
│ QueryFinish          │ SELECT DISTINCT arra... │      243211  │
│ QueryStart           │ SHOW DATABASES...       │         00  │
│ QueryFinish          │ SHOW DATABASES...       │         31  │
│ ExceptionBeforeStart │ SELECT * FROM test_f... │         00  │
│ ExceptionBeforeStart │ SELECT * FROM test_f... │         00  │
└─────────────┴───────────────┴───────┴───────┘

如上述查询结果所示,query_log日志记录的信息十分完善,涵盖了查询语句、执行时间、执行用户返回的数据量和执行用户等。

2.query_thread_log

query_thread_log记录了所有线程的执行查询的信息,它的全局定义方式如下所示:

<query_thread_log>
    <database>system</database>
    <table>query_thread_log</table>
    <partition_by>toYYYYMM(event_date)</partition_by>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_thread_log>

同样,如果只需要为某些用户单独开启该功能,可以在user.xml的profile配置中按照下面的方式定义:

<log_query_threads> 1</log_query_threads>

query_thread_log开启后,即可以通过相应的系统表对记录进行查询:

SELECT thread_name,concat(substr(query,1,20),'...')query,query_duration_ms AS duration,memory_usage AS memory FROM system.query_thread_log LIMIT 6
┌─thread_name───┬─query───────────┬─duration─┬─memory─┐
│ ParalInputsProc │ SELECT DISTINCT arra... │        2210888  │
│ ParalInputsProc │ SELECT DISTINCT arra... │        3252648  │
│ AsyncBlockInput │ SELECT DISTINCT arra... │        3449544  │
│ TCPHandler      │ SELECT DISTINCT arra... │       110  │
│ TCPHandler      │ SHOW DATABASES...       │        20  │
└──────────┴───────────────┴───────┴──────┘

如上述查询结果所示,query_thread_log日志记录的信息涵盖了线程名称、查询语句、执行时间和内存用量等。 3.part_log

part_log日志记录了MergeTree系列表引擎的分区操作日志,其全局定义方式如下所示:

<part_log>
    <database>system</database>
    <table>part_log</table>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</part_log>

part_log开启后,即可以通过相应的系统表对记录进行查询:

SELECT event_type AS type,table,partition_id,event_date FROM system.part_log
┌─type────┬─table─────────────┬─partition_id─┬─event_date─┐
 NewPart     summing_table_nested_v1     201908         2020-01-29  
 NewPart     summing_table_nested_v1     201908         2020-01-29  
 MergeParts  summing_table_nested_v1     201908         2020-01-29  
 RemovePart  ttl_table_v1                201505         2020-01-29  
 RemovePart  summing_table_nested_v1     201908         2020-01-29  
 RemovePart  summing_table_nested_v1     201908         2020-01-29  
└───────┴─────────────────┴─────────┴────────┘

如上述查询结果所示,part_log日志记录的信息涵盖了操纵类型、表名称、分区信息和执行时间等。

4.text_log

text_log日志记录了ClickHouse运行过程中产生的一系列打印日志,包括INFO、DEBUG和Trace,它的全局定义方式如下所示:

<text_log>
    <database>system</database>
    <table>text_log</table>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</text_log>

text_log开启后,即可以通过相应的系统表对记录进行查询:

SELECT thread_name,
concat(substr(logger_name,1,20),'...')logger_name,
concat(substr(message,1,20),'...')message 
FROM system.text_log LIMIT 5
┌─thread_name──┬─logger_name───────┬─message────────────┐
│ SystemLogFlush │ SystemLog (system.me... │ Flushing system log...     │
│ SystemLogFlush │ SystemLog (system.te... │ Flushing system log...     │
│ SystemLogFlush │ SystemLog (system.te... │ Creating new table s...    │
│ SystemLogFlush │ system.text_log...      │ Loading data parts...      │
│ SystemLogFlush │ system.text_log...      │ Loaded data parts (0...    │
└──────────┴───────────────┴─────────────────┘

5.metric_log

metric_log日志用于将system.metrics和system.events中的数据汇聚到一起,它的全局定义方式如下所示:

<metric_log>
        <database>system</database>
        <table>metric_log</table>
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>
        <collect_interval_milliseconds>1000</collect_interval_milliseconds>
    </metric_log>

其中,collect_interval_milliseconds表示收集metrics和events数据的时间周期。metric_log开启后,即可以通过相应的系统表对记录进行查询。

除了上面介绍的系统表和查询日志外,ClickHouse还能够与众多的第三方监控系统集成,限于篇幅这里就不再展开了。