Модуль 10. Резервное копирование ALD Pro
Введение
Потеря данных — это страшный сон для владельца любого бизнеса, так как после такого события девять из десяти компаний обычно не выживают. Речь тут идет, конечно же, о потере клиентской базы или интеллектуальной собственности, но даже в менее критичных случаях ущерб может оказаться весьма значителен. Поэтому иногда шутят, что все системные администраторы делятся на три группы: тех, кто не делает бэкапы, кто делает и кто проверяет возможность восстановления системы из резервной копии.
Из этого модуля вы узнаете о том, как выполнять резервное копирование подсистем ALD Pro и в чем заключаются особенности их восстановления, связанные с хранением данных в распределенной базе каталога.
Резервное копирование дисков
Любое серверное приложение представляет собой набор файлов, в которых хранятся пользовательские данные, настройки приложения и программный код. Резервное копирование может быть нацелено на любую из этих категорий файлов или копировать диски целиком, как блочные устройства.
Важно понимать, что при выполнении резервного копирования нужно не только сделать копию данных, но и обеспечить ее согласованность:
Если мы полностью выключим сервер и сделаем снимок виртуальной машины (или создадим копии всех его дисков), то у нас не возникнет проблем с запуском системы, см. рис. 328.
Если же мы попытаемся копировать файлы или блочное устройство во время работы системы, то данные могут оказаться несогласованными и система не заработает или какие-то изменения окажутся утеряны.
Современные гипервизоры позволяют создавать горячие снимки виртуальных машин, которые сохраняют не только состояние файлов, но и состояние оперативной памяти на момент создания снимка, что позволяет продолжить работу системы с того же места, но использовать такие копии все же не рекомендуется, т.к. они не всегда могут гарантировать полную консистентность данных.
Примечание
В случае выключения контроллера домена его клиенты автоматически переключатся на другие серверы, но если так делать постоянно, то лучше выделить так называемую скрытую реплику (англ. hidden replica), которая будет исключена из SRV-записей, чтобы клиенты не выбирали ее в качестве активного контроллера.
Для того чтобы обычный контроллер сделать скрытой репликой, нужно изменить статус командой ipa server-state $(hostname) --state=hidden
. Чтобы вернуть контроллер в строй, нужно изменить статус на enabled. Текущее состояние домена покажет команда ipa config-show
.
Однако, процедура резервного копирования и восстановления данных усложняется, когда мы имеем дело с кластером серверов, или когда информационная система хранит часть своих данных в таком кластере. Например, если в домене несколько контроллеров, то при восстановлении отдельно взятого сервера у нас нарушится репликация, и чем позднее мы выполним повторную инициализацию такого контроллера, тем больше изменений будет утеряно.
Потребность повторной инициализации вызвана тем, что при восстановлении контроллера домена из резервной копии соседние серверы, с которыми он связан соглашениями о репликации, не смогут отдать ему те изменения, которые были внесены в домен непосредственно с его участием. Очень подробно механизм репликации был рассмотрен в Модуль 8. Управление топологией в домене.
На лабораторном стенде перед созданием снимков виртуальных машин вы без проблем можете выключить все контроллеры домена, чтобы получить консистентное состояние. Но в продуктивной среде такой сценарий невозможен, и отдельные снимки можно использовать в двух случаях:
С помощью такой копии можно быстро восстановить операционную систему вместе с настройками приложений. Останется только выполнить инициализацию контроллера, и сервер будет полностью готов к работе.
С помощью такой копии вы можете восстановить данные каталога, актуальные на момент создания копии. В этом случае после восстановления контроллера вам нужно будет выполнить инициализацию в противоположном направлении, затирая данные действующих контроллеров информацией из восстановленной копии.
Чтобы переинициализировать контроллер, выполните следующие действия, см. рис. 329:
Откройте страницу
.Выберите соглашение о репликации, в котором участвует сервер, восстановленный из резервной копии.
Нажмите на кнопку
рядом с тем сервером, данные которого вы хотите затереть.
Из командной строки это можно сделать с помощью утилиты ipa-replica-manage
:
admin@dc-2:~$ sudo ipa-replica-manage re-initialize --from dc-1.ald.company.lan
При восстановлении обычных подсистем (не контроллеров) из снимков нужно учитывать, что PXE и DHCP хранят свои настройки в каталоге, а с версии 2.4.0 все подсистемы будут хранить свое целевое состояние в каталоге.
Резервное копирование данных
Учитывая, что полное выключение сервера приводит к временному прерыванию в обслуживании клиентов, в многие системы реализуют функции резервного копирования, которые гарантируют целостность данных при снятии копий «на горячую». Например, вы можете сделать дамп базы PostgreSQL или каталога 389DS. Мы рассмотрим несколько скриптов резервного копирования контроллера домена и отдельных подсистем.
Контроллеры домена
Для выполнения резервного копирования контроллера домена на этом сервере необходимо выполнить следующий скрипт:
#!/usr/bin/env bash
# Название директории для резервной копии формируется
# из текущей даты и находится в папке /tmp/backup
now=$(date +"%d-%m-%Y")
BACKUP_PATH=/tmp/backup/$now
# Создание временной директории для резервных копий
mkdir -p $BACKUP_PATH
# Создание резервной копии FreeIPA
ipa-backup
# Архивирование РК FreeIPA
tar -zcvf $BACKUP_PATH/ipa.tar.gz /var/lib/ipa/backup
# Очистка промежуточного бэкапа FreeIPA
rm -rf /var/lib/ipa/backup/*
# Остановка затрагиваемых бэкапом сервисов
systemctl stop apache2 celery celerybeat rabbitmq-server postgresql salt-minion salt-minion-standalone
# Архивирование БД PostgreSQL
tar -zcvf $BACKUP_PATH/postgresql.tar.gz /var/lib/postgresql/
# Архивирование RabbitMQ
tar -zcvf $BACKUP_PATH/rabbitmq.tar.gz /var/lib/rabbitmq/mnesia/
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
# Архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
# Архивирование директории rbta
tar -zcvf $BACKUP_PATH/rbta.tar.gz /opt/rbta/
# Запуск затрагиваемых бэкапом сервисов
systemctl start apache2 celery celerybeat rabbitmq-server postgresql salt-minion salt-minion-standalone
А вот набор команд для восстановления:
# Перейти в директорию с резервными копиями
cd /tmp/backup/
# Разархивирование РК IPA
tar -C "/" -xvf ipa.tar.gz
# Восстановление IPA из РК
ipa-restore /var/lib/ipa/backup/ipa-full-YOUR_BACKUP_DATE
# Остановка затрагиваемых восстановлением сервисов
systemctl stop apache2 celery celerybeat rabbitmq-server postgresql salt-minion salt-minion-standalone salt-master
# Восстановление БД Postgresql
tar -C "/" -xvf postgresql.tar.gz
# Восстановление RabbitMQ
tar -C "/" -xvf rabbitmq.tar.gz
# Восстановление логов
tar -C "/" -xvf log.tar.gz
# Восстановление директории etc
tar -C "/" -xvf etc.tar.gz
# Восстановление директории rbta
tar -C "/" -xvf rbta.tar.gz
# Восстановление ipa-client
tar -C "/" -xvf ipa-client.tar.gz
# Перезагрузка
reboot
Если в домене несколько контроллеров, то после восстановления сервера вы будете наблюдать ошибки репликации в журнале /var/log/dirsrv/slapd-ALD-COMPANY-LAN/errors
, и вам нужно будет как можно скорее выполнить повторную инициализацию этого сервера (или, наоборот, использовать данные этого сервера для переинициализации остальных контроллеров в домене). Например, если мы восстановили dc-2 и хотим забрать актуальные данные с dc-1, то нужно выполнить команду:
admin@dc-2:~$ sudo ipa-replica-manage re-initialize --from dc-1.ald.company.lan
Update in progress, 7 seconds elapsed
Update succeeded
Напомним, что для проверки состояния репликации между двумя конкретными серверами RedHat предлагает использовать утилиту ds-replcheck
:
admin@dc-2:~$ ds-replcheck online -D "cn=Directory Manager" -m ldap://dc-1.ald.company.lan:389 -r ldap://dc-2.ald.company.lan:389 -b dc=ald,dc=company,dc=lan
Подсистема общего доступа к файлам
Для выполнения резервного копирования подсистемы общего доступа к файлам необходимо выполнить скрипт:
#!/usr/bin/env bash
# Название директории для резервной копии формируется
# из текущей даты и находится в папке /tmp/backup
now=$(date +"%d-%m-%Y")
BACKUP_PATH=/tmp/backup/$now
# Создание временной директории для резервных копий
mkdir -p $BACKUP_PATH
# Остановка затрагиваемых бэкапом сервисов
systemctl stop salt-minion salt-minion-standalone
# Архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
# Архивирование директории /opt/samba_shares/
tar -zcvf $BACKUP_PATH/samba.tar.gz /opt/samba_shares/
# Запуск затрагиваемых бэкапом сервисов
systemctl start salt-minion salt-minion-standalone
А вот скрипт для восстановления:
#!/bin/bash
# Переход в директорию с резервными копиями
cd /tmp/backup
# Остановка затрагиваемых восстановлением сервисов
systemctl stop smbd nmbd salt-minion salt-minion-standalone
# Восстановление логов
tar -C "/" -xvf log.tar.gz
# Архивирование директории etc
tar -C "/" -xvf etc.tar.gz
# Восстановление ipa-client
tar -C "/" -xvf ipa-client.tar.gz
# Восстановление общих директорий samba
tar -C "/" -xvf samba.tar.gz
# Перезагрузка
reboot
Подсистема печати
Для выполнения резервного копирования подсистемы печати необходимо выполнить скрипт:
#!/usr/bin/env bash
# Название директории для резервной копии формируется
# из текущей даты и находится в папке /tmp/backup
now=$(date +"%d-%m-%Y")
BACKUP_PATH=/tmp/backup/$now
# Создание временной директории для резервных копий
mkdir -p $BACKUP_PATH
# Остановка затрагиваемых бэкапом сервисов
systemctl stop cups salt-minion salt-minion-standalone
# архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
# архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
# архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
# Запуск затрагиваемых бэкапом сервисов
systemctl start cups salt-minion salt-minion-standalone
А вот скрипт для восстановления:
#!/bin/bash
# Переход в директорию с резервными копиями
cd /tmp/backup/
# Остановка затрагиваемых бэкапом сервисов
systemctl stop cups salt-minion salt-minion-standalone
# Восстановление логов
tar -C "/" -xvf log.tar.gz
# Восстановление директории etc
tar -C "/" -xvf etc.tar.gz
# Восстановление ipa-client
tar -C "/" -xvf ipa-client.tar.gz
# Перезагрузка
reboot
Подсистема репозиториев ПО
Для выполнения резервного копирования подсистемы репозиториев ПО необходимо выполнить скрипт:
#!/usr/bin/env bash
# Название директории для резервной копии формируется
# из текущей даты и находится в папке /tmp/backup
now=$(date +"%d-%m-%Y")
BACKUP_PATH=/tmp/backup/$now
# Создание временной директории для резервных копий
mkdir -p $BACKUP_PATH
# Остановка затрагиваемых бэкапом сервисов
systemctl stop apache2 postgresql rabbitmq-server salt-minion salt-minion-standalone
# Архивирование БД PostgreSQL
tar -zcvf $BACKUP_PATH/postgresql.tar.gz /var/lib/postgresql/
# Архивирование данных брокера очередей RabbitMQ
tar -zcvf $BACKUP_PATH/rabbitmq.tar.gz /var/lib/rabbitmq/mnesia/
# Архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
# Архивирование директории repo/storage
tar -zcvf $BACKUP_PATH/storage.tar.gz /opt/rbta/aldpro/repo/storage/
# Запуск бэкапируемых сервисов
systemctl start apache2 postgresql rabbitmq-server salt-minion salt-minion-standalone
А вот скрипт для восстановления:
#!/bin/bash
# Переход в директорию с резервными копиями
cd /tmp/backup
# Остановка затрагиваемых восстановлением сервисов
systemctl stop apache2 postgresql rabbitmq-server salt-minion salt-minion-standalone
# Восстановление БД PostgreSQL
tar -C "/" -xvf postgresql.tar.gz
# Восстановление RabbitMQ
tar -C "/" -xvf rabbitmq.tar.gz
# Восстановление логов
tar -C "/" -xvf log.tar.gz
# Восстановление директории etc
tar -C "/" -xvf etc.tar.gz
# Восстановление ipa-client
tar -C "/" -xvf ipa-client.tar.gz
# Восстановление директории с репозиториями
tar -C "/" -xvf storage.tar.gz
# Перезагрузка
reboot
Подсистема DHCP
Вам следует учесть, что подсистема DHCP хранит часть данных в каталоге. Для выполнения резервного копирования подсистемы DHCP необходимо выполнить скрипт:
#!/usr/bin/env bash
# Название директории для резервной копии формируется
# из текущей даты и находится в папке /tmp/backup
now=$(date +"%d-%m-%Y")
BACKUP_PATH=/tmp/backup/$now
# Создание временной директории для резервных копий
mkdir -p $BACKUP_PATH
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
# Архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
А вот скрипт для восстановления:
#!/bin/bash
# Перейти в директорию с резервными копиями
cd /tmp/backup/
# Остановка затрагиваемых восстановлением сервисов
systemctl stop isc-dhcp-server salt-minion salt-minion-standalone
# Восстановление логов
tar -C "/" -xvf log.tar.gz
# Восстановление директории etc
tar -C "/" -xvf etc.tar.gz
# Восстановление ipa-client
tar -C "/" -xvf ipa-client.tar.gz
# Перезагрузка
reboot
Подсистема PXE
Вам следует учесть, что подсистема PXE хранит часть данных в каталоге. Для выполнения резервного копирования подсистемы PXE необходимо выполнить скрипт:
#!/usr/bin/env bash
# Название директории для резервной копии формируется
# из текущей даты и находится в папке /tmp/backup
now=$(date +"%d-%m-%Y")
BACKUP_PATH=/tmp/backup/$now
# Создание временной директории для резервных копий
mkdir -p $BACKUP_PATH
# Остановка затрагиваемых бэкапом сервисов
systemctl stop apache2 postgresql salt-minion salt-minion-standalone
# Архивирование PostgreSQL
tar -zcvf $BACKUP_PATH/postgresql.tar.gz /var/lib/postgresql/
# Архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
# Архивирование директории tftp
tar -zcvf $BACKUP_PATH/tftp.tar.gz /var/www/tftp/
# Запуск затрагиваемых бэкапом сервисов
systemctl start apache2 postgresql salt-minion salt-minion-standalone
А вот скрипт для восстановления:
#!/bin/bash
# Переход в директорию с резервными копиями
cd /tmp/backup
# Остановка затрагиваемых восстановлением сервисов
systemctl stop apache2 tftpd-hpa postgresql salt-minion salt-minion-standalone
# Восстановление БД PostgreSQL
tar -C "/" -xvf postgresql.tar.gz
# Восстановление логов
tar -C "/" -xvf log.tar.gz
# Восстановление директории etc
tar -C "/" -xvf etc.tar.gz
# Восстановление ipa-client
tar -C "/" -xvf ipa-client.tar.gz
# Восстановление директории tftp
tar -C "/" -xvf tftp.tar.gz
# Перезагрузка
reboot
Подсистема мониторинга
Для выполнения резервного копирования подсистемы мониторинга необходимо выполнить скрипт:
#!/usr/bin/env bash
# Название директории для резервной копии формируется
# из текущей даты и находится в папке /tmp/backup
now=$(date +"%d-%m-%Y")
BACKUP_PATH=/tmp/backup/$now
# Создание временной директории для резервных копий
mkdir -p $BACKUP_PATH
# Остановка затрагиваемых бэкапом сервисов
systemctl stop apache2 zabbix-agent zabbix-server postgresql salt-minion salt-minion-standalone
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
# Архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
# Архивирование zabbix
tar -zcvf $BACKUP_PATH/zabbix.tar.gz /usr/share/zabbix/
# Архивирование БД PostgreSQL
tar -zcvf $BACKUP_PATH/postgresql.tar.gz /var/lib/postgresql/
# Запуск затрагиваемых бэкапом сервисов
systemctl start apache2 zabbix-agent zabbix-server postgresql salt-minion salt-minion-standalone
А вот скрипт для восстановления:
#!/bin/bash
# Перейти в директорию с резервными копиями
cd /tmp/backup/
# Остановка затрагиваемых бэкапом сервисов
systemctl stop apache2 zabbix-agent zabbix-server postgresql salt-minion salt-minion-standalone
# Восстановление БД PostgreSQL
tar -C "/" -xvf postgresql.tar.gz
# Восстановление ipa-client
tar -C "/" -xvf ipa-client.tar.gz
# Восстановление логов
tar -C "/" -xvf log.tar.gz
# Архивирование директории etc
tar -C "/" -xvf etc.tar.gz
# Восстановление директории zabbix
tar -C "/" -xvf zabbix.tar.gz
# Перезагрузка
reboot
Подсистема журналирования
Для выполнения резервного копирования подсистемы журналирования необходимо выполнить скрипт:
#!/usr/bin/env bash
# Название директории для резервной копии формируется
# из текущей даты и находится в папке /tmp/backup
now=`date +"%d-%m-%Y"\`
BACKUP_PATH=/tmp/backup/$now
# Создание временной директории для резервных копий
mkdir -p $BACKUP_PATH
# Архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz /var/log/
# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
А вот скрипт для восстановления:
#!/bin/bash
# Переход в директорию с резервными копиями
cd /tmp/backup/
# Остановка затрагиваемых восстановлением сервисов
systemctl stop syslog-ng salt-minion salt-minion-standalone
# Восстановление логов
tar -C "/" -xvf log.tar.gz
# Восстановление директории etc
tar -C "/" -xvf etc.tar.gz
# Восстановление ipa-client
tar -C "/" -xvf ipa-client.tar.gz
# Перезагрузка
reboot
Настройка регулярного резервного копирования через CRON
Допустим, мы создали скрипт /root/backup_dc.sh для резервного копирования контроллера домена и хотим запускать его регулярно в нерабочие часы. Для этого мы можем настроить планировщик заданий cron.
Чтобы перейти к редактированию конфигурационного файла cron, выполните команду sudo crontab -e
. Задания cron задаются в следующем синтаксисе:
минута час день_месяца месяц день_недели команда
Где:
минута — значение от 0 до 59, которое указывает, на какой минуте в пределах часа должна быть выполнена указанная команда.
Например, значение 5 означает, что задание требуется выполнить на 5-й минуте.
Если указать символ «*», то задание будет выполняться каждую минуту. Если указать «*/5», то задание будет выполняться через каждые 5 минут.
час — значение от 0 до 23, которое указывает, в каком часу в пределах суток должна быть выполнена команда. Например, значение 4 означает, что задание нужно выполнять в 4 часа ночи.
Так же как с минутами, символ «*» означает, то задание будет выполняться каждый час, а если указать «*/4», то через каждые 4 часа.
день_месяца — значение от 1 до 31, которое указывает, в какой день месяца нужно выполнять задание. Например, значение 3 означает, что задание нужно выполнять 3-го числа каждого месяца. Если указать «*», то задание не будет привязано к дням месяца.
месяц — значение от 1 до 12, которое указывает, в каком месяце требуется выполнять задание. Например, значение 2 означает, что задание нужно выполнять в феврале. Если указать «*», то задание не будет привязано к месяцам года.
день_недели — значение от 0 до 6, которое указывает, по каким дням недели нужно выполнять задание. Отсчет начинается с воскресенья (0) и заканчивается субботой (6). Например, значение 1 означает, что задание нужно выполнять по понедельникам.
Вместо цифр можно использовать названия дней недели в формате SUN, MON и т.д. Если указать «*», то задание не будет привязано к дням недели.
команда — задает команду, которая должна выполняться по указанному расписанию. Может содержать полный путь к файлу, параметры, инструкции перенаправления вывода. Если используются пробелы, команду лучше ограничить кавычками.
Приведем несколько полных примеров:
Например, если мы захотим запускать скрипт в час ночи, то нужно ввести строку:
0 1 * * * /root/backup_dc.sh
Если нужно запускать скрипт в час ночи, но только по воскресениям:
0 1 * * sun /root/backup_dc.sh
Если вы хотите запускать скрипт в час ночи, но только один раз в месяц 1-го числа:
0 1 1 * * /root/backup_dc.sh
Практика и тестирование
Заключение
Вот мы и подошли к завершению. Осталось только понять, как можно интегрировать дополнительные информационные системы с каталогом, чтобы извлечь максимум выгоды от внедрения каталога.
Дополнительные источники информации
Отсутствуют