Featured image of post Rsnapshot

Rsnapshot

Хорошая утилита для инкрементных бекапов с авторотацией

Введение

Rsnapshot - классная утилита которая умеет:

  1. Делать бекапы папок по пути в локальной системе и складывать их в бекап хранилище (специально отведённая папка тут же где-то)
  2. Выполнять скрипты которые делают бекапы, ложат рядом с собой, а rsnapshot берёт эти данные и складывает в то же хранилище-папку
  3. Может закинуть бекапы по sftp куда-то
  4. Хранит только diff-ы между бекапами, что экономит место

Retantion

У rsnapshot есть Retantion Policies (могу не точно называть), они в конфигурации начинаются с retain. Это описание абстрактных планов по поводу того, сколько последних копий бэкапов хранить. Я долго мучался пока не понял, что их названия ни на что не влияют. То есть, если план называется daily rsnapshot каждый день его запускать не будет, можете его в cron-е хоть раз в месяц запускать. Мне удобнее использовать для конфигурации (чтения, сопровождения) daily, weekly, monthly и т. д.

Те retention, которые в конфиге записаны ниже, считаються теми, что должны делаться реже верхних, то есть цифра у них должна быть меньше. Rsnapshot для каждого retention i+1 берёт содержимое со старшего сделанного для retention i. Пример:

 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
+ date
Tue May 12 05:58:33 UTC 2020
+ rsnapshot daily
+ ls -la /data/backups
total 48
drwxrwxr-x. 11 y.vlasov y.vlasov 4096 May 12 05:57 .
drwxrwxr-x+  6 root     root     4096 Apr 27 09:43 ..
drwxr-xr-x.  6 root     root     4096 May 12 05:57 daily.0
drwxr-xr-x.  6 root     root     4096 May 12 00:00 daily.1
drwxr-xr-x.  6 root     root     4096 May 11 00:00 daily.2
drwxr-xr-x.  6 root     root     4096 May 10 00:00 daily.3
drwxr-xr-x.  6 root     root     4096 May  9 00:00 daily.4
drwxr-xr-x.  6 root     root     4096 May  8 00:00 daily.5
drwxr-xr-x.  6 root     root     4096 May  7 00:00 daily.6
drwxr-xr-x.  6 root     root     4096 May  4 00:00 weekly.0
drwxr-xr-x.  6 root     root     4096 May  2 00:00 weekly.1
+ rsnapshot weekly
+ ls -la /data/backups
total 48
drwxrwxr-x. 11 y.vlasov y.vlasov 4096 May 12 05:57 .
drwxrwxr-x+  6 root     root     4096 Apr 27 09:43 ..
drwxr-xr-x.  6 root     root     4096 May 12 05:57 daily.0
drwxr-xr-x.  6 root     root     4096 May 12 00:00 daily.1
drwxr-xr-x.  6 root     root     4096 May 11 00:00 daily.2
drwxr-xr-x.  6 root     root     4096 May 10 00:00 daily.3
drwxr-xr-x.  6 root     root     4096 May  9 00:00 daily.4
drwxr-xr-x.  6 root     root     4096 May  8 00:00 daily.5
drwxr-xr-x.  6 root     root     4096 May  7 00:00 weekly.0
drwxr-xr-x.  6 root     root     4096 May  4 00:00 weekly.1
drwxr-xr-x.  6 root     root     4096 May  2 00:00 weekly.2

Backup, backup_script

Как собственно он делает бекап? Rsnapshot делает бекапы по всем шагам, которые есть в конфигурации при каждом вызове.

  • backup - указываешь путь к папке, которую нужно сохранять и он её полностью к себе копирует в хранилище;
  • backup_script - указываешь путь к Shell скрипту, которые делает бекап сам и складывает результирующие файлы\папки рядом с собой, rsnapshot их перемещает в хранилище;
  • другие варианты - man rsnapshot.

План

  1. Создать папку по пути snapshot_root.
  2. Написать rsnapshot.conf файл (по умолчанию берётся /etc/rsnapshot.conf).
  3. Добавить вызов rsnapshot в планировщик - cron.

Пример

Создадим папку snapshot_root: mkdir -p /data/backups.

Содержимое /etc/rsnapshot.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
## Заметка 1: Вы обязаны использовать табы для разделения аргументов в одной строке
config_version	1.2
snapshot_root	/data/backups
no_create_root	1
## Заметка 2: Пути могут вариироваться от ОСи к ОСи
cmd_rm		/usr/bin/rm
cmd_rsync	/usr/bin/rsync
cmd_logger	/usr/bin/logger
## Конфигурация планов сохранения
retain	daily	7
retain	weekly	4
## Настройки логгирования
verbose		2
loglevel	3
lockfile	/var/run/rsnapshot.pid

## Собственно описание совершаемых действий
backup	/data/ghost	ghost/
backup_script	/srv/my_soft/backup.sh	my_soft/

Содержимое crontab

1
2
0 0 * * * /usr/bin/rsnapshot daily 2>&1 | systemd-cat -t rsnapshot-daily
10 0 * * 0 /usr/bin/rsnapshot weekly 2>&1 | systemd-cat -t rsnapshot-weekly

Содержимое /srv/my_soft/backup.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/env sh
set -e

CMD='''
rm -rf backup; \
pg_basebackup -U my_user -X stream -F plain -D backup 1>/dev/null 2>&1 && \
tar -C backup -czf - $(ls backup)
'''

docker exec \
    -w /tmp \
    my_soft.postgres \
    /bin/sh -c "$CMD 1>pg_basebackup.tgz

Содержимое daily.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
/data/backups/daily.0
├── ghost
│   └── data
├── my_soft
│   └── pg_basebackup.tgz
├── proxy
│   ├── certificates.tgz
│   └── haproxy.tgz
└── another_one
    └── another_backup_from_backup_script.tgz

5 directories, 4 files
Licensed under Apache License, Version 2.0
Обновлено Dec 01, 2023 14:46 +0200
All rights reserved
Создано при помощи Hugo
Тема Stack, дизайн Jimmy