清理 OpenResty Edge Log Server 数据库数据

OpenResty Edge Log Server 数据库主要存储错误日志、WAF 日志和动态指标数据等。其中,WAF 日志和动态指标数据通常会占用较大空间。这些数据均采用时序数据库进行存储。本文将详细介绍如何调整时序数据库策略并进行数据清理。

默认时序表概览

表名用途Chunk 间隔数据保留期
errlog_tsdb错误日志7 天1 个月
waf_request_tsdbWAF 命中请求7 天1 个月
waf_matches_tsdbWAF 命中详情7 天2 个月
events事件记录7 天1 个月
cc_log_tsdb限速请求信息1 天7 天
_dymetrics_动态指标数据3 天1 个月

数据库操作步骤

登录数据库

/usr/local/openresty-postgresql12/bin/psql -h 127.0.0.1 -p 5432 -U postgres -d or_edge_log_server

查询时序表大小

基础查询:

SELECT table_name, table_size, total_size
FROM timescaledb_information.hypertable
WHERE table_schema='public' AND total_size IS NOT NULL;

增强可读性的查询:

SELECT table_name, table_schema, pg_size_bytes(total_size) / 1024 / 1024 AS total_size_mb
FROM timescaledb_information.hypertable
WHERE total_size IS NOT NULL
ORDER BY total_size DESC;

查看时序库清理策略

SELECT * FROM timescaledb_information.drop_chunks_policies;

输出示例解析:

字段示例值说明
hypertableerrlog_tsdb应用清理策略的超表名称
older_than(t,“1 mon”,)删除早于 1 个月的数据块
cascadef不级联删除依赖对象
job_id1000关联的后台作业 ID
schedule_interval1 day策略执行频率
max_runtime00:05:00单次作业最大运行时间
max_retries-1失败后最大重试次数(-1 表示无限重试)
retry_period00:05:00重试间隔时间
cascade_to_materializationsf不级联删除物化视图

查询 Chunk 间隔

SELECT b.table_name,
       (a.interval_length / 24 / 60 / 60 / 1000000)::text || ' day(s)' AS interval
FROM _timescaledb_catalog.dimension AS a
LEFT JOIN _timescaledb_catalog.hypertable AS b ON b.id = a.hypertable_id;

优化时序数据库策略

注意:Chunk 间隔不应超过保留数据时间的一半。 以下以 errlog_tsdb 为例,演示如何将策略调整为:保留 14 天数据,Chunk 间隔为 2 天。

操作步骤:

  1. 删除现有清理策略:

    SELECT remove_drop_chunks_policy('errlog_tsdb', if_exists => TRUE);
    
  2. 添加新的清理策略:

    SELECT add_drop_chunks_policy('errlog_tsdb', INTERVAL '2 week', cascade_to_materializations => FALSE);
    
  3. 修改 Chunk 间隔:

    SELECT set_chunk_time_interval('errlog_tsdb', INTERVAL '2 day');
    
  4. 清理过期数据:

    SELECT drop_chunks(table_name => 'errlog_tsdb', older_than => INTERVAL '2 week', cascade_to_materializations => FALSE);
    

通过以上步骤,您可以有效减少 OpenResty Edge Log Server 的数据库占用的硬盘空间,确保 Log Server 服务的可用性。