跳到主要内容
跳到主要内容

系统表

简介

系统表提供关于以下方面的信息

  • 服务器状态、进程和环境。
  • 服务器的内部进程。
  • 构建 ClickHouse 二进制文件时使用的选项。

系统表

  • 位于 system 数据库中。
  • 仅可用于读取数据。
  • 无法删除或更改,但可以分离。

大多数系统表将其数据存储在 RAM 中。ClickHouse 服务器在启动时创建此类系统表。

与其他系统表不同,系统日志表 metric_logquery_logquery_thread_logtrace_logpart_logcrash_logtext_logbackup_logMergeTree 表引擎提供服务,并默认将其数据存储在文件系统中。如果从文件系统中删除表,ClickHouse 服务器将在下次写入数据时再次创建空表。如果系统表模式在新版本中更改,则 ClickHouse 会重命名当前表并创建一个新表。

可以通过在 /etc/clickhouse-server/config.d/ 下创建与表同名的配置文件,或在 /etc/clickhouse-server/config.xml 中设置相应的元素来自定义系统日志表。可以自定义的元素有

  • database:系统日志表所属的数据库。此选项现已弃用。所有系统日志表都在数据库 system 下。
  • table:要插入数据的表。
  • partition_by:指定 PARTITION BY 表达式。
  • ttl:指定表 TTL 表达式。
  • flush_interval_milliseconds:将数据刷新到磁盘的间隔(毫秒)。
  • engine:提供完整的引擎表达式(以 ENGINE = 开头)和参数。此选项与 partition_byttl 冲突。如果同时设置,服务器将引发异常并退出。

一个示例

<clickhouse>
<query_log>
<database>system</database>
<table>query_log</table>
<partition_by>toYYYYMM(event_date)</partition_by>
<ttl>event_date + INTERVAL 30 DAY DELETE</ttl>
<!--
<engine>ENGINE = MergeTree PARTITION BY toYYYYMM(event_date) ORDER BY (event_date, event_time) SETTINGS index_granularity = 1024</engine>
-->
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
<max_size_rows>1048576</max_size_rows>
<reserved_size_rows>8192</reserved_size_rows>
<buffer_size_rows_flush_threshold>524288</buffer_size_rows_flush_threshold>
<flush_on_crash>false</flush_on_crash>
</query_log>
</clickhouse>

默认情况下,表增长是无限的。要控制表的大小,可以使用 TTL 设置来删除过时的日志记录。您还可以使用 MergeTree 引擎表的分区功能。

系统指标的来源

为了收集系统指标,ClickHouse 服务器使用

  • CAP_NET_ADMIN 功能。
  • procfs(仅在 Linux 中)。

procfs

如果 ClickHouse 服务器没有 CAP_NET_ADMIN 功能,它会尝试回退到 ProcfsMetricsProviderProcfsMetricsProvider 允许收集每个查询的系统指标(用于 CPU 和 I/O)。

如果系统支持并启用了 procfs,ClickHouse 服务器将收集以下指标

  • OSCPUVirtualTimeMicroseconds
  • OSCPUWaitMicroseconds
  • OSIOWaitMicroseconds
  • OSReadChars
  • OSWriteChars
  • OSReadBytes
  • OSWriteBytes
注意

从 5.14.x 开始的 Linux 内核中,默认禁用 OSIOWaitMicroseconds。您可以使用 sudo sysctl kernel.task_delayacct=1 或通过在 /etc/sysctl.d/ 中创建一个包含 kernel.task_delayacct = 1.conf 文件来启用它

ClickHouse Cloud 中的系统表

在 ClickHouse Cloud 中,系统表提供了对服务状态和性能的关键洞察,就像在自管理部署中一样。一些系统表在集群范围内运行,特别是那些从 Keeper 节点获取数据的表,Keeper 节点管理分布式元数据。这些表反映了集群的集体状态,并且在单个节点上查询时应该是一致的。例如,parts 无论从哪个节点查询都应该是一致的

SELECT hostname(), count()
FROM system.parts
WHERE `table` = 'pypi'

┌─hostname()────────────────────┬─count()─┐
│ c-ecru-qn-34-server-vccsrty-026
└───────────────────────────────┴─────────┘

1 row in set. Elapsed: 0.005 sec.

SELECT
hostname(),
count()
FROM system.parts
WHERE `table` = 'pypi'

┌─hostname()────────────────────┬─count()─┐
│ c-ecru-qn-34-server-w59bfco-026
└───────────────────────────────┴─────────┘

1 row in set. Elapsed: 0.004 sec.

相反,其他系统表是节点特定的,例如内存中的表或使用 MergeTree 表引擎持久化其数据的表。这对于日志和指标等数据是典型的。这种持久性确保了历史数据仍然可用于分析。但是,这些节点特定的表本质上是每个节点独有的。

为了全面查看整个集群,用户可以利用 clusterAllReplicas 函数。此函数允许跨“default”集群中的所有副本查询系统表,将节点特定的数据整合到统一的结果中。这种方法对于监控和调试集群范围的操作尤其有价值,确保用户可以有效地分析其 ClickHouse Cloud 部署的健康状况和性能。

注意

ClickHouse Cloud 为冗余和故障转移提供多副本集群。这使其功能(如动态自动扩展和零 downtime 升级)成为可能。在某个时间点,新节点可能正在添加到集群或从集群中删除的过程中。要跳过这些节点,请将 SETTINGS skip_unavailable_shards = 1 添加到使用 clusterAllReplicas 的查询中,如下所示。

例如,考虑查询 query_log 表时的差异 - 这通常对于分析至关重要。

SELECT
hostname() AS host,
count()
FROM system.query_log
WHERE (event_time >= '2024-12-20 12:30:00') AND (event_time <= '2024-12-20 14:30:00')
GROUP BY host

┌─host──────────────────────────┬─count()─┐
│ c-ecru-oc-31-server-ectk72m-084132
└───────────────────────────────┴─────────┘

1 row in set. Elapsed: 0.010 sec. Processed 154.63 thousand rows, 618.55 KB (16.12 million rows/s., 64.49 MB/s.)


SELECT
hostname() AS host,
count()
FROM clusterAllReplicas('default', system.query_log)
WHERE (event_time >= '2024-12-20 12:30:00') AND (event_time <= '2024-12-20 14:30:00')
GROUP BY host SETTINGS skip_unavailable_shards = 1

┌─host──────────────────────────┬─count()─┐
│ c-ecru-oc-31-server-ectk72m-084132
│ c-ecru-oc-31-server-myt0lr4-081473
│ c-ecru-oc-31-server-5mp9vn3-084292
└───────────────────────────────┴─────────┘

3 rows in set. Elapsed: 0.309 sec. Processed 686.09 thousand rows, 2.74 MB (2.22 million rows/s., 8.88 MB/s.)
Peak memory usage: 6.07 MiB.

一般来说,在确定系统表是否是节点特定的时,可以应用以下规则

  • 带有 _log 后缀的系统表。
  • 公开指标的系统表,例如 metricsasynchronous_metricsevents
  • 公开正在进行的进程的系统表,例如 processesmerges