月度归档: 2025 年 8 月

Influxdb oss v2版本-增量数据每日备份与恢复方案设计

1. 方案概述

本方案提供了一套完整的 InfluxDB OSS v2版本数据库异地增量备份与恢复机制,通过在生产环境和恢复环境分别部署 Docker 容器,利用云服务商oss对象存储实现跨地域数据备份和快速故障切换。该方案旨在确保时序数据的安全性、完整性和高可用性,同时优化存储空间利用率。

关联代码: https://github.com/lizhenwei/influxdb_backup_daily

方案目标

  • 建立可靠的数据异地备份机制,防止生产环境数据丢失,
  • 可按日期进行恢复,若出现故障可回滚至最多14天前的数据
  • 实现跨地域的备份恢复流程,支持快速故障切换
  • 管理数据生命周期,平衡存储成本与数据保留需求
  • 提供灵活的配置选项,适应实际业务场景需求

2. 架构设计

本方案采用双环境容器化设计,生产环境部署备份容器,备份地域部署恢复环境运行恢复容器,两者通过云服务商提供的对象存储共享备份数据。
当出现故障时,把备份环境的influxdb数据库目录完整复制到生产环境上,然后决定恢复到那一天


3. 核心功能

3.1 生产环境每日增量备份

备份流程自动执行,每日捕获前一天的增量数据并存储为压缩文件.

3.1.1 关键代码

# -----------------------
# 复制昨天的数据到新 bucket
# -----------------------
influx query \
  --org "$ORG" \
  --host "$HOST" \
  --token "$TOKEN" \
  "from(bucket:\"$SOURCE_BUCKET\")
    |> range(start: ${YESTERDAY}T00:00:00Z, stop: ${YESTERDAY}T23:59:59Z)
    |> to(bucket:\"$BUCKET\")"
# -----------------------
# 备份 bucket
# -----------------------
mkdir -p "$BACKUP_DIR"
influx backup \
  "$BACKUP_DIR" \
  --bucket "$BUCKET" \
  --org "$ORG" \
  --host "$HOST" \
  --token "$TOKEN"

3.1.2 时序图

3.2 备份环境-自动恢复与数据生命周期管理

恢复流程包括数据恢复,和数据生命周期管理.有一个主存储桶mani_bucket和最近14天的归档桶.可根据需求将最近14天的数据回写进主存储桶

3.2.1 关键代码

# -----------------------
# 恢复数据
# -----------------------
influx restore \
    --bucket "$ARCHIVE_BUCKET" \
    --new-bucket "$ARCHIVE_BUCKET" \
    --org "$ORG" \
    --host "$HOST" \
    --token "$TOKEN" \
    "$RESTORE_DIR"
# -----------------------
# 超期数据管理
# -----------------------
# 获取所有归档 bucket 列表(名字以archive_开头的)
  ARCHIVE_BUCKETS=$(influx bucket list --org "$ORG" --host "$HOST" --token "$TOKEN" --json | jq -r '.[] | select(.name | startswith("archive_")) | .name' | sort)
   
  # 计算超过保留天数的日期阈值
  # 使用兼容BusyBox的方式计算:当前时间戳减去保留天数×86400秒
  THRESHOLD_DATE=$(date -d @$(($(date +%s) - ${MAX_RETENTION_DAYS}*86400)) +%s)
   
  # 处理每个归档 bucket
  for BUCKET in $ARCHIVE_BUCKETS; do
    # 从 bucket 名称提取日期
    BUCKET_DATE=$(echo "$BUCKET" | sed 's/^archive_//')
     
    # 将日期转换为时间戳进行比较
    # 注意:BusyBox的date命令支持直接解析YYYY-MM-DD格式
    BUCKET_TIMESTAMP=$(date -d "$BUCKET_DATE" +%s 2>/dev/null)
     
    if [ $? -eq 0 ] && [ $BUCKET_TIMESTAMP -lt $THRESHOLD_DATE ]; then
      echo "处理过期数据: $BUCKET ($BUCKET_DATE)"
       
      # 将数据插回主 bucket
      echo "将 $BUCKET 的数据插回主 bucket $MAIN_BUCKET"
      influx query \
        --org "$ORG" \
        --host "$HOST" \
        --token "$TOKEN" \
        "from(bucket:\"$BUCKET\")
          |> range(start: 0)
          |> to(bucket:\"$MAIN_BUCKET\")"
       
      # 删除过期的 bucket
      echo "删除过期的 bucket: $BUCKET"
      influx bucket delete \
        --name "$BUCKET" \
        --org "$ORG" \
        --host "$HOST" \
        --token "$TOKEN"
    fi 

3.2.2 时序图


4. 技术选型

Alpine Linux3.22容器基础镜像体积小(约5MB)、启动快、资源占用低
InfluxDB CLI2.7.5数据操作工具官方工具,支持完整的数据备份与恢复功能
Docker最新版容器化部署环境隔离、易于部署和管理、跨平台兼容性好
Bash最新版脚本语言轻量级、广泛支持、适合自动化任务
Cron最新版定时任务调度稳定可靠、配置简单、适合周期性任务

5. 环境变量配置

Docker容器的环境变量配置,根据环境灵活调整:

ORG_NAMEmy-orgInfluxDB 组织名称
MAIN_BUCKET_NAMEmy-bucket主数据桶名称
INFLUX_TOKENInfluxDB 访问令牌
INFLUX_HOSThttp://localhost:8086InfluxDB 服务器地址
BACKUP_DIR/backup备份文件存储目录
MAX_RETENTION_DAYS14最多保留archive_bucket天数

6.故障恢复流程

1.切换到备份环境供生产使用
2.使用influxdb backup 把备份环境数据整库复制出来
3.拷贝到生产环境
4.使用influxdb restore –full恢复整库生产环境数据
5.切换数据库到生产环境
6.把切库这段时间缺失的数据从备份环境复制到生产环境


7. 风险与应对

云服务商云对象存储故障备份数据不可用或丢失1.配置云存储多副本机制
跨地域网络延迟或中断备份和恢复操作失败或延迟1. 配置监控,及时发现和解决问题
2. 避开网络使用高峰期
生产环境硬件资源不足备份造成资源不足影响生产使用1.调整备份执行时间,避开使用高峰期
生产环境与恢复环境数据不一致故障切换后数据丢失1. 确保备份和恢复脚本正确执行
2. 定期验证备份数据的完整性和可恢复性
3. 配置数据同步监控,及时发现数据不一致问题
InfluxDB 服务不可用备份和恢复操作失败1. 监控 InfluxDB 服务状态,设置告警机制
2. 定期进行服务健康检查
访问令牌泄露数据安全风险1. 遵循最小权限原则,为备份和恢复操作分配适当权限
2. 定期更换访问令牌
3. 使用密钥管理服务存储敏感凭证
4. 不在不安全的地方存储令牌
Docker 容器故障备份和恢复计划中断1. 监控容器运行状态,设置自动重启策略
2. 配置容器健康检查
3. 定期更新容器镜像和基础系统
只备份前一天的数据,不备份当前数据遇到故障时,当天的数据无法恢复1.只能从sdlink的timescaledb数据里想办法,写代码恢复到influxdb里了
2.或者使用influx remote 和influx replication做双写,但是这样就需要再有一个inflxudb实例.需要增加云服务器成本

苏ICP备18047533号-1