作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


背景

VictoriaLogs(https://github.com/VictoriaMetrics/VictoriaLogs) 是一个性能强悍的日志存储组件。
VictoriaLogs 中通过 -retention 参数来设定日志允许保存的天数。对日志保存天数设定最大值是有意义的:一方面,让系统的资源集中去处理最近 N 天的价值最大的 log;另一方面,淘汰旧日志才能减少存储成本。
为了保障对近期的日志对写入和查询又较快的响应速度,我们购买了比较昂贵的 PVC 存储。

因为 PVC 比较贵,所以 VictoriaLogs 一般只配置 7 天或者 3 天。
但有时候又会要求可以追溯到更远的日志去分析问题。

为此,衍生出了新的需求:

  • 超过 -retention 配置的日志,可以使用 S3 这样的高性价的对象存储
  • 当需要偶尔查询过去的日志时,可以从 S3 上恢复日志,并且可以使用 logsql 来进行分析

VictoriaLogs 目前还不支持上述功能,于是我自己搓了一个出来:

VictoriaLogsS3Adapter

请看:https://github.com/ahfuzhang/VictoriaLogsS3Adapter/blob/main/README_cn.md

整体的架构如下:

image

部署

提供了命令行工具 victoria_logs_s3_backup,可用于把某一天的日志打包为 tar 文件,然后上传到 S3.
也可以设定在每天的某个时刻进行前一天数据的备份。

当部署环境时 k8s 时,可以在 VLSingle 这个 CRD 对象上增加 containers 的配置,以 sidecar 的方式进行定期备份。具体请看:https://github.com/ahfuzhang/VictoriaLogsS3Adapter/blob/main/docs/vlsingle_backup_cn.md

恢复

我首先实现了一个 victoria logs 的代理服务器,叫做 victoria_logs_s3_restore_svr.
每次查询 vlogs 服务器时,检查 start / end 参数的时间范围,如果对应的数据目录不存在,就从 s3 上下载备份文件,进行恢复,然后再转发请求到 vlogs 进程。
恢复过程中,使用 /tmp/ 目录作为存储即可,无需昂贵的 PVC 支持。

当然,没有免费的午餐 —— 从备份数据查询,必然带来更高的延迟。

部署的细节请见:https://github.com/ahfuzhang/VictoriaLogsS3Adapter/blob/main/docs/k8s_restore_svr_cn.md

实现原理

这个工具能够实现备份和恢复,主要取决于 vlogs 提供的以下能力:

  • 日志数据的索引部分和数据部分,是严格按照 YYYYMMDD 这样格式的日期作为目录的
  • vlogs 的 http 接口,提供了创建快照和删除快照的能力:
# snapshot 列表
curl http://192.168.1.2:9428/internal/partition/snapshot/list
["/data/partitions/20261104/snapshots/20261104091028-18C876EFEB03599A"]

# 删除快照
curl "http://192.168.1.2:9428/internal/partition/snapshot/delete?path=/data/partitions/20261104/snapshots/20261104091028-18C876EFEB03599A"

# 创建快照
curl "http://192.168.1.2:9428/internal/partition/snapshot/create?partition_prefix=20261104"

# 打包快照文件
cd /home/ahfu/VictoriaLogsData/partitions/20261104/snapshots
tar -cf ~/20261104.tar ./20261104091211-18C876EFEB03599B
  • 直接在 vlogs 的数据目录的 partitions 目录下写入 YYYYMMDD 格式的数据文件夹,vlogs 便能够提供查询

由此,基于以上备份和恢复都可以很简单的实现出来。

希望对你有用,Have Fun. 😃