Эффективные бэкапы в S3 с помощью Restic: краткое пособие по настройке

от автора

В 2007 многие администраторы настраивали бэкапы с помощью утилиты rsync, но для этого нужно было выделять отдельный хост для хранилища. И одной из частых проблем было резервирование этого сервера для бэкапов, которое увеличивало накладные расходы. Также хост бэкапирования располагался рядом с устройствами, для которых нужно было выполнить резервное копирование, настроить мониторинг и другое. Это нарушало правило 3-2-1, поэтому для построения действительно надежной системы нужно располагать хосты в разных дата-центрах.

Сегодня можно прибегнуть к услугам облачного хранения данных — например, использовать объектное хранилище Selectel. В этой инструкции рассмотрим, как работать с ним с помощью утилиты Restic.

Restic — это система резервного копирования, предоставляющая инструменты для сохранения резервных копий в версионированном репозитории, который может быть расположен на внешних серверах и в облачных хранилищах. Также Restic позволяет определить правила для включения и исключения файлов и каталогов в резервную копию.

Создание контейнера


Для начала переходим в панель управления и открываем раздел Объектное хранилище. Теперь создадим отдельный контейнер для хранения данных и пользователя, связанного с этим контейнером.

После создания пользователя ему необходимо выдать S3-ключ для доступа к контейнеру объектного хранилища. Это можно сделать в разделе Профиль и настройки → Управление пользователями → Сервисные пользователи → <имя пользователя>.

Утилита Restic поддерживает разнообразные бэкенды для хранения данных — локальные директории, удаленные серверы через протокол SFTP/SSH, Swift, S3 и другие, а также работает на операционных системах Linux, MacOS и Windows.

Одна из приятных особенностей — поддержка политик удаления старых бэкапов, с помощью которых можно настроить настроить «классическое хранение»: семь ежедневных бэкапов, четыре — еженедельных и 12 — ежемесячных. Это упрощает поддержку и администрирование систем.


Установка Restic и подключение к хранилищу


В данном примере будем использовать дистрибутив Ubuntu 22.04 с установкой Restic из репозитория. Если вам нужна более свежая версия, можно воспользоваться страницей с релизами для самостоятельной установки.

Шаг 1. Подключитесь к своему серверу и установите необходимые зависимости.

$ sudo apt update $ sudo apt install -y restic 

Шаг 2. Обновите Restic и проверьте, установилась ли необходимая версия.

restic self-update 

$ restic version restic 0.15.2 compiled with go1.20.3 on linux/amd64 

Шаг 3. Экспортируйте переменные окружения и инициализируйте репозиторий, использующий S3 Selectel в качестве бэкенда.

$ export AWS_ACCESS_KEY_ID=<значение поля Access key из S3-ключа> $ export AWS_SECRET_ACCESS_KEY=<значение поля Secret key из S3-ключа> 

$ restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> init 

После ввода команды и вывода сообщения в терминале задайте пароль для репозитория. Его важно запомнить, иначе вы не сможете получить доступ к данным из хранилища.

Пример работы с хранилищем через Restic


Резервное копирование

Для примера создадим директорию с файлом, которую будем бэкапировать. Если у вас уже есть директория с данными для будущего бэкапа, этот шаг можно пропустить.

$ mkdir dir $ echo line1 > dir/file1.txt $ cat dir/file1.txt  line1 

Запустим создание бэкапа в режиме dry-run, чтобы убедиться, что все будет работать корректно. Во время выполнения команды нужно будет ввести пароль от репозитория, который вы установили ранее.

restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> backup -vv --dry-run <директория> 

В результате терминал выведет похожее сообщение:

repository e4218f76 opened (version 1) created new cache in /root/.cache/restic lock repository no parent snapshot found, will read all files load index files start scan on [/root/dir] start backup on [/root/dir] scan finished in 0.243s: 1 files, 6 B new       /root/dir/file1.txt, saved in 0.007s (6 B added) new       /root/dir/, saved in 0.008s (0 B added, 0 B stored, 425 B metadata) new       /root/, saved in 0.008s (0 B added, 0 B stored, 419 B metadata) Files:           1 new,     0 changed,     0 unmodified Dirs:            2 new,     0 changed,     0 unmodified Data Blobs:      1 new Tree Blobs:      3 new Would add to the repository: 1.034 KiB (1.304 KiB stored) processed 1 files, 6 B in 0:00 

Теперь можно убрать ключ –dry-run и выполнить первый бэкап:

restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> backup <директория> 

repository e4218f76 opened (version 1) no parent snapshot found, will read all files Files:           1 new,     0 changed,     0 unmodified Dirs:            2 new,     0 changed,     0 unmodified Added to the repository: 1.034 KiB (1.304 KiB stored) processed 1 files, 6 B in 0:00 snapshot a7d06fa4 saved 

Просмотреть список бэкапов или снапшотов в терминалогии Restic можно с помощью специальной команды snapshots. А чтобы каждый раз не вводить пароль, можно записать его в файл и использовать ключ -p.

$ echo 'pass' > backup_password $ restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> -p backup_password snapshots enter password for repository:  repository e4218f76 opened (version 1) ID        Time                 Host        Tags        Paths ---------------------------------------------------------------- a7d06fa4  2023-06-14 16:49:09  www                     /root/dir ---------------------------------------------------------------- 1 snapshots 

Теперь внесем изменения в директорию, повторим процесс бэкапа и посмотрим, как это будет выглядеть.

$ echo line2 >> dir/file1.txt  $ echo line1 >> dir/file2.txt  $ ls -l dir/ total 8 -rw-r--r-- 1 root root 12 Jun 14 16:52 file1.txt -rw-r--r-- 1 root root  6 Jun 14 16:52 file2.txt 

$ restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> -p backup_password backup  ~/dir repository e4218f76 opened (version 1) using parent snapshot a7d06fa4 Files:           1 new,     1 changed,     0 unmodified Dirs:            0 new,     2 changed,     0 unmodified Added to the repository: 1.377 KiB (1.646 KiB stored) processed 2 files, 18 B in 0:00 snapshot e0f0801e saved $ restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название контейнера> -p backup_password snapshots repository e4218f76 opened (version 1) ID        Time                 Host        Tags        Paths ---------------------------------------------------------------- a7d06fa4  2023-06-14 16:49:09  www                     /root/dir e0f0801e  2023-06-14 16:53:02  www                     /root/dir ---------------------------------------------------------------- 2 snapshots 

Супер — после бэкапирования измененной директории появилось новая копия в объектном хранилище.

Восстановление резервной копии

В общем виде восстановление бэкапов с помощью Restic выглядит следующим образом:

restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> restore <id_снапшота> --target <директория_для_восстановления> 

Попробуем восстановить копию a7d06fa4 из хранилища restic_backup:

$ restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> restore -p backup_password a7d06fa4 --target /tmp/restore-dir repository e4218f76 opened (version 1) restoring <Snapshot a7d06fa4 of [/root/dir] at 2023-06-14 16:49:09.447334528 +0000 UTC by root@www> to /tmp/restore-dir $ ls -l /tmp/restore-dir/root/dir/ total 4 -rw-r--r-- 1 root root 6 Jun 14 16:32 file1.txt $ cat /tmp/restore-dir/root/dir/file1.txt  line1 

Готово — данные восстановились на момент до внесения изменений.

Политика удаления старых копий

Для удаления старых бэкапов можно использовать команду forget. Более подробно с ней можно ознакомиться в документации.

Остановимся на примере, когда нужно сохранять ежедневные копии за последнюю неделю, еженедельные за последний месяц, ежемесячные за последний год и ежегодные за последние 75 лет. Тогда можно передать аргументы вида:

forget --keep-within-daily 7d --keep-within-weekly 1m --keep-within-monthly 1y --keep-within-yearly 75y 

Рассмотрим пример работы с командой forget:

$ restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> -p backup_password forget --keep-within-daily 7d --keep-within-weekly 1m --keep-within-monthly 1y --keep-within-yearly 75y repository e4218f76 opened (version 1) Applying Policy: keep daily snapshots within 7d, weekly snapshots within 1m, monthly snapshots within 1y, yearly snapshots within 75y keep 1 snapshots: ID        Time                 Host        Tags        Reasons            Paths ----------------------------------------------------------------------------------- e0f0801e  2023-06-14 16:53:02  www                     daily within 7d    /root/dir                                                        weekly within 1m                                                        monthly within 1y                                                        yearly within 75y ----------------------------------------------------------------------------------- 1 snapshots remove 1 snapshots: ID        Time                 Host        Tags        Paths ---------------------------------------------------------------- a7d06fa4  2023-06-14 16:49:09  www                     /root/dir ---------------------------------------------------------------- 1 snapshots [0:00] 100.00%  1 / 1 files deleted 

Автоматизация

Соединив команды для создания и удаления (ротации) бэкапов, можно автоматизировать процесс. Например, поместив в cron следующее задание:

$ export AWS_ACCESS_KEY_ID=<значение поля Access key из S3-ключа> $ export AWS_SECRET_KEY=<значение поля Secret key из S3-ключа>  restic -r s3:s3.storage.selcloud.ru/<название_контейнера> -p backup_password  backup <директория> 2>&1 | systemd-cat -t restic-cron-backup restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> -p backup_password   forget --keep-within-daily 7d --keep-within-weekly 1m --keep-within-monthly 1y --keep-within-yearly 75y  2>&1 | systemd-cat -t restic-cron-backup 

Логирование через systemctl-cat позволит при необходимости обратиться к логам бэкапа:

$ journalctl -t restic-cron-backup Jun 14 17:05:57 www restic-cron-backup[9390]: using parent snapshot 25f3eb23 Jun 14 17:05:57 www restic-cron-backup[9390]: Files:           0 new,     0 changed,     2 unmodified Jun 14 17:05:57 www restic-cron-backup[9390]: Dirs:            0 new,     0 changed,     2 unmodified Jun 14 17:05:57 www restic-cron-backup[9390]: Added to the repository: 0 B   (0 B   stored) Jun 14 17:05:57 www restic-cron-backup[9390]: processed 2 files, 18 B in 0:00 Jun 14 17:05:57 www restic-cron-backup[9390]: snapshot 5bfd0c72 saved Jun 14 17:06:10 www restic-cron-backup[9458]: Applying Policy: keep daily snapshots within 7d, weekly snapshots within 1m, monthly snapshots within 1> Jun 14 17:06:10 www restic-cron-backup[9458]: keep 1 snapshots: Jun 14 17:06:10 www restic-cron-backup[9458]: ID        Time                 Host        Tags        Reasons            Paths Jun 14 17:06:10 www restic-cron-backup[9458]: ----------------------------------------------------------------------------------- Jun 14 17:06:10 www restic-cron-backup[9458]: 5bfd0c72  2023-06-14 17:05:56  www                     daily within 7d    /root/dir Jun 14 17:06:10 www restic-cron-backup[9458]:                                                        weekly within 1m Jun 14 17:06:10 www restic-cron-backup[9458]:                                                        monthly within 1y Jun 14 17:06:10 www restic-cron-backup[9458]:                                                        yearly within 75y Jun 14 17:06:10 www restic-cron-backup[9458]: ----------------------------------------------------------------------------------- Jun 14 17:06:10 www restic-cron-backup[9458]: 1 snapshots Jun 14 17:06:10 www restic-cron-backup[9458]: remove 2 snapshots: Jun 14 17:06:10 www restic-cron-backup[9458]: ID        Time                 Host        Tags        Paths Jun 14 17:06:10 www restic-cron-backup[9458]: ---------------------------------------------------------------- Jun 14 17:06:10 www restic-cron-backup[9458]: e0f0801e  2023-06-14 16:53:02  www                     /root/dir Jun 14 17:06:10 www restic-cron-backup[9458]: 25f3eb23  2023-06-14 17:05:51  www                     /root/dir Jun 14 17:06:10 www restic-cron-backup[9458]: ---------------------------------------------------------------- Jun 14 17:06:10 www restic-cron-backup[9458]: 2 snapshots Jun 14 17:06:10 www restic-cron-backup[9458]: [0:00] 100.00%  2 / 2 files deleted 

Заключение


С помощь Restic и объектного хранилища Selectel мы получили удобный и надежный инструмент для работы с резервными копиями, обеспечив необходимую глубину хранения. Использование облачного хранилища Selectel позволяет снизить затраты на настройку и эксплуатацию собственной системы и получить доступ к архивам из любой точки.

Другие материалы по теме


ссылка на оригинал статьи https://habr.com/ru/articles/768014/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *