Руководство / 18
Мастер Active/Standby и синхронизация данных
Добавление узлов отдельно от ролей, подготовка и передача образов по ролям, отдельные планы данных и ограничения незавершённого полного failover.
Сначала добавить узлы, затем назначить роли
- Для каждого нового сервера откройте «Инфраструктура → Узлы кластера → Добавить узел» (/ui/nodes/add). Укажите IP или DNS/FQDN, SSH-порт, пользователя и пароль либо приватный ключ. Проверьте соединение и явно подтвердите добавление. Устанавливаются отдельный ключ управления и агент mTLS; пароль SSH не сохраняется. На этом этапе роли, почтовые приложения и репликация не назначаются.
- Отпечаток SSH-ключа сверяйте по независимому доверенному каналу. Принятие первого наблюдаемого ключа (TOFU) само по себе не доказывает подлинность сервера. Смена подтверждённого ключа требует отдельного разбора. «Отдельная проверка SSH» (/ui/nodes/check) не заменяет добавление узла.
- Глобальный системный администратор открывает «Инфраструктура → Failover-кластер → Создать кластер» (/ui/cluster/create). Текущий мастер состоит из трёх этапов: 1. Роли узлов; 2. Компоненты; 3. Синхронизация данных. На первом этапе выберите уже добавленные резервный и инфраструктурный узлы. Active — существующий основной почтовый сервер; Standby — резервный; инфраструктурный узел предназначен для etcd и Redis и хранит данные Redis. Active/Active пока недоступен.
- Нажмите «Проверить выбранные узлы», сверьте состав и подтвердите «Сохранить роли и далее». Проверка использует агенты по mTLS; SSH-паролей в мастере ролей нет. Сохранение состава не устанавливает хранилища и не включает обслуживание пользователей на резерве. При неизвестном исходе нажмите «Уточнить результат сохранения», а не повторяйте команду. Сохранённые роли и доступный агент не означают готовый кластер; ошибка чтения не доказывает отсутствие ранее сохранённого состава.
Подготовить и передать только компоненты Blackhole
- На этапе 2 последовательно пройдите 2.1 «Проверить основной узел», 2.2 «Подготовить кластерные образы» и 2.3 «Передать образы по ролям». Сохранение проверенной подготовки создаёт кандидат конфигурации, не меняя рабочую базу и почту. В 2.2 отдельно проверьте пакет Patroni, etcd и MailGW и подтвердите подготовку образов на основном узле; это не запускает миграцию данных.
- В 2.3 нажмите «Проверить состав по ролям». Сверьте списки резервного и инфраструктурного узлов: план использует фактически установленный доверенный состав Blackhole; посторонние Docker-контейнеры не включаются. Инфраструктурный узел не должен получать почтовые приложения как второй резервный. Образы поступают только с основного, с сохранением имён и тегов.
- Явно подтвердите показанный состав и нажмите «Передать на оба узла». Каждый образ передаётся последовательно и проверяется через mTLS, без внешнего registry. В состоянии очереди проверяйте текущий образ, переданные байты, этап и ошибку. Закрытие мастера не останавливает сохранённое задание; при неизвестном исходе сначала обновите очередь и сверяйте результат. Наличие образов не означает запуск приложений, копирование томов или готовность переключения.
- После проверки обеих передач подключение кластерных исполнителей требует отдельной проверки и подтверждения. Оно изменяет конфигурацию управления агента, но само не запускает PostgreSQL, Redis или почтовые реплики. Не считайте состояния «образы готовы» и «исполнители подключены» подтверждением перевода рабочих хранилищ в кластер.
Планы данных — отдельный опасный этап
- Этап 3 «Синхронизация данных» не выполняется автоматически после сохранения ролей или передачи образов. Сначала получите планы и проверьте доступные операции и предпосылки именно этой установки. Перевод существующих PostgreSQL под Patroni и Redis standalone в Cluster меняет работающую систему: необходимы согласованное окно обслуживания, проверенная резервная копия и план отката с сохранением существующих данных. Наличие панели или проверенного образа не подтверждает завершённую миграцию.
- В отдельной панели PostgreSQL используется план начальной копии и WAL streaming, не копирование работающего каталога базы. Подготовка реплики и переход основного под Patroni — разные действия. План реплики сам не подтверждает принятие существующей базы Patroni, кворум etcd или синхронное подтверждение транзакций. Запускайте только доступную подтверждённую операцию после проверки её плана.
- Панели Redis показывают поддержанные задания репликации и измеренные смещения. Не путайте отдельную Redis-реплику с переходом standalone в Redis Cluster из трёх основных экземпляров и трёх реплик. Готовность полного перехода и сохранность существующих данных требуют отдельной проверки; здоровый контейнер не доказывает отсутствие отставания. Репликация асинхронная.
- В панели «Письма · постоянная синхронизация» сначала нажмите «Проверить план писем» и проверьте владельцев, UID/GID, каталоги и предпосылки пассивного Dovecot. Радиокнопка подтверждения относится к конкретному почтовому заданию, а не ко всем хранилищам. Поддержанное задание использует Dovecot DSYNC по mTLS; его результат и дальнейшие циклы проверяются отдельно. Клиентские порты и обслуживание пользователей на резерве этим заданием не включаются. Браузер и SSH не являются постоянным каналом синхронизации; закрытие страницы не подтверждает и не отменяет результат.
Читать прогресс и восстановить просмотр
В мастере и «Узлы кластера» отдельно показаны задания PostgreSQL, Redis и писем. У почтового задания видны этап, назначенные ящики, существующие и ещё не созданные каталоги, очередь, активные операции, подтверждения и блокировки. Измеренные байты текущей передачи не означают размер всех ящиков: если общий объём неизвестен, процент не вычисляется. Просроченное наблюдение и неизвестный результат не заменяются нулями. После закрытия страницы откройте сохранённую пару либо задание в мониторинге. Повторный вход нужен при недействительной сессии или требовании конкретной изменяющей операции; агенты продолжают сохранённую работу независимо от браузерной сессии.
Владение ящиками и смена пароля
Ящик привязан к неизменяемой учётной записи, AD GUID, размещению и физическому исходному хранилищу, не только к адресу. Новый AD-объект с прежним адресом не получает старые письма. Смена пароля того же владельца требует отдельной проверки security epoch: старый исполнитель должен быть подтверждённо остановлен, затем оба агента подтверждают смену привязки. Неизвестный исход, изменившееся хранилище или повторная смена личности во время незавершённой операции блокируют продолжение. Не удаляйте журнал и не меняйте идентификаторы вручную для обхода блокировки.
Files: подтвердить владельца существующих файлов
Это отдельное подтверждение владения на источнике, не готовый резерв Files. Новый пользователь с прежним адресом не получает исторические файлы автоматически. Источник по умолчанию не подключён: available=false и source_listener_not_configured означают отсутствующую серверную предпосылку, а не просьбу вручную ввести UUID или ключи.
- После сохранения состава и проверки переданных образов откройте этап 3, панель «Files · владельцы существующих файлов», если она доступна для этой установки. Нажмите «Получить пользователей Files» и выберите пользователя из серверного списка. UUID, путь каталога и ключи в браузере не вводятся; неподтверждённый профиль Files выбрать нельзя.
- Проверьте адрес и AD GUID, если он есть. План связывает учётную запись с версией безопасности, штатным профилем Files, томом и физическим каталогом. Совпадение адреса само по себе не доказывает принадлежность старых файлов.
- По умолчанию выбрано «Не подтверждаю принадлежность». Выберите радиокнопку «Подтверждаю: существующие файлы принадлежат …» и точно повторите адрес в поле «Повторите адрес владельца». Затем нажмите «Подтвердить владельца файлов». Идентификатор администратора берётся из действительной глобальной системной сессии, не из формы. Действие сохраняет подтверждение владения, не перемещает файлы и не меняет AD-пользователей.
- При потерянном ответе используйте «Проверить сохранённую привязку». После перезапуска читается сохранённый результат; команда автоматически не повторяется. Состояния confirming/unknown не означают успех. Изменение личности, каталога или пары блокирует старый план.
- 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 и не копируйте живую базу вручную. Изменившиеся контейнеры, образы, размещение или владельцы требуют нового безопасного плана, а не повторного запуска старого запроса.