Введение ¶
Rsnapshot - классная утилита которая умеет:
- Делать бекапы папок по пути в локальной системе и складывать их в бекап хранилище (специально отведённая папка тут же где-то)
- Выполнять скрипты которые делают бекапы, ложат рядом с собой, а rsnapshot берёт эти данные и складывает в то же хранилище-папку
- Может закинуть бекапы по sftp куда-то
- Хранит только 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
.
План ¶
- Создать папку по пути snapshot_root.
- Написать rsnapshot.conf файл (по умолчанию берётся /etc/rsnapshot.conf).
- Добавить вызов 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
|