D/ DOBBYDEV DOCS

BLACKHOLE / DOCUMENTATION

Документация Blackhole

Понятные инструкции по настройке, работе и обслуживанию системы.

Руководство / 18

Мастер Active/Standby и синхронизация данных

Добавление узлов отдельно от ролей, подготовка и передача образов по ролям, отдельные планы данных и ограничения незавершённого полного failover.

Сначала добавить узлы, затем назначить роли

  1. Для каждого нового сервера откройте «Инфраструктура → Узлы кластера → Добавить узел» (/ui/nodes/add). Укажите IP или DNS/FQDN, SSH-порт, пользователя и пароль либо приватный ключ. Проверьте соединение и явно подтвердите добавление. Устанавливаются отдельный ключ управления и агент mTLS; пароль SSH не сохраняется. На этом этапе роли, почтовые приложения и репликация не назначаются.
  2. Отпечаток SSH-ключа сверяйте по независимому доверенному каналу. Принятие первого наблюдаемого ключа (TOFU) само по себе не доказывает подлинность сервера. Смена подтверждённого ключа требует отдельного разбора. «Отдельная проверка SSH» (/ui/nodes/check) не заменяет добавление узла.
  3. Глобальный системный администратор открывает «Инфраструктура → Failover-кластер → Создать кластер» (/ui/cluster/create). Текущий мастер состоит из трёх этапов: 1. Роли узлов; 2. Компоненты; 3. Синхронизация данных. На первом этапе выберите уже добавленные резервный и инфраструктурный узлы. Active — существующий основной почтовый сервер; Standby — резервный; инфраструктурный узел предназначен для etcd и Redis и хранит данные Redis. Active/Active пока недоступен.
  4. Нажмите «Проверить выбранные узлы», сверьте состав и подтвердите «Сохранить роли и далее». Проверка использует агенты по mTLS; SSH-паролей в мастере ролей нет. Сохранение состава не устанавливает хранилища и не включает обслуживание пользователей на резерве. При неизвестном исходе нажмите «Уточнить результат сохранения», а не повторяйте команду. Сохранённые роли и доступный агент не означают готовый кластер; ошибка чтения не доказывает отсутствие ранее сохранённого состава.

Подготовить и передать только компоненты Blackhole

  1. На этапе 2 последовательно пройдите 2.1 «Проверить основной узел», 2.2 «Подготовить кластерные образы» и 2.3 «Передать образы по ролям». Сохранение проверенной подготовки создаёт кандидат конфигурации, не меняя рабочую базу и почту. В 2.2 отдельно проверьте пакет Patroni, etcd и MailGW и подтвердите подготовку образов на основном узле; это не запускает миграцию данных.
  2. В 2.3 нажмите «Проверить состав по ролям». Сверьте списки резервного и инфраструктурного узлов: план использует фактически установленный доверенный состав Blackhole; посторонние Docker-контейнеры не включаются. Инфраструктурный узел не должен получать почтовые приложения как второй резервный. Образы поступают только с основного, с сохранением имён и тегов.
  3. Явно подтвердите показанный состав и нажмите «Передать на оба узла». Каждый образ передаётся последовательно и проверяется через mTLS, без внешнего registry. В состоянии очереди проверяйте текущий образ, переданные байты, этап и ошибку. Закрытие мастера не останавливает сохранённое задание; при неизвестном исходе сначала обновите очередь и сверяйте результат. Наличие образов не означает запуск приложений, копирование томов или готовность переключения.
  4. После проверки обеих передач подключение кластерных исполнителей требует отдельной проверки и подтверждения. Оно изменяет конфигурацию управления агента, но само не запускает PostgreSQL, Redis или почтовые реплики. Не считайте состояния «образы готовы» и «исполнители подключены» подтверждением перевода рабочих хранилищ в кластер.

Планы данных — отдельный опасный этап

  1. Этап 3 «Синхронизация данных» не выполняется автоматически после сохранения ролей или передачи образов. Сначала получите планы и проверьте доступные операции и предпосылки именно этой установки. Перевод существующих PostgreSQL под Patroni и Redis standalone в Cluster меняет работающую систему: необходимы согласованное окно обслуживания, проверенная резервная копия и план отката с сохранением существующих данных. Наличие панели или проверенного образа не подтверждает завершённую миграцию.
  2. В отдельной панели PostgreSQL используется план начальной копии и WAL streaming, не копирование работающего каталога базы. Подготовка реплики и переход основного под Patroni — разные действия. План реплики сам не подтверждает принятие существующей базы Patroni, кворум etcd или синхронное подтверждение транзакций. Запускайте только доступную подтверждённую операцию после проверки её плана.
  3. Панели Redis показывают поддержанные задания репликации и измеренные смещения. Не путайте отдельную Redis-реплику с переходом standalone в Redis Cluster из трёх основных экземпляров и трёх реплик. Готовность полного перехода и сохранность существующих данных требуют отдельной проверки; здоровый контейнер не доказывает отсутствие отставания. Репликация асинхронная.
  4. В панели «Письма · постоянная синхронизация» сначала нажмите «Проверить план писем» и проверьте владельцев, UID/GID, каталоги и предпосылки пассивного Dovecot. Радиокнопка подтверждения относится к конкретному почтовому заданию, а не ко всем хранилищам. Поддержанное задание использует Dovecot DSYNC по mTLS; его результат и дальнейшие циклы проверяются отдельно. Клиентские порты и обслуживание пользователей на резерве этим заданием не включаются. Браузер и SSH не являются постоянным каналом синхронизации; закрытие страницы не подтверждает и не отменяет результат.

Читать прогресс и восстановить просмотр

В мастере и «Узлы кластера» отдельно показаны задания PostgreSQL, Redis и писем. У почтового задания видны этап, назначенные ящики, существующие и ещё не созданные каталоги, очередь, активные операции, подтверждения и блокировки. Измеренные байты текущей передачи не означают размер всех ящиков: если общий объём неизвестен, процент не вычисляется. Просроченное наблюдение и неизвестный результат не заменяются нулями. После закрытия страницы откройте сохранённую пару либо задание в мониторинге. Повторный вход нужен при недействительной сессии или требовании конкретной изменяющей операции; агенты продолжают сохранённую работу независимо от браузерной сессии.

Владение ящиками и смена пароля

Ящик привязан к неизменяемой учётной записи, AD GUID, размещению и физическому исходному хранилищу, не только к адресу. Новый AD-объект с прежним адресом не получает старые письма. Смена пароля того же владельца требует отдельной проверки security epoch: старый исполнитель должен быть подтверждённо остановлен, затем оба агента подтверждают смену привязки. Неизвестный исход, изменившееся хранилище или повторная смена личности во время незавершённой операции блокируют продолжение. Не удаляйте журнал и не меняйте идентификаторы вручную для обхода блокировки.

Files: подтвердить владельца существующих файлов

Это отдельное подтверждение владения на источнике, не готовый резерв Files. Новый пользователь с прежним адресом не получает исторические файлы автоматически. Источник по умолчанию не подключён: available=false и source_listener_not_configured означают отсутствующую серверную предпосылку, а не просьбу вручную ввести UUID или ключи.

  1. После сохранения состава и проверки переданных образов откройте этап 3, панель «Files · владельцы существующих файлов», если она доступна для этой установки. Нажмите «Получить пользователей Files» и выберите пользователя из серверного списка. UUID, путь каталога и ключи в браузере не вводятся; неподтверждённый профиль Files выбрать нельзя.
  2. Проверьте адрес и AD GUID, если он есть. План связывает учётную запись с версией безопасности, штатным профилем Files, томом и физическим каталогом. Совпадение адреса само по себе не доказывает принадлежность старых файлов.
  3. По умолчанию выбрано «Не подтверждаю принадлежность». Выберите радиокнопку «Подтверждаю: существующие файлы принадлежат …» и точно повторите адрес в поле «Повторите адрес владельца». Затем нажмите «Подтвердить владельца файлов». Идентификатор администратора берётся из действительной глобальной системной сессии, не из формы. Действие сохраняет подтверждение владения, не перемещает файлы и не меняет AD-пользователей.
  4. При потерянном ответе используйте «Проверить сохранённую привязку». После перезапуска читается сохранённый результат; команда автоматически не повторяется. Состояния confirming/unknown не означают успех. Изменение личности, каталога или пары блокирует старый план.
  5. source_confirmed=true подтверждает получение записи владельца на источнике; проверяйте также state/reason, поскольку последующая смена личности может заблокировать её. В этом сценарии target_configured=false и target_enrollment_not_available означают, что получатель данных ещё не подключён. replication_ready=false и promote=false сохраняются.

Files: подготовленные сертификаты и CLI — ещё не активация

В коде подготовлены отдельный серверный пакет mTLS-сертификатов с неизменяемой привязкой к паре/enrollment и закрытый CLI files-source-artifact для проверки и создания кандидата конфигурации. Закрытый ключ CA и глобальный управляющий ключ не передаются. prepared=true не включает listener: source_executor_available=false и source_listener_active=false. Типизированный исполнитель включения источника, подготовка служебного доступа БД только для чтения и безопасное подключение конфигурации к рабочему Files ещё не соединены с мастером. Не выполняйте произвольный SSH/shell вместо этого шага. Отдельная регистрация владельцев на резерве также не активирует получатель: даже configured=true сохраняет data_replication_started=false. Полный автоматический сценарий Files и согласование файлов с отдельной базой ещё не готовы. Задание одного цикла поколений для заранее настроенных сторон не означает бессрочную синхронизацию: лимит места или поколений останавливает работу, а не запускает небезопасную очистку.

Что пока не разрешает переключение

Даже подтверждённые PostgreSQL, Redis, личные ящики и владельцы Files не означают готовый failover. Полный согласованный цикл файлов и их отдельной базы, календарей и контактов DAV, прав совместной работы, Sieve, очереди SMTP и остальных долговечных журналов ещё не завершён. Общая точка восстановления, fencing и включение почтовых writer на резерве также не завершены. Healthcheck или потеря связи не доказывают остановку прежнего мастера. Автоматическое переключение двух узлов не выполняется; ручное переключение должно быть заблокировано до проверки всех данных и остановки прежнего writer. При асинхронной копии последние подтверждённые изменения могут отсутствовать на резерве; аварийный RPO=0 не обещается.

Если план недоступен

Проверьте подключение обоих агентов, их mTLS-идентичности, поддержку нужной операции, завершение передачи образов и достаточность диска. Старый агент только мониторинга может не поддерживать подготовку данных. Не заменяйте закрытый план произвольным shell или Compose и не копируйте живую базу вручную. Изменившиеся контейнеры, образы, размещение или владельцы требуют нового безопасного плана, а не повторного запуска старого запроса.