influxdb1.8增量备份实现方案

方案一:脚本命令行

官方手册| InfluxDB OSS v1 文档 - InfluxDB 文档中有写到influxdb1.11不支持增量备份,不止1.11,1.8等版本也不支持增量备份。但是我们可以通过定制rsync的方式实现增量备份。

例如:每天凌晨两点拉取同步一次data目录。

经测试,直接挂载此rsync过来的目录可以直接被influxdb容器挂载。如果需要复原则直接挂在此目录即可,如果容器起来之后恢复好了数据,增量数据来了只需重启即可。

image-20250903170342350

测试

1. 起一个待备份容器

可参考influx数据库 | Regen

image-20250903172502877

2. rsync推送到备份机

1
rsync -avz --delete /data/soft/influxdb/data/ root@192.168.99.203:/data/soft/influxdb/data/

image-20250903172527875

3. 起一个还原容器并检查数据

可参考influx数据库 | Regen

image-20250903172559041

可以发现数据已还原

image-20250903172657959

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

image-20250903172740848

5. 再次rsync推送到备份机

1
rsync -avz --delete /data/soft/influxdb/data/ root@192.168.99.203:/data/soft/influxdb/data/

6. 重启还原重启并测试数据完整性

1
docker restart influxdb 

image-20250903172947300

自动化脚本

自动拉取远程机器的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
# ================================================================
# 脚本名称:influxdb-sync.sh
# 功能:远程拉取 InfluxDB 容器的数据目录到本地,并保持一致(增删同步)
# ================================================================

# ==== 配置区 ====
REMOTE_USER="root" # 远程用户名
REMOTE_PASS="123" # 远程密码(明文)
REMOTE_HOST="192.168.321.123" # 远程主机 IP
REMOTE_DIR="/data/soft/influxdb/data" # 远程 InfluxDB 数据目录

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 * * *" # 每天凌晨 2 点执行

# ==== 执行 rsync 同步 ====
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 ====
(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

image-20250904140536119

├── 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

# 读取 .env 文件
if [ -f "/app/.env" ]; then
export $(grep -v '^#' /app/.env | xargs)
fi

# 默认值,防止 .env 没配置
CRON_EXP="${CRON_EXP:-0 2 * * *}"

# 确保日志文件目录存在
mkdir -p $(dirname "$LOG_FILE")

# 判断是否传入 sync 参数
if [ "$1" = "sync" ]; then
echo ">>> 手动执行一次备份"
/bin/bash /app/backup.sh
exit 0
fi

# 写入 crontab
echo "$CRON_EXP /bin/bash /app/backup.sh >> $LOG_FILE 2>&1" > /etc/crontabs/root

echo "✅ 已写入定时任务:$CRON_EXP"
cat /etc/crontabs/root

# 启动 cron(前台模式,日志可见)
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 .

image-20250904140912720

2. 起容器

1
docker-compose up -d

image-20250904141104409

3. 运行一次同步以及查看定时任务

  1. 立即执行同步
1
docker exec influxdb-backup /app/entrypoint.sh sync

image-20250904141210351

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

image-20250904141421745