Архитектура кластера
В IVA Mail реализован симметричный динамический кластер с общим сетевым хранилищем. Кластер состоит из backend и frontend узлов, совместно обслуживающих пользовательские подключения, данные и объекты системы.
В качестве общего хранилища используется сетевой файловый ресурс (например, NFS), подключённый ко всем узлам кластера.
Описание процедуры установки кластера приведено в разделе Кластерная установка.
Общая схема кластерной конфигурации
Клиентские подключения к серверу могут выполняться по следующим протоколам:
-
JUMP (HTTPS);
-
IMAP;
-
POP3;
-
ActiveSync (HTTPS);
-
DAV-протоколы (HTTPS).
Передача подключений между узлами может выполняться через внешний балансировщик нагрузки уровня L3-L4.
Взаимодействие между узлами осуществляется через внутренний CMD-протокол.
Архитектура backend-узлов
Все backend-узлы кластера являются симметричными и могут выполнять одинаковые функции. При этом логически каждый backend может находиться в одном из состояний:
| Роль | Назначение |
|---|---|
Dispatcher (Диспетчер) |
Основной управляющий узел кластера. Поддерживает образ кластера, координирует блокировки объектов, хранит таблицу backend-узлов и управляет синхронизацией состояния. |
Reserve (Резерв) |
Резервный backend-узел. Автоматически принимает роль Dispatcher при отказе основного диспетчера. |
Online (Онлайн) |
Рабочий backend-узел, обслуживающий клиентские подключения, объекты и пользовательские данные. |
Offline (Оффлайн) |
Backend-узел, временно выведенный из состава кластера. |
Назначение ролей выполняется автоматически и не требует ручной конфигурации.
Для запуска сервера в режиме backend используется параметр командной строки:
--backend
Общее хранилище кластера
В качестве общего хранилища рекомендуется использовать сетевую файловую систему NFS.
На каждом backend-узле общее хранилище подключается в базовой директории сервера как символьная ссылка:
Cluster
Общее хранилище содержит:
-
heartbeat-файл
hb.json; -
индексы доменов;
-
данные кластерных объектов;
-
конфигурацию кластерных доменов;
-
почтовые правила;
-
маршрутизацию;
-
метаданные блокировок;
-
служебные данные синхронизации.
| Физически данные располагаются в общем файловом хранилище, однако логическая сериализация и контроль атомарности операций выполняются Dispatcher-узлом. |
Инициализация кластера
Назначение Dispatcher (Диспетчер)
При запуске backend-узел выполняет поиск активного Dispatcher.
Если Dispatcher отсутствует:
-
backend пытается зарегистрировать себя в
hb.json. -
Первый успешно зарегистрировавшийся backend становится Dispatcher.
При отказе Dispatcher:
-
Reserve автоматически принимает роль Dispatcher.
-
Информация о новом состоянии рассылается backend-узлам кластера.
Если Dispatcher и Reserve отсутствуют одновременно, выбор нового Dispatcher выполняется через запись в hb.json.
Образ кластера
Dispatcher поддерживает единый логический образ кластера, включающий:
-
общий кластерный секрет;
-
список узлов кластера;
-
список кластерных доменов;
-
список объектов доменов;
-
маршрутизацию;
-
настройки взаимодействия узлов.
Передача данных между backend-узлами выполняется через CMD и HTTP протоколы.
Backend-узлы могут читать часть данных напрямую из общего хранилища, однако проверка актуальности состояния выполняется через Dispatcher.
Межкластерное взаимодействие
Для взаимодействия backend-узлов используются модули CMD и HTTP.
CMD используется для:
-
синхронизации состояния кластера;
-
передачи образа кластера;
-
регистрации backend-узлов;
-
управления блокировками;
-
передачи команд между backend-узлами;
-
координации обработки объектов.
HTTP используется для:
-
выполнения файловых операций.
Настройки CMD
Основные параметры CMD:
| Параметр | Описание |
|---|---|
Адрес сервера в кластере |
IP-адрес текущего backend-узла. |
Порт для CMD |
Порт CMD-модуля для взаимодействия backend-узлов. По умолчанию используется порт |
Шифрование |
Включает TLS-шифрование CMD и HTTP соединений между backend-узлами. |
Пароль |
Пароль кластерной аутентификации backend-узлов. |
| Порт CMD и параметры шифрования должны совпадать на всех backend-узлах кластера. |
Блокировки объектов
Любая операция с объектами домена выполняется через механизм кластерных блокировок.
Принцип работы
-
backend запрашивает блокировку объекта у Dispatcher.
-
Dispatcher атомарно регистрирует блокировку.
-
После получения блокировки backend выполняет обработку объекта.
Поддерживаются следующие типы блокировок:
-
временные;
-
рекурсивные (со счётчиком сессий).
Поведение при конфликте блокировок
| Ситуация | Поведение |
|---|---|
Объект свободен |
Backend получает блокировку и обрабатывает объект локально. |
Объект уже заблокирован |
Обработка выполняется удалённо через backend-владельца объекта. |
IMAP/JUMP-подключение |
Соединение проксируется на backend-владельца объекта. |
SMTP-доставка |
Используется удалённая папка владельца объекта. |
Обработка клиентских подключений
Клиентское подключение может быть принято любым backend-узлом кластера.
После принятия подключения backend:
-
либо обслуживает соединение локально;
-
либо проксирует соединение backend-владельцу объекта.
Поддерживается:
-
IMAP;
-
POP3;
-
JUMP;
-
ActiveSync;
-
DAV-протоколы.
Балансировка нагрузки
Для распределения клиентских подключений рекомендуется использовать внешний балансировщик нагрузки L3-L4, например: HAProxy в режиме TCP.
Рекомендуется балансировать входящие соединения по протоколам:
-
HTTP/HTTPS;
-
IMAP;
-
POP3;
-
ActiveSync;
-
DAV.
SMTP рекомендуется распределять через MX-записи DNS.
| Исходящие подключения SMTP, HTTP, LDAP, CMD и другие межсерверные соединения не балансируются и выполняются backend-узлами напрямую. |
Общий секрет кластера
При первом запуске Dispatcher генерирует общий кластерный секрет.
Новые backend-узлы:
-
Выполняют согласование ключей.
-
Получают секрет по CMD-соединению.
-
Сохраняют его в локальных настройках.
| При повторном запуске кластера первым должен запускаться backend, содержащий актуальный кластерный секрет. Иначе возможна рассинхронизация состояния кластера. |
