日志

ClickHouse® 服务器将其自身的日志文件写入服务器容器内的 /var/log/clickhouse-server。本页面介绍这些文件的存储位置、如何使其在重启后保留,以及如何读取这些文件。

默认行为:日志是临时的

如果不声明日志卷,operator 会在 Pod 的每个容器中,将一个 emptyDir 挂载到日志目录。Pod 存在期间可以读取日志,Pod 被替换后日志将丢失。

对于短期调试,这通常已经足够:

kubectl -n <namespace> logs chi-<instance>-<cluster>-0-0-0 -c clickhouse
kubectl -n <namespace> exec chi-<instance>-<cluster>-0-0-0 -c clickhouse -- \
  tail -n 200 /var/log/clickhouse-server/clickhouse-server.err.log

在卷上持久化日志

声明卷声明模板,并将 logVolumeClaimTemplate 指向该模板:

apiVersion: clickhouse.altinity.com/v1
kind: ClickHouseInstallation
metadata:
  name: e1-logs
spec:
  defaults:
    templates:
      dataVolumeClaimTemplate: data-volume
      logVolumeClaimTemplate: log-volume
      podTemplate: ch-pod
  configuration:
    clusters:
      - name: main
        layout:
          shardsCount: 1
          replicasCount: 1
  templates:
    podTemplates:
      - name: ch-pod
        spec:
          securityContext:
            runAsUser: 101
            runAsGroup: 101
            fsGroup: 101
            runAsNonRoot: true
            seccompProfile:
              type: RuntimeDefault
          containers:
            - name: clickhouse
              securityContext:
                allowPrivilegeEscalation: false
                readOnlyRootFilesystem: true
                capabilities:
                  drop:
                    - ALL
            - name: clickhouse-log
              securityContext:
                runAsUser: 65534
                runAsNonRoot: true
                allowPrivilegeEscalation: false
                readOnlyRootFilesystem: true
                capabilities:
                  drop:
                    - ALL
                seccompProfile:
                  type: RuntimeDefault
    volumeClaimTemplates:
      - name: data-volume
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 50Gi
      - name: log-volume
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 10Gi

日志卷会挂载到 Pod 的每个容器中的 /var/log/clickhouse-server,因此 sidecar 可以看到服务器写入的相同文件。

clickhouse-log 容器

设置 logVolumeClaimTemplate 会改变 Pod 的结构。operator 会向 Pod 追加第二个名为 clickhouse-log 的容器,其唯一任务是保持运行,以便你可以 exec 进入其中并读取日志卷,而不会干扰服务器。它会在循环中休眠,并以 uid 65534 运行。

该注入的容器有意保持最小化,其安全上下文仅设置用户 ID。在强制实施 Pod Security Admission restricted 配置文件的命名空间中,这还不够,Pod 会被拒绝。

上面的 Pod 模板就是解决方案,这也是显式声明 clickhouse-log 容器的原因。如果 Pod 模板中已经存在一个名称完全相同的容器,operator 会复用该容器,而不是追加自己的容器——只有在你将其留空或设置为 default 时,operator 才会填充镜像。因此,自行声明该容器是为其提供完整安全上下文的受支持方式。

如果你已经遇到过被拒绝的情况,请参阅Pod 被 Pod Security Admission 拒绝

读取持久化日志

kubectl -n <namespace> exec chi-<instance>-<cluster>-0-0-0 -c clickhouse-log -- \
  ls -l /var/log/clickhouse-server

kubectl -n <namespace> exec chi-<instance>-<cluster>-0-0-0 -c clickhouse-log -- \
  tail -n 200 /var/log/clickhouse-server/clickhouse-server.log

大小与轮换

日志卷是固定大小的 PersistentVolumeClaim。日志卷已满会降低服务器性能,因此应根据保留需求设置大小,并验证所依赖的轮换策略确实已生效。日志轮换属于服务器配置问题,通过 spec.configuration.settings 进行设置,方式与其他服务器设置相同。

查询日志

运行时历史记录——查询、数据片段、合并、变更——位于服务器自己的系统表中,而不是文本日志中。通过任意客户端查询:

SELECT event_time, query_duration_ms, read_rows, query
FROM system.query_log
WHERE type = 'QueryFinish'
ORDER BY event_time DESC
LIMIT 20;

ClickHouse 是 ClickHouse, Inc. 的注册商标。https://clickhouse.com

Alauda 是一家独立供应商。本产品与 ClickHouse, Inc. 没有关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,本文仅将其用于标识目的。