系统表概述
系统表概述
系统表提供以下信息:
- 服务器状态、进程和环境。
- 服务器的内部进程。
- 构建 ClickHouse 二进制文件时使用的选项。
系统表:
- 位于
system
数据库中。 - 仅支持读取数据。
- 不能被删除或修改,但可以被分离。
大多数系统表将其数据存储在 RAM 中。ClickHouse 服务器在启动时创建这些系统表。
与其他系统表不同,系统日志表 metric_log, query_log, query_thread_log, trace_log, part_log, crash_log, text_log 和 backup_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_by
和ttl
冲突。如果一起设置,服务器将引发异常并退出。
示例:
默认情况下,表的增长是无限的。要控制表的大小,可以使用 TTL 设置来删除过时的日志记录。还可以使用 MergeTree
引擎表的分区功能。
系统指标的来源
为了收集系统指标,ClickHouse 服务器使用:
CAP_NET_ADMIN
权限。- procfs(仅限 Linux)。
procfs
如果 ClickHouse 服务器没有 CAP_NET_ADMIN
权限,它会尝试回退到 ProcfsMetricsProvider
。ProcfsMetricsProvider
允许收集每个查询的系统指标(对于 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
的系统表。 - 公开指标的系统表,例如
metrics
、asynchronous_metrics
、events
。 - 公开正在进行的进程的系统表,例如
processes
、merges
。
此外,系统表的新版本可能是由于升级或架构更改而创建的。这些版本使用数字后缀命名。
例如,考虑 system.query_log
表,它包含节点执行的每个查询的一行:
查询多个版本
我们可以使用 merge
函数跨这些表进行查询。例如,以下查询识别向每个 query_log
表发出的最新查询:
虽然表上的数字后缀可以暗示数据的顺序,但绝不能依赖此顺序。因此,始终在目标特定日期范围时,使用合并表函数结合日期过滤器。
重要的是,这些表仍然是 每个节点本地的。
跨节点查询
为了全面查看整个集群,用户可以利用 clusterAllReplicas
函数结合 merge
函数。clusterAllReplicas
函数允许查询 "default" 集群中所有副本的系统表,将特定于节点的数据整合为统一结果。结合 merge
函数,这可以用于针对集群中特定表的所有系统数据。
这种方法对于监控和调试集群范围的操作尤其有价值,确保用户可以有效分析其 ClickHouse Cloud 部署的健康状况和性能。
ClickHouse Cloud 提供多个副本的集群以实现冗余和故障转移。这启用其特性,例如动态自动扩展和零停机时间升级。在某个时刻,新的节点可能正在添加到集群中或从集群中移除。要跳过这些节点,请在查询中添加 SETTINGS skip_unavailable_shards = 1
,使用 clusterAllReplicas
,如下面所示。
例如,考虑在查询 query_log
表时的差异 - 这对于分析通常是必不可少的。
跨节点和版本查询
由于系统表版本化,这仍然不能代表集群中的完整数据。当将上述内容与 merge
函数结合使用时,我们获得了目标日期范围的准确结果: