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

系统表概述

系统表概述

系统表提供以下信息:

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

系统表:

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

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

与其他系统表不同,系统日志表 metric_log, query_log, query_thread_log, trace_log, part_log, crash_log, text_logbackup_log 使用 MergeTree 表引擎,并默认将其数据存储在文件系统中。如果从文件系统中删除一个表,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 节点获取数据的系统表,Keeper 节点管理分布式元数据。这些表反映了集群的整体状态,并在查询单个节点时应保持一致。例如,parts 表应该无论从哪个节点查询都保持一致:

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

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

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

此外,系统表的新版本可能是由于升级或架构更改而创建的。这些版本使用数字后缀命名。

例如,考虑 system.query_log 表,它包含节点执行的每个查询的一行:

查询多个版本

我们可以使用 merge 函数跨这些表进行查询。例如,以下查询识别向每个 query_log 表发出的最新查询:

不要依赖数字后缀进行排序

虽然表上的数字后缀可以暗示数据的顺序,但绝不能依赖此顺序。因此,始终在目标特定日期范围时,使用合并表函数结合日期过滤器。

重要的是,这些表仍然是 每个节点本地的

跨节点查询

为了全面查看整个集群,用户可以利用 clusterAllReplicas 函数结合 merge 函数。clusterAllReplicas 函数允许查询 "default" 集群中所有副本的系统表,将特定于节点的数据整合为统一结果。结合 merge 函数,这可以用于针对集群中特定表的所有系统数据。

这种方法对于监控和调试集群范围的操作尤其有价值,确保用户可以有效分析其 ClickHouse Cloud 部署的健康状况和性能。

备注

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

例如,考虑在查询 query_log 表时的差异 - 这对于分析通常是必不可少的。

跨节点和版本查询

由于系统表版本化,这仍然不能代表集群中的完整数据。当将上述内容与 merge 函数结合使用时,我们获得了目标日期范围的准确结果: