Автозапуск и восстановление
На этой странице описано, как репозитории автоматически монтируются и запускаются при загрузке, и как периодический реконсилятор восстанавливает репозиторий, если он останавливается после того, как сервер уже работает.
О том, как включить или отключить автозапуск для репозитория, см. Сервисы: Автозапуск при загрузке.
Как работает автозапуск
При включении автозапуска для репозитория Rediacc генерирует случайный LUKS-ключевой файл размером 256 байт и добавляет его в LUKS-слот 1 на зашифрованном томе. Ключевой файл сохраняется по адресу:
{datastore}/.credentials/keys/{guid}.key
Это позволяет машине монтировать репозиторий без запроса парольной фразы. LUKS-слот 0 (ваша парольная фраза) не изменяется.
При загрузке однократный systemd-сервис rediacc-autostart.service читает список репозиториев с включённым автозапуском, монтирует каждый из них с помощью ключевого файла, запускает Docker-демон для каждого репозитория и выполняет хук up() в Rediaccfile. При выключении сервис выполняет down(), останавливает Docker и закрывает тома LUKS.
Примечание по безопасности: Ключевой файл предоставляет root-уровень доступа к репозиторию без парольной фразы. Любой пользователь с root-доступом к серверу может смонтировать репозитории с включённым автозапуском. Оцените это с учётом вашей модели угроз перед включением автозапуска для чувствительных репозиториев.
Пробел в восстановлении
Автозапуск при загрузке выполняется ровно один раз за каждую загрузку. Watchdog маршрутизатора, который работает непрерывно после этого, перезапускает только контейнеры внутри уже запущенного репозитория с работающим Docker-демоном. Он не может повторно смонтировать том LUKS или перезапустить остановившийся Docker-демон для конкретной сети.
Это означает, что если том LUKS репозитория размонтирован или его Docker-демон остановлен после загрузки сервера, ни сервис загрузки, ни watchdog не восстановят его. До появления реконсилятора репозиторий в таком состоянии оставался остановленным до вмешательства оператора.
Периодический реконсилятор
Таймер systemd rediacc-autostart-reconcile.timer срабатывает примерно каждые 3 минуты и выполняет renet repository reconcile. Для каждого репозитория с включённым автозапуском реконсилятор проверяет три условия:
- Смонтирован ли том LUKS?
- Работает ли Docker-демон для данной сети?
- Запущены ли сервисы репозитория?
Если какая-либо проверка не проходит, реконсилятор восстанавливает репозиторий с помощью ключевого файла: монтирует том, запускает Docker-демон и выполняет up(). Парольная фраза не требуется.
Репозитории, которые работоспособны, в данный момент заняты холодным резервным копированием, или находятся в пределах окна отступления, пропускаются.
Откат и маркеры постоянных сбоев
Репозиторий, которому не удалось восстановиться, не повторяет попытку немедленно при каждом тике. Реконсилятор использует экспоненциальный откат:
| Количество сбоев | Ожидание до следующей попытки |
|---|---|
| 1 | 1 минута |
| 2 | 2 минуты |
| 3 | 5 минут |
| 4 | 15 минут |
| 5+ | 30 минут, затем 60 минут |
После 5 последовательных сбоев реконсилятор создаёт долговечный файл-маркер по адресу:
/var/lib/rediacc/reconcile/failed/{guid}
Этот файл переживает ротацию журналов. Его наличие означает, что репозиторий требует вмешательства оператора. Реконсилятор фиксирует сбой на уровне error в журнале и прекращает попытки автоматического восстановления для данного репозитория до удаления маркера.
Распространённые причины постоянных сбоев восстановления:
- Ненадёжная или просроченная лицензия репозитория: проверка лицензии выполняется перед
up(). - Отсутствующий ключевой файл: если ключевой файл по адресу
{datastore}/.credentials/keys/{guid}.keyбыл удалён, реконсилятор не может смонтировать том без парольной фразы. - Повреждённый Rediaccfile: синтаксическая ошибка или хук
up(), который всегда завершается с ненулевым кодом.
Взаимосвязь с watchdog маршрутизатора
Реконсилятор и watchdog маршрутизатора обрабатывают разные уровни сбоев и разработаны как дополняющие друг друга:
| Уровень | Что обрабатывает |
|---|---|
| Watchdog маршрутизатора | Перезапуск контейнеров внутри работающего, смонтированного репозитория с активным Docker-демоном |
Реконсилятор (rediacc-autostart-reconcile.timer) | Восстановление на уровне репозитория: повторное монтирование LUKS, перезапуск Docker-демона, повторное выполнение up() |
Если один контейнер падает внутри работоспособного репозитория, watchdog обрабатывает это. Если останавливается весь демон репозитория, реконсилятор обрабатывает это.
Проверка состояния восстановления
Статус таймера и сервиса
systemctl status rediacc-autostart-reconcile.timer
systemctl list-timers rediacc-autostart-reconcile.timer
Журналы реконсилятора
journalctl -u rediacc-autostart-reconcile.service
journalctl -u rediacc-autostart-reconcile.service --since "1 hour ago"
Маркеры постоянных сбоев
Список репозиториев с долговечными маркерами сбоев:
ls /var/lib/rediacc/reconcile/failed/
Каждое имя файла: это GUID репозитория. Для сопоставления GUID с именами репозиториев используйте rdc config repository list.
Чтобы удалить маркер после устранения основной проблемы, удалите файл:
rm /var/lib/rediacc/reconcile/failed/{guid}
Реконсилятор предпримет попытку восстановления при следующем срабатывании таймера.
Связанные страницы
- Сервисы: Автозапуск при загрузке: включение и отключение автозапуска, управление ключевыми файлами
- Резервное копирование и восстановление: взаимодействие холодного резервного копирования с работающими сервисами