Skip to content

KingBaseES 日志轮换与归档

日志轮换与归档概述

KingBaseES 日志轮换与归档是指将数据库生成的日志文件按照一定的规则进行分割、压缩和存储的过程。合理的日志轮换与归档策略对于管理日志文件大小、优化存储空间使用、提高日志查询效率和满足合规要求具有重要意义。

日志轮换与归档的作用

  1. 控制日志大小:防止单个日志文件过大,便于管理和查询
  2. 优化存储空间:通过压缩和归档,减少日志文件占用的存储空间
  3. 提高查询效率:较小的日志文件查询速度更快
  4. 满足合规要求:根据法律法规和行业规范,保存必要的日志文件
  5. 便于故障排查:按时间分割的日志文件便于定位特定时间段的故障
  6. 防止磁盘空间耗尽:定期清理过期日志,避免日志占用过多磁盘空间

日志轮换与归档的特点

  1. 自动性:支持自动日志轮换,无需手动干预
  2. 可配置性:支持多种轮换策略和配置选项
  3. 灵活性:支持按时间、大小、行数等多种方式进行轮换
  4. 可靠性:日志轮换过程可靠,不会丢失日志数据
  5. 高效性:日志轮换和归档过程对数据库性能影响较小

日志类型与默认配置

KingBaseES 日志类型

KingBaseES 生成多种类型的日志文件,每种日志都有其特定的用途和默认配置:

  1. 错误日志:记录数据库的错误信息和警告信息
  2. 查询日志:记录所有执行的 SQL 查询
  3. 慢查询日志:记录执行时间超过指定阈值的 SQL 查询
  4. WAL 日志:记录数据库的事务日志,用于崩溃恢复和复制
  5. 审计日志:记录数据库的安全相关活动
  6. 监听日志:记录监听器的活动情况

默认日志配置

日志类型默认存储位置默认轮换策略默认保留时间
错误日志log/按天轮换7 天
查询日志log/按大小轮换(100MB)
慢查询日志log/按大小轮换(100MB)
WAL 日志pg_wal/按大小轮换(16MB)根据 wal_keep_segments 配置
审计日志audit/按天轮换
监听日志log/按天轮换7 天

日志轮换配置

核心配置参数

KingBaseES 的日志轮换配置主要通过 kingbase.conf 文件中的参数进行设置:

  1. log_rotation_age:按时间轮换日志,默认为 1d(1天)

    log_rotation_age = 1d
  2. log_rotation_size:按大小轮换日志,默认为 100MB

    log_rotation_size = 100MB
  3. log_truncate_on_rotation:是否截断同名日志文件,默认为 off

    log_truncate_on_rotation = off
  4. log_filename:日志文件名格式,默认为 kingbase-%Y-%m-%d_%H%M%S.log

    log_filename = 'kingbase-%Y-%m-%d_%H%M%S.log'
  5. log_directory:日志文件存储目录,默认为 log

    log_directory = 'log'
  6. logging_collector:是否启用日志收集器,默认为 on

    logging_collector = on
  7. log_compression:是否压缩旧日志,默认为 off

    log_compression = on

WAL 日志轮换配置

WAL 日志的轮换配置与其他日志不同,主要通过以下参数设置:

  1. wal_keep_segments:保留的 WAL 日志段数量,默认为 10

    wal_keep_segments = 10
  2. max_wal_size:控制 WAL 日志的最大大小,默认为 1GB

    max_wal_size = 1GB
  3. min_wal_size:控制 WAL 日志的最小大小,默认为 80MB

    min_wal_size = 80MB
  4. checkpoint_timeout:检查点超时时间,默认为 5min

    checkpoint_timeout = 5min
  5. checkpoint_completion_target:检查点完成目标,默认为 0.5

    checkpoint_completion_target = 0.5

日志轮换策略

按时间轮换

按时间轮换是指根据日志文件的创建时间或修改时间进行轮换,常用的时间单位包括:

  • s:秒
  • min:分钟
  • h:小时
  • d:天
  • w:周

配置示例

log_rotation_age = 1d  # 每天轮换一次日志

按大小轮换

按大小轮换是指根据日志文件的大小进行轮换,当日志文件超过指定大小时,自动创建新的日志文件。

配置示例

log_rotation_size = 100MB  # 日志文件超过 100MB 时轮换

按行数轮换

按行数轮换是指根据日志文件的行数进行轮换,当日志文件的行数超过指定数量时,自动创建新的日志文件。

配置示例

log_rotation_lines = 1000000  # 日志文件超过 100 万行时轮换

混合轮换策略

KingBaseES 支持混合轮换策略,可以同时按时间和大小进行轮换,当满足任一条件时即触发轮换。

配置示例

log_rotation_age = 1d
log_rotation_size = 100MB

日志归档策略

归档方式

KingBaseES 支持多种日志归档方式,包括:

  1. 本地归档:将日志归档到本地其他目录
  2. 远程归档:将日志归档到远程服务器
  3. 云存储归档:将日志归档到云存储服务,如 AWS S3、阿里云 OSS 等
  4. 磁带归档:将日志归档到磁带等离线存储设备

归档配置

  1. 启用归档

    archive_mode = on
  2. 配置归档命令

    archive_command = 'cp %p /path/to/archive/%f'
  3. 配置归档超时

    archive_timeout = 60  # 60 秒
  4. 配置归档重试次数

    archive_retry_count = 10

归档脚本示例

bash
#!/bin/bash
# KingBaseES 日志归档脚本

# 配置参数
SOURCE_DIR="/path/to/kingbase/log"
ARCHIVE_DIR="/path/to/archive"
REMOTE_HOST="backup-server"
REMOTE_DIR="/path/to/remote/archive"
RETENTION_DAYS=90

# 创建归档目录
mkdir -p $ARCHIVE_DIR

# 归档当天日志
DATE=$(date +%Y-%m-%d)
LOG_FILES=$(find $SOURCE_DIR -name "kingbase-$DATE*.log")

if [ -n "$LOG_FILES" ]; then
    # 压缩日志文件
    for FILE in $LOG_FILES; do
        gzip $FILE
    done
    
    # 复制到本地归档目录
    cp $SOURCE_DIR/kingbase-$DATE*.gz $ARCHIVE_DIR/
    
    # 复制到远程服务器
    rsync -avz $ARCHIVE_DIR/kingbase-$DATE*.gz $REMOTE_HOST:$REMOTE_DIR/
fi

# 清理过期日志
find $ARCHIVE_DIR -name "kingbase-*.gz" -mtime +$RETENTION_DAYS -delete
find $REMOTE_HOST:$REMOTE_DIR -name "kingbase-*.gz" -mtime +$RETENTION_DAYS -delete

日志管理工具

内置管理工具

  1. sys_logrotate:KingBaseES 内置的日志轮换工具,用于手动触发日志轮换

    bash
    sys_logrotate
  2. sys_archivecleanup:用于清理归档的 WAL 日志文件

    bash
    sys_archivecleanup /path/to/archive 00000001000000000000000A
  3. kingbase-backup.sh:KingBaseES 备份脚本,支持备份和归档日志

    bash
    kingbase-backup.sh --archive

第三方管理工具

  1. logrotate:Linux 系统自带的日志管理工具,支持多种日志轮换策略

    bash
    # 配置示例
    /path/to/kingbase/log/*.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 0644 kingbase kingbase
    }
  2. ELK Stack:使用 Elasticsearch、Logstash、Kibana 进行日志收集、分析和归档

    yaml
    # Logstash 配置示例
    input {
      file {
        path => "/path/to/kingbase/log/*.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
      }
    }
    
    output {
      elasticsearch {
        hosts => ["localhost:9200"]
        index => "kingbase-%{+YYYY.MM.dd}"
      }
    }
  3. Graylog:使用 Graylog 进行日志管理和归档

    yaml
    # Graylog 输入配置
    inputs:
      - title: KingBaseES Logs
        type: file
        configuration:
          path_pattern: /path/to/kingbase/log/*.log
          read_old_file: true

版本差异(V8 R6 vs V8 R7)

日志轮换增强

  1. V8 R7 新增配置参数

    • log_rotation_compress:支持自动压缩旧日志
    • log_rotation_max_size:设置日志文件的最大大小
    • log_rotation_max_age:设置日志文件的最大保留时间
    • log_rotation_max_files:设置日志文件的最大数量
  2. 轮换策略优化

    • V8 R7 优化了日志轮换算法,减少了轮换过程对数据库性能的影响
    • 支持更灵活的轮换策略配置
    • 新增了按行数轮换的支持
  3. 归档功能增强

    • V8 R7 增强了归档功能,支持更多的归档目标
    • 新增了归档验证功能,确保归档文件的完整性
    • 优化了归档重试机制,提高了归档可靠性
  4. 性能优化

    • V8 R7 优化了日志写入和轮换性能
    • 支持异步日志写入,减少了日志写入对数据库性能的影响
    • 优化了日志压缩算法,提高了压缩效率

最佳实践

日志轮换配置最佳实践

  1. 根据日志类型配置不同的轮换策略

    • 错误日志:建议按天轮换,保留 7-30 天
    • 慢查询日志:建议按大小轮换(100MB),保留 30-90 天
    • WAL 日志:根据复制需求和存储空间配置保留时间
    • 审计日志:建议按天轮换,保留 90-180 天
  2. 启用日志压缩

    log_compression = on
  3. 合理设置轮换阈值

    • 按时间轮换:根据业务需求和日志生成量设置,建议 1-7 天
    • 按大小轮换:根据存储空间和查询需求设置,建议 50-200MB
    • 按行数轮换:根据日志行数和查询需求设置,建议 50-200 万行
  4. 配置日志文件权限

    log_file_mode = 0640

日志归档最佳实践

  1. 制定归档策略:根据业务需求和合规要求,制定合理的归档策略

    • 本地归档:保留近期日志,便于快速访问
    • 远程归档:保留中期日志,用于灾难恢复
    • 云存储归档:保留长期日志,用于合规检查
  2. 归档文件命名规范:使用清晰的命名规范,便于查找和管理

    kingbase-YYYY-MM-DD-HHMMSS.log.gz
  3. 验证归档完整性:定期验证归档文件的完整性,确保归档文件可用于恢复

    bash
    # 使用 md5sum 验证归档文件完整性
    md5sum kingbase-2023-10-01*.gz > archive_checksum.txt
  4. 测试归档恢复:定期测试从归档日志恢复的过程,确保归档策略有效

日志管理最佳实践

  1. 监控日志增长:监控日志文件的增长情况,及时调整日志配置

    bash
    # 使用 Zabbix 监控日志目录大小
    vfs.dir.size[/path/to/kingbase/log,kingbase-*.log]
  2. 配置告警:当日志目录大小超过阈值时触发告警

    yaml
    # Prometheus 告警规则
    groups:
    - name: kingbase_alerts
      rules:
      - alert: LogDirectoryTooLarge
        expr: node_filesystem_size_bytes{mountpoint="/var"} - node_filesystem_avail_bytes{mountpoint="/var"} > 80 * 1024 * 1024 * 1024
        for: 1h
        labels:
          severity: warning
        annotations:
          summary: "Log directory is too large"
          description: "Log directory /var is using more than 80GB"
  3. 定期清理过期日志:根据保留策略,定期清理过期日志

    bash
    # 清理 90 天前的日志
    find /path/to/kingbase/log -name "kingbase-*.log" -mtime +90 -delete
  4. 集中日志管理:对于多实例部署,建议使用集中式日志管理系统,如 ELK Stack 或 Graylog

  5. 文档化日志策略:将日志轮换和归档策略文档化,便于团队成员理解和执行

常见问题(FAQ)

Q1:日志轮换失败怎么办?

A:可能的原因和解决方法:

  1. 磁盘空间不足:清理磁盘空间,或增加磁盘容量
  2. 文件权限问题:检查日志文件和目录的权限,确保 KingBaseES 用户有写入权限
  3. 归档命令错误:检查归档命令配置,确保命令正确
  4. 归档目标不可访问:检查归档目录或远程服务器是否可访问
  5. 日志文件被占用:确保没有其他进程正在使用日志文件

Q2:如何查看日志轮换配置?

A:可以通过以下方式查看日志轮换配置:

  1. 查看配置文件 kingbase.conf

    bash
    grep "log_rotation" /path/to/kingbase/kingbase.conf
  2. 使用 SQL 命令查看:

    sql
    SHOW log_rotation_age;
    SHOW log_rotation_size;
    SHOW log_compression;

Q3:如何手动触发日志轮换?

A:可以通过以下方式手动触发日志轮换:

  1. 使用内置工具 sys_logrotate

    bash
    sys_logrotate
  2. 使用 SQL 命令:

    sql
    SELECT pg_rotate_logfile();
  3. 发送 SIGHUP 信号到 KingBaseES 进程:

    bash
    kill -HUP $(cat /path/to/kingbase/data/postmaster.pid | head -1)

Q4:如何恢复归档的日志?

A:可以通过以下方式恢复归档的日志:

  1. 本地恢复:将归档的日志复制回日志目录

    bash
    cp /path/to/archive/kingbase-2023-10-01*.gz /path/to/kingbase/log/
    gunzip /path/to/kingbase/log/kingbase-2023-10-01*.gz
  2. 使用恢复命令

    sql
    SELECT pg_recovery_from_archive('kingbase-2023-10-01.log');

Q5:如何监控日志轮换和归档状态?

A:可以通过以下方式监控日志轮换和归档状态:

  1. 查看日志文件:检查日志文件的创建时间和大小,确认日志轮换是否正常

    bash
    ls -la /path/to/kingbase/log/
  2. 查看归档目录:检查归档目录中是否有新的归档文件

    bash
    ls -la /path/to/archive/
  3. 使用监控工具:配置监控工具,监控日志轮换和归档状态

    yaml
    # Zabbix 监控项
    vfs.file.age[/path/to/kingbase/log/kingbase-$(date +%Y-%m-%d).log]

Q6:如何优化日志轮换和归档性能?

A:可以通过以下方式优化日志轮换和归档性能:

  1. 使用快速存储设备:将日志存储在 SSD 等快速存储设备上
  2. 优化归档命令:使用高效的归档命令和工具,如 rsync 替代 scp
  3. 并行归档:对于大规模部署,考虑使用并行归档策略
  4. 异步归档:使用异步归档方式,减少对数据库性能的影响
  5. 合理设置轮换阈值:根据日志生成量,合理设置轮换阈值,避免频繁轮换

总结

KingBaseES 日志轮换与归档是数据库运维的重要组成部分,对于管理日志文件、优化存储空间、提高查询效率和满足合规要求具有重要意义。通过合理配置日志轮换和归档策略,可以确保日志文件得到有效管理,同时减少对数据库性能的影响。

在实际部署过程中,需要根据数据库规模、业务需求和合规要求,制定合理的日志轮换和归档策略。同时,要关注不同版本间的差异,充分利用新版本提供的增强功能。

通过日志轮换与归档的有效管理,可以帮助 DBA 更好地管理日志文件,提高数据库系统的可靠性和可用性,保障业务的正常运行。