Данная заметка завершает цикл о резервном копировании. В ней пойдет речь о логической организации выделенного сервера (или
Исходные данные
- небольшой системный — для установки операционной системы;
- большой — хранение пользовательских данных.
При переустановке системы средствами панели управления диск с пользовательскими данными не затирается, а вот системный перезаливается полностью. Также в случае с
Типовую нагрузку подобного выделенного сервера или
В качестве пространства для хранения резервных копий выступает специально подготовленный сервер, о нем будет подробнее написано дальше.
Логическая организация дисковой системы
Если есть RAID-контроллер, или это
Важное замечание: тома должны быть полностью самодостаточными, т.е. не должны зависеть как друг от друга, так и от корневой файловой системы. В случае с виртуальными машинами или контейнерами этот момент соблюдается автоматически. Если же это контейнеры приложений или домашние каталоги — стоит подумать о разделении конфигурационных файлов веб-сервера и прочих сервисов таким образом, чтобы максимально убрать зависимости томов между собой. К примеру, каждый сайт работает от своего пользователя, конфигурационные файлы сайта — в домашнем каталоге пользователя, в настройках веб-сервера конфигурационные файлы сайтов включаются не через /etc/nginx/conf.d/.conf, а, к примеру, /home//configs/nginx/*.conf
Если же дисков несколько — можно создать программный массив RAID (и настроить его кэширование на SSD, если есть потребность и возможности), поверх которого собрать LVM по правилам, предложенным выше. Также в этом случае можно использовать ZFS или BtrFS, но тут стоит несколько раз подумать: обе требуют гораздо более серьезного подхода к ресурсам, к тому же ZFS не идет в комплекте с ядром Linux.
Независимо от используемой схемы всегда заранее стоит прикинуть примерную скорость записи изменений на диски, после чего вычислить размер свободного места, которое будет зарезервировано для создания снимков. К примеру, если наш сервер будет писать данные со скоростью 10 мегабайт в секунду, а размер всего массива с данными составляет 10 терабайт — время синхронизации может достигать суток (22 часа — столько будет передаваться такой объем по сети 1гбитсек) — стоит зарезервировать порядка 800 гб. В реальности цифра будет меньше, можно смело разделить ее на число логических томов.
Устройство сервера хранения резервных копий
Главное отличие сервера для хранения резервных копий — большие, дешевые и относительно медленные диски. Поскольку современные HDD уже перешагнули планку в 10тб в одном диске — обязательно применение файловых систем или RAID с контрольными суммами, потому что за время перестройки массива или восстановления файловой системы (несколько суток!) может выйти из строя второй диск из-за повышенной нагрузки. На дисках емкостью до 1тб это было не так чувствительно. Для простоты описания предполагаю, что дисковое пространство разделено на две примерно одинаковые по размеру части (опять же, к примеру, с помощью LVM):
- тома, соответствующие на серверах, используемые для хранения пользовательских данных (на них будет разворачиваться последняя сделанная резервная копия для проверки);
- тома, используемые как репозитории BorgBackup (сюда непосредственно будут попадать данные для резервных копий).
Принцип работы заключается в том, что создаются отдельные тома для каждого сервера под репозитории BorgBackup, куда и будут попадать данные из боевых серверов. Репозитории работают в режиме только добавления, что исключает возможность намеренного удаления данных, а за счет дедупликации и периодической чистки репозиториев от старых резервных копий (остаются годовые копии, ежемесячные за последний год, еженедельные за последний месяц, ежедневные за последнюю неделю, возможно — в особых случаях — ежечасные за последний день: итого 24 + 7 + 4 + 12 + годовые — примерно 50 копий для каждого сервера).
В репозиториях BorgBackup не активируется режим только добавления, вместо этого используется ForcedCommand в .ssh/authorized_keys примерно такого плана:
from="адрес сервера",command="/usr/local/bin/borg serve --append-only --restrict-to-path /home/servername/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc AAAAA.......
По указанному пути размещен скрипт-обертка поверх borg, который, помимо запуска бинарника с параметрами, дополнительно запускает процесс восстановления резервной копии после окончания снятия данных. Для этого скрипт-обертка создает файл-признак рядом с соответствующим репозиторием. Последняя сделанная резервная копия после окончания процесса заливки данных автоматически восстанавливается на соответствующий логический том.
Данная конструкция позволяет периодически чистить ненужные резервные копии, а также не позволяет боевым серверам удалять что-либо на сервере хранения резервных копий.
Процесс резервного копирования
Инициатором резервного копирования выступает сам
В случае наличия небольшой базы данных (до 1 гб для каждого сайта) делается дамп базы данных, который сохраняется в соответствующий логический том, туда, где расположены остальные данные этого же сайта, но так, чтобы дамп не был доступен через веб-сервер. Если же базы большие — следует настроить "горячее" снятие данных, к примеру с помощью xtrabackup для MySQL, или работу WAL c archive_command в PostgreSQL. В этом случае база данных будет восстанавливаться отдельно от данных сайтов.
Если применяются контейнеры или виртуальные машины — следует настроить qemu-guest-agent, CRIU или другие, нужные технологии. В остальных случаях дополнительных настроек чаще всего не понадобится — просто создаем снимки логических томов, которые потом обрабатываются аналогично снимку состояния корневой файловой системы. После снятия данных снимки удаляются.
Дальнейшая работа идет на сервере хранения резервных копий:
- проверяется последняя сделанная резервная копия в каждом репозитории,
- проверяется наличие файла-метки, указывающего, что процесс снятия данных завершен,
- выполняется разворачивание данных на соответствующий локальный том,
- удаляется файл-метка
Процесс восстановления работоспособности сервера
Если основной сервер гибнет, то запускается аналогичный
- выполняется запрос на присоединение блочного устройства по iscsinbd или другому схожему протоколу логического тома, содержащего корневую файловую систему погибшего сервера; поскольку корневая файловая система должна быть небольшой — этот этап должен быть завершен за несколько минут. Также производится восстановление загрузчика;
- воссоздается структура локальных логических томов, присоединяются логические тома с сервера резервного копирования с помощью модуля ядра dm_clone: начинается восстановление данных, а изменения записываются сразу же на локальные диски
- запускается контейнер со всеми доступными физическими дисками — полностью восстанавливается работоспособность сервера, но с пониженной производительностью;
- после окончания синхронизации данных логические тома с сервера резервного копирования отсоединяются, контейнер выключается, сервер перезагружается;
После перезагрузки сервер будет иметь все данные, которые были на момент создания резервной копии, а также включать все изменения, которые были сделаны в процессе восстановления.
Резервное копирование, часть 1: Зачем нужно резервное копирование, обзор методов, технологий
Резервное копирование, часть 2: Обзор и тестирование rsync-based средств резервного копирования
Резервное копирование, часть 3: Обзор и тестирование duplicity, duplicati
Резервное копирование, часть 4: Обзор и тестирование zbackup, restic, borgbackup
Резервное копирование, часть 5: Тестирование Bacula и Veeam Backup for Linux
Резервное копирование: часть по просьбам читателей: обзор AMANDA, UrBackup, BackupPC
Резервное копирование, часть 6: Сравнение средств резервного копирования
Резервное копирование, часть 7: Выводы
Приглашаю обсудить предложенный вариант в комментариях, благодарю за внимание!
Автор: Павел