日志
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. 没有关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,本文仅将其用于标识目的。