influxdb1.8增量备份实现方案
方案一:脚本命令行
在官方手册| InfluxDB OSS v1 文档 - InfluxDB 文档中有写到influxdb1.11不支持增量备份,不止1.11,1.8等版本也不支持增量备份。但是我们可以通过定制rsync的方式实现增量备份。
例如:每天凌晨两点拉取同步一次data目录。
经测试,直接挂载此rsync过来的目录可以直接被influxdb容器挂载。如果需要复原则直接挂在此目录即可,如果容器起来之后恢复好了数据,增量数据来了只需重启即可。

测试
1. 起一个待备份容器
可参考influx数据库 | Regen

2. rsync推送到备份机
1
| rsync -avz --delete /data/soft/influxdb/data/ root@192.168.99.203:/data/soft/influxdb/data/
|

3. 起一个还原容器并检查数据
可参考influx数据库 | Regen

可以发现数据已还原

4. 在待备份容器插入新数据

5. 再次rsync推送到备份机
1
| rsync -avz --delete /data/soft/influxdb/data/ root@192.168.99.203:/data/soft/influxdb/data/
|
6. 重启还原重启并测试数据完整性

自动化脚本
自动拉取远程机器的data目录到本机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #!/bin/bash
REMOTE_USER="root" REMOTE_PASS="123" REMOTE_HOST="192.168.321.123" REMOTE_DIR="/data/soft/influxdb/data"
LOCAL_DIR="/data/backup/influxdb/data"
mkdir -p $LOCAL_DIR
SCRIPT_PATH="/data/scripts/influxdb-rsync-direct-backup.sh" LOG_FILE="/var/log/influxdb-sync.log" CRON_EXP="0 2 * * *"
echo ">>> 开始同步:$REMOTE_HOST:$REMOTE_DIR -> $LOCAL_DIR" sshpass -p "$REMOTE_PASS" rsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" "$LOCAL_DIR/" if [ $? -eq 0 ]; then echo "✅ 同步完成 $(date)" | tee -a "$LOG_FILE" else echo "❌ 同步失败 $(date)" | tee -a "$LOG_FILE" fi
(crontab -l 2>/dev/null | grep -F "$SCRIPT_PATH") >/dev/null if [ $? -ne 0 ]; then (crontab -l 2>/dev/null; echo "$CRON_EXP bash $SCRIPT_PATH >> $LOG_FILE 2>&1") | crontab - echo "✅ 已添加定时任务:每天凌晨 2 点执行 $SCRIPT_PATH" else echo "ℹ️ 定时任务已存在,无需重复添加" fi
|
方案二:容器自动化
通过自己docker build
一个客制化的镜像,实现定时拉取、命令拉取。
思路:修改上面的脚本为使用环境变量作为配置项,再在案例alpine中运行。
1. 准备镜像
1. 准备文件
准备以下文件:
├── backup.sh
├── docker-compose.yml
├── Dockerfile
├── entrypoint.sh
├── .env

├── backup.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #!/bin/bash set -e
if [ -f "/app/.env" ]; then export $(grep -v '^#' /app/.env | xargs) fi
echo ">>> 开始同步:$REMOTE_HOST:$REMOTE_DIR -> $LOCAL_DIR"
sshpass -p "$REMOTE_PASS" rsync -avz --delete --size-only \ -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \ "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" "$LOCAL_DIR/"
if [ $? -eq 0 ]; then echo "✅ 同步完成 $(date)" | tee -a "$LOG_FILE" else echo "❌ 同步失败 $(date)" | tee -a "$LOG_FILE" fi
|
├── docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12
| version: "3.9" services: influxdb-backup: image: influxdb-rsync:1.0 build: . container_name: influxdb-backup restart: always env_file: - .env volumes: - ./backup:/data/backup/influxdb/data - ./logs:/var/log
|
├── Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| FROM alpine:latest
RUN apk add --no-cache rsync openssh sshpass bash tzdata
RUN mkdir -p /app /data/backup/influxdb/data /var/log
COPY backup.sh /app/backup.sh COPY entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/*.sh
WORKDIR /app
CMD ["/app/entrypoint.sh"]
|
├── entrypoint.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #!/bin/bash set -e
if [ -f "/app/.env" ]; then export $(grep -v '^#' /app/.env | xargs) fi
CRON_EXP="${CRON_EXP:-0 2 * * *}"
mkdir -p $(dirname "$LOG_FILE")
if [ "$1" = "sync" ]; then echo ">>> 手动执行一次备份" /bin/bash /app/backup.sh exit 0 fi
echo "$CRON_EXP /bin/bash /app/backup.sh >> $LOG_FILE 2>&1" > /etc/crontabs/root
echo "✅ 已写入定时任务:$CRON_EXP" cat /etc/crontabs/root
exec crond -f -d 8
|
├── .env
1 2 3 4 5 6 7 8 9
| REMOTE_USER=root REMOTE_PASS=StrongPass123 REMOTE_HOST=192.168.99.203 REMOTE_DIR=/data/soft/influxdb/data LOCAL_DIR=/data/backup/influxdb/data
SCRIPT_PATH=/data/scripts/influxdb-rsync-direct-backup.sh LOG_FILE=/var/log/influxdb-sync.log CRON_EXP=* * * * *
|
2. docker build
切换到这写文件所在的目录下
1 2
| cd /data/regen/dockerBuildInfluxdbRsyncBackup docker build -t influxdb-rsync:1.0 .
|

2. 起容器

3. 运行一次同步以及查看定时任务
- 立即执行同步
1
| docker exec influxdb-backup /app/entrypoint.sh sync
|

- 查看定时任务是否生效
1 2
| docker exec -it influxdb-backup bash crontab -e
|
