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

系统表概述

介绍

系统表提供以下信息:

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

系统表:

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

大多数系统表将其数据存储在内存中。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 冲突。如果同时设置,服务器将引发异常并退出。

示例:

默认情况下,表的增长是无限的。要控制表的大小,可以使用 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/ 中创建一个 .conf 文件,内容为 kernel.task_delayacct = 1

ClickHouse Cloud 中的系统表

在 ClickHouse Cloud 中,系统表提供对服务状态和性能的关键见解,如同在自管理的部署中一样。一些系统表在集群级别操作,尤其是那些从 Keeper 节点获取其数据的系统表,这些节点管理分布式元数据。这些表反映集群的整体状态,并在对各个节点进行查询时应保持一致。例如,parts 的查询结果应无论从哪个节点查询都保持一致:

相反,其他系统表是节点特定的,例如使用 MergeTree 表引擎在内存中或持久化其数据。这种情况通常适用于日志和指标等数据。这种持久化确保历史数据可用于分析。然而,这些节点特定的表在每个节点上本质上是唯一的。

要全面查看整个集群,用户可以利用 clusterAllReplicas 函数。此函数允许在 "default" 集群内跨所有副本查询系统表,将节点特定数据汇总为统一的结果。这种方法对于监控和调试集群级操作尤其有价值,确保用户能够有效分析 ClickHouse Cloud 部署的健康和性能。

备注

ClickHouse Cloud 提供多个副本的集群以确保冗余和故障转移。这启用了动态自动扩展和零停机升级等功能。在某个时间点,新节点可能正在添加到集群中,或从集群中移除。要跳过这些节点,可以在使用 clusterAllReplicas 的查询中添加 SETTINGS skip_unavailable_shards = 1,如下所示。

例如,考虑查询 query_log 表时的区别——这些表通常对分析很重要。

一般而言,在判断系统表是否为节点特定时,可以应用以下规则:

  • _log 结尾的系统表。
  • 曝露度量的系统表,例如 metricsasynchronous_metricsevents
  • 曝露正在进行的进程的系统表,例如 processesmerges