Перейти к основному содержанию Перейти к навигации Перейти к нижнему колонтитулу
Ограниченное время: Программа Design Partner — тариф BUSINESS навсегда

Автозапуск и восстановление

Как работает автозапуск, периодический реконсилятор, восстанавливающий репозитории, остановившиеся после загрузки, и как проверять состояние восстановления.

Автозапуск и восстановление

На этой странице описано, как репозитории автоматически монтируются и запускаются при загрузке, и как периодический реконсилятор восстанавливает репозиторий, если он останавливается после того, как сервер уже работает.

О том, как включить или отключить автозапуск для репозитория, см. Сервисы: Автозапуск при загрузке.

Как работает автозапуск

При включении автозапуска для репозитория 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. Для каждого репозитория с включённым автозапуском реконсилятор проверяет три условия:

  1. Смонтирован ли том LUKS?
  2. Работает ли Docker-демон для данной сети?
  3. Запущены ли сервисы репозитория?

Если какая-либо проверка не проходит, реконсилятор восстанавливает репозиторий с помощью ключевого файла: монтирует том, запускает Docker-демон и выполняет up(). Парольная фраза не требуется.

Репозитории, которые работоспособны, в данный момент заняты холодным резервным копированием, или находятся в пределах окна отступления, пропускаются.

Откат и маркеры постоянных сбоев

Репозиторий, которому не удалось восстановиться, не повторяет попытку немедленно при каждом тике. Реконсилятор использует экспоненциальный откат:

Количество сбоевОжидание до следующей попытки
11 минута
22 минуты
35 минут
415 минут
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}

Реконсилятор предпримет попытку восстановления при следующем срабатывании таймера.

Связанные страницы