Войти

Кластер и отказоустойчивость

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

Кластеризация — часть SPZGate On-Premise (см. Установка). Минимум для отказоустойчивости — два узла; при трёх и более новый узел достаточно один раз спарить с любым существующим — остальные пары построятся автоматически (см. «Автообнаружение» ниже).

Как устроена репликация

Каждый узел ведёт собственный WAL (write-ahead log) всех событий трекера. Узлы обмениваются данными напрямую друг с другом по собственному бинарному протоколу — без HTTP и без зависимости от веб-панели: сама панель лишь просит свой локальный движок выполнить операцию, а дозванивается до другого узла уже он сам.

Добавление узла в кластер

1

На первом узле: добавьте пару без кода

В панели первого узла откройте раздел Шлюзы → Добавить шлюз, укажите IP второго узла и направление (обычно «оба»), поле «Код» оставьте пустым. Узел сгенерирует пару и код подтверждения — пара останется в статусе «Ожидает подтверждения», пока её не подтвердят со второй стороны.

Код подтверждения передайте администратору второго узла вне этой формы — голосом, в мессенджере — не тем же каналом, которым его можно перехватить автоматически.
2

На втором узле: добавьте пару с этим кодом

В панели второго узла — тот же раздел Шлюзы → Добавить шлюз, IP первого узла и код, полученный на шаге 1. Второй узел дозванивается до первого напрямую по бинарному протоколу и подтверждает пару — оба узла переходят в статус «Активна» одновременно, без дополнительных действий на первом узле.

3

Автообнаружение остальных узлов кластера

Как только пара становится активной, оба узла «знакомят» новый узел со всеми своими остальными активными парами. Поэтому для кластера из трёх и более узлов достаточно одной ручной пары между новым узлом и любым узлом уже существующего кластера — остальные связи выстроятся сами, без похода по каждому узлу отдельно.

4

При необходимости — подтяните полную историю

Новая пара реплицирует новые события сразу, но не досылает историю, накопленную ДО момента пары. Если присоединяется узел с уже накопленными самостоятельно данными (например, поднятый из бэкапа) и историю нужно свести к одному состоянию — используйте кнопку «Синхронизировать» у нужной пары (см. ниже).

Важно: полная синхронизация переносит не только историю трекера, но и конфигурацию — домены, пользователей, списки. Она замещает данные на принимающей стороне данными узла-источника. Для двух узлов с независимо накопленной конфигурацией (а не для чистого/восстанавливаемого узла) полная синхронизация может быть разрушительной — прежде чем нажимать, убедитесь, что понимаете, какая сторона у вас источник, а какая — приёмник.

Управление репликацией и синхронизацией

Раздел Шлюзы показывает все пары этого узла, их статус и отставание от актуального состояния.

Статус
Значение
Ожидает подтверждения
Пара создана этой стороной, ждёт подтверждения с другой (см. шаг 2 выше)
Активна
Репликация идёт в обе стороны (или в одну — см. «Направление»)
Недоступен
Узел не отвечает на сетевом уровне — очередь копится, будет доставлена при восстановлении связи
Ошибка
Соединение есть, но пара отклонена (чаще всего — рассинхронизировался код подтверждения)
Отозвана
Пара помечена неактивной — см. предупреждение об «Отозвать» ниже

Рядом со статусом активной пары показано отставание — сколько записей ещё не подтверждено соседним узлом и сколько времени прошло с последнего подтверждения. Устойчивое ненулевое отставание, которое не сокращается, — повод проверить сетевую связность между узлами на порту репликации.

Синхронизировать / Синхронизировать весь кластер

Кнопка «Синхронизировать» у конкретной пары запускает полный перенос данных с узла-источника (см. предупреждение в шаге 4). «Синхронизировать весь кластер» — то же самое по очереди для каждой активной пары этого узла. Операция блокирующая и может занять продолжительное время на большой истории — не закрывайте вкладку до завершения.

Отозвать и Удалить

Обе кнопки останавливают пару, но не одинаково надёжно:

Если нужно гарантированно и окончательно остановить обмен данными с узлом — используйте «Удалить», а не «Отозвать».

SMTP-балансировщик между узлами

Когда почта разных доменов обрабатывается разными узлами, а внешний мир должен видеть один адрес, перед узлами ставится SMTP-балансировщик: он принимает сессии на одном адресе и распределяет их по узлам — поровну, по весам, с резервными серверами и по статическим маршрутам для отправителей и получателей. Балансировщик устанавливается одной командой установщика и настраивается файлом smtp_balancer.conf.

curl -fsSL https://spamorez.ru/spzgate/install.sh | sudo bash -s -- --balancer --servers 10.0.0.11,10.0.0.12

Подробнее в разделе «Балансировка»: установка и параметры, балансировка backend-серверов, маршруты по отправителю и по получателю, журналы и статус.