clickhouse 日志文件

日志说明

metric_log

功能:记录 ClickHouse 的实时监控指标(如 CPU、内存、磁盘、查询数等),默认每分钟写入一次。

数据内容:event_time, metric, value。

影响:高频写入,长期积累可能占用较大磁盘空间;读取时可能短暂占用内存。

优化建议:
    启用 TTL:保留最近 7 天数据。
        ALTER TABLE system.metric_log MODIFY TTL event_date + INTERVAL 7 DAY;

降低写入频率:在 config.xml 中调整采集间隔(需重启服务):
    <metric_log>
        <flush_interval_milliseconds>60000</flush_interval_milliseconds> <!-- 默认 1 分钟 -->
    </metric_log>

asynchronous_metric_log

功能:记录异步采集的系统级监控指标(如操作系统资源使用率),更新频率较低(默认 10 秒)。

数据内容:event_time, metric, value。

影响:低频写入,磁盘占用较小,对内存影响可忽略。

优化建议: 调整采集间隔(非必要不建议修改)
    <asynchronous_metric_log>
        <flush_interval_milliseconds>30000</flush_interval_milliseconds> <!-- 改为 30 秒 -->
    </asynchronous_metric_log>

trace_log

功能:记录内部操作的详细追踪信息(如线程活动、锁竞争),用于深度性能分析。

数据内容:event_time, trace_type, thread_id, query_id。

影响:仅在开启追踪时写入(默认关闭),对生产环境性能有轻微影响。

text_log

功能:记录 ClickHouse 服务的运行日志(类似传统日志文件),包括错误、警告、信息级消息。

数据内容:event_time, thread_id, log_level, message。

影响:日志级别越低(如 trace),写入越频繁,可能占用更多内存和磁盘。

优化建议:
    提高日志级别:仅记录警告及以上。
        <text_log>
            <level>warning</level> <!-- 可选:trace, debug, information, warning, error -->
        </text_log>

    限制日志大小:
        <text_log>
            <max_size_rows>500000</max_size_rows>
            <buffer_size_rows_flush_threshold>250000</buffer_size_rows_flush_threshold>
        </text_log>

latency_log

功能:记录慢查询的延迟详情(需手动开启),用于分析查询性能瓶颈。

数据内容:query_id, event_time, duration_ms, query。

影响:仅在慢查询触发时写入,对系统影响小。

优化建议:
    按需配置阈值:
        <latency_log>
            <enable>1</enable>
            <threshold_ms>1000</threshold_ms> <!-- 记录超过 1 秒的查询 -->
        </latency_log>

query_log

功能:记录所有执行过的查询详情(包括成功/失败的查询)。

数据内容:query_id, query, user, duration_ms, memory_usage。

影响:高频写入,可能成为磁盘和内存的小负担。

优化建议:
    启用 TTL 清理:
        ALTER TABLE system.query_log MODIFY TTL event_date + INTERVAL 3 DAY;

    过滤敏感查询:避免记录含敏感信息的查询。
        <query_log>
            <log_queries=0</log_queries> <!-- 完全关闭(不推荐) -->
        </query_log>

processors_profile_log

功能:记录查询执行过程中各处理器的性能数据(用于分析查询流水线瓶颈)。

数据内容:event_time, processor_name, elapsed_us, rows。

影响:默认关闭,开启后对性能有轻微影响。

优化建议: 按需启用
    <processors_profile_log>
        <enabled>1</enabled> <!-- 默认关闭 -->
    </processors_profile_log>

error_log

功能:记录 ClickHouse 运行时的错误事件(如启动失败、崩溃)。

数据内容:event_time, error_code, message。

影响:低频写入,占用极低。

part_log 

功能:记录 MergeTree 引擎表的分区操作(如合并、下载、删除)。

数据内容:event_type, table, partition_id, duration_ms。

影响:对系统性能影响可忽略,但高频分区操作可能积累数据。

优化建议:清理旧日志
    ALTER TABLE system.part_log DELETE WHERE event_date < today() - 7;

删除执行过程说明

删除操作的两阶段流程

ClickHouse 的删除操作并非立即物理删除数据,而是分两步完成:

逻辑删除(标记阶段)
    当执行 ALTER TABLE ... DELETE 语句时:
        目标数据会被标记为 "已删除"(更新元数据)。
        数据文件仍保留在磁盘上,但查询时会自动过滤这些数据。
        此时磁盘空间不会释放,仅逻辑上不可见。

物理删除(合并阶段)
    在后台的 Merge 过程 中:
        ClickHouse 合并多个数据分片(parts)时,自动跳过已标记删除的数据。
        合并后的新分片不再包含已删除数据,旧分片文件被移除。
        此时磁盘空间真正释放。

合并触发的条件

Merge 操作由 ClickHouse 后台任务自动触发,条件包括:

    数据分片数量达到阈值:默认当同一分区有多个小分片时触发合并。
    手动强制执行:通过 OPTIMIZE TABLE [table] FINAL 命令立即触发合并。
    TTL 机制:当数据过期时自动触发合并以清理空间

查询系统库表占用

SELECT 
    table,
    formatReadableSize(sum(bytes_on_disk)) AS disk_size
FROM system.parts
WHERE database = 'system'
GROUP BY table
ORDER BY disk_size DESC;
   ┌─table─────────┬─disk_size ┐
1. │ processors_profile_log  │ 69.81 GiB  │
2. │ query_views_log         │ 5.25 GiB   │
3. │ trace_log               │ 49.58 GiB  │
4. │ metric_log              │ 4.74 GiB   │
5. │ asynchronous_metric_log │ 4.23 GiB   │
6. │ error_log               │ 340.82 KiB │
7. │ part_log                │ 19.59 GiB  │
8. │ text_log                │ 167.21 GiB │
9. │ query_log               │ 113.69 GiB │
   └─────────── ─┴──────┘

清理日志

text_log

方法一

-- 清理 7 天前的数据(假设有时间字段 `event_time`)
ALTER TABLE system.text_log DELETE WHERE event_time < now() - toIntervalDay(7);
Query id: 5287d612-2c47-43c7-90f7-307346e99118

Ok.

0 rows in set. Elapsed: 0.016 sec.

强制合并释放(可选)

OPTIMIZE TABLE system.text_log FINAL;

方法二

drop table system.text_log;
Query id: 301ae000-6a6c-4ac8-b8ef-38a54d9f14e8

Ok.

0 rows in set. Elapsed: 0.039 sec. 

查看 Mutation 任务

SELECT * FROM system.mutations WHERE table = 'text_log';
Row 1:
──────
database:                   system
table:                      text_log
mutation_id:                mutation_2014899.txt
command:                    DELETE WHERE event_time < (now() - toIntervalDay(7))
create_time:                2025-03-06 12:41:57
block_numbers.partition_id: ['']
block_numbers.number:       [2014899]
parts_to_do_names:          ['202502_1763937_1880472_11_1845452','202502_1880473_1924005_8','202502_1924006_1937260_6','202502_1937261_1952389_24','202503_1953027_1964232_7','202503_1964233_1974831_7','202503_1974832_1984011_7','202503_1984012_1993142_7','202503_1993143_2000845_7','202503_2000846_2002831_5','202503_2002832_2004782_5','202503_2004783_2006468_5','202503_2006469_2008063_5','202503_2008064_2009521_5','202503_2009522_2011077_5','202503_2011078_2012245_5','202503_2012246_2012575_4_2014898','202503_2012576_2012846_4_2014898','202503_2012847_2013176_4_2014898','202503_2013177_2013420_4_2014898','202503_2013421_2013682_4_2014898','202503_2013683_2013921_4_2014898','202503_2013922_2014179_4_2014898','202503_2014180_2014375_4_2014898','202503_2014376_2014597_4_2014898','202503_2014598_2014773_4_2014898']
parts_to_do:                26
is_done:                    0
is_killed:                  0
latest_failed_part:         202503_2014598_2014773_4_2014898
latest_fail_time:           2025-03-06 12:43:14
latest_fail_reason:         Code: 243. DB::Exception: Cannot reserve 300.02 MiB, not enough space. (NOT_ENOUGH_SPACE) (version 24.8.4.13 (official build))

1 row in set. Elapsed: 0.003 sec. 
is_done = 1 表示任务完成。
未完成的任务会阻塞后续同类操作。

优化清理

按时间删除

-- 清理 7 天前的数据(假设有时间字段 `event_time`)
ALTER TABLE system.text_log DELETE WHERE event_time < now() - toIntervalDay(7);

配置 TTL 自动清理

-- 添加 TTL 规则(按时间自动过期)保留3天
ALTER TABLE system.text_log MODIFY TTL event_time + INTERVAL 3 DAY;

调整日志配置

修改 config.xml 配置文件

<!-- 限制日志表最大行数 -->
<text_log>
  <max_size_rows>500000</max_size_rows>  <!-- 保留50万行 -->
  <buffer_size_rows_flush_threshold>250000</buffer_size_rows_flush_threshold>
</text_log>
<query_log>
  <max_size_rows>500000</max_size_rows>  <!-- 50万行 -->
  <ttl>259200</ttl>  <!-- 3天过期 -->
</query_log>
systemctl restart clickhouse-server

验证优化效果

检查清理后空间释放

SELECT table, formatReadableSize(sum(bytes_on_disk)) AS disk_size FROM system.parts WHERE database = 'system' AND table LIKE '%_log' GROUP BY table;

监控日志写入频率

SELECT event_time, count() FROM system.text_log GROUP BY event_time ORDER BY event_time DESC LIMIT 10;
posted @ 2025-03-12 15:35  小吉猫  阅读(566)  评论(0)    收藏  举报