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目录到本机
| 12
 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
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | #!/bin/bashset -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
| 12
 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
| 12
 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
| 12
 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/bashset -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
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | REMOTE_USER=rootREMOTE_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
切换到这写文件所在的目录下
| 12
 
 | cd /data/regen/dockerBuildInfluxdbRsyncBackupdocker build -t influxdb-rsync:1.0 .
 
 | 

2. 起容器

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

- 查看定时任务是否生效
| 12
 
 | docker exec -it influxdb-backup bashcrontab -e
 
 | 
