Архитектура кластера
В IVA Mail реализован симметричный динамический кластер с общим сетевым хранилищем. Кластер состоит из бэкенд- и фронтенд-узлов, совместно обслуживающих пользовательские подключения, данные и объекты системы.
Описание процедуры установки кластера приведено в разделе Кластерная установка.
Общая схема кластерной конфигурации
Узлы кластера IVA Mail выполняют роли бэкенд и фронтенд. Фронтенд-узлы принимают внешние клиентские и почтовые подключения. Бэкенд-узлы работают с данными и общим хранилищем.
Если в кластере есть только бэкенд-узлы — кластер симметричный и каждый узел выполняет обе роли.
Архитектура ориентирована на горизонтальное масштабирование за счёт добавления бэкенд- и фронтенд-узлов.
Назначение компонентов
Фронтенд-узлы кластера
Фронтенд-узлы принимают клиентские и почтовые подключения и работают в режиме Active-Active.
Функции фронтенд-узлов:
-
приём клиентских подключений HTTP (JUMP, ActiveSync), IMAP и POP3 через балансировщик нагрузки;
-
приём входящих SMTP-подключений от внешних почтовых серверов;
-
терминация TLS;
-
обработка очередей сообщений и доставка исходящей почты;
-
получение данных аккаунтов и их папок с бэкенд-узлов через кластерное взаимодействие.
Фронтенд-узлы не подключаются к общему хранилищу и не могут быть диспетчером или резервом.
Сетевое взаимодействие фронтенд-узлов:
| Направление | Протокол и назначение |
|---|---|
Клиенты → Фронтенд |
HTTPS (JUMP, ActiveSync), IMAP, POP3. |
Внешние почтовые серверы → Фронтенд |
SMTP, входящая почта по MX-записям DNS. |
Фронтенд ↔ Бэкенд |
Кластерное взаимодействие (106/TCP, 80/TCP, 143/TCP, 25/TCP). |
Фронтенд → Внешние почтовые серверы |
SMTP, доставка исходящей почты. |
Бэкенд-узлы кластера
Бэкенд-узлы обрабатывают запросы фронтенд-узлов, выполняют аутентификацию пользователей, работают с данными аккаунтов и их папками, а также с общим файловым хранилищем, участвуют в координации кластера.
Роли и состояния бэкенд-узлов
Все бэкенд-узлы симметричны, но логически могут находиться в одном из состояний:
| Роль | Назначение |
|---|---|
Dispatcher (Диспетчер) |
Основной управляющий узел кластера. Поддерживает образ кластера, координирует блокировки объектов, хранит таблицу узлов и управляет синхронизацией состояния. |
Reserve (Резерв) |
Резерв диспетчера, автоматически принимает его роль при отказе основного диспетчера. |
Online (Онлайн) |
Рабочий бэкенд-узел, обслуживающий клиентские подключения, объекты и пользовательские данные. |
Offline (Оффлайн) |
Бэкенд-узел, временно выведенный из состава кластера. |
Назначение ролей происходит динамически и не требует ручной конфигурации.
Общее хранилище кластера
Рекомендуется использовать сетевое файловое хранилище, смонтированное ко всем бэкенд-узлам по протоколу NFSv3.
Все конфигурационные файлы и пользовательские данные кластерных доменов хранятся в единой кластерной директории Cluster.
На бэкенд-серверах эта директория представляет собой часть файловой системы СХД, смонтированную по протоколу NFS v3 в локальную точку монтирования операционной системы.
В рабочих директориях бэкенд-серверов (/var/ivamail) создаётся символьная ссылка Cluster, указывающая на эту точку монтирования. Благодаря этому все компоненты системы работают с каталогом /var/ivamail/Cluster как с единым логическим хранилищем, независимо от физической реализации.
Общее хранилище содержит:
-
heartbeat-файл hb.json;
-
индексы доменов;
-
данные кластерных объектов и доменов (включая настройки, правила и пр.);
-
метаданные блокировок.
| Физически данные располагаются в общем файловом хранилище, однако логическая сериализация и контроль атомарности операций выполняются Dispatcher-узлом. |
Взаимодействие узлов кластера
Модули и протоколы
Для взаимодействия узлов кластера используются модули CMD и HTTP.
CMD используется для:
-
синхронизации состояния кластера;
-
передачи образа кластера;
-
регистрации узлов;
-
управления блокировками;
-
передачи команд между узлами;
-
координации обработки объектов.
HTTP используется для выполнения файловых операций.
Образ кластера
Dispatcher поддерживает единый логический образ кластера, включающий:
-
общий кластерный секрет;
-
список узлов кластера;
-
список кластерных доменов;
-
список объектов доменов;
-
таблицы маршрутизации.
Передача и запрос образа выполняются через кластерное взаимодействие.
Бэкенд-узлы могут читать часть данных напрямую из общего хранилища, однако проверка актуальности состояния выполняется через Dispatcher.
Общий секрет кластера
При первом запуске Dispatcher генерирует общий кластерный секрет.
Новые бэкенд-узлы:
-
Выполняют согласование ключей.
-
Получают секрет по CMD-соединению.
-
Сохраняют его в локальных настройках.
| При повторном запуске кластера первым должен запускаться бэкенд, содержащий актуальный кластерный секрет. Иначе возможна рассинхронизация состояния кластера. |
Параметры кластерного взаимодействия описаны в разделе Настройки кластера.
Обработка подключений и объектов
Балансировка входящих подключений
Клиентские подключения по протоколам доступа принимает балансировщик нагрузки (например, HAProxy в режиме TCP или HTTP) и распределяет их между фронтенд-узлами по round-robin или другому алгоритму.
Рекомендуется балансировать входящие соединения по протоколам:
-
HTTP (для JUMP и ActiveSync);
-
IMAP и POP3.
SMTP-соединения целесообразно «балансировать» указанием IP-адресов или доменных имён фронтенд-узлов в MX-записях DNS.
| Исходящие соединения SMTP, HTTP, LDAP, кластерного взаимодействия и другие не балансируются. Узлы устанавливают их от своего имени: исходящую почту отправляют фронтенд-узлы, к LDAP обращаются бэкенд-узлы. |
Обработка клиентских подключений
Клиентские подключения принимает любой фронтенд-узел и передаёт запрос на бэкенд-узел через кластерное взаимодействие. После этого запрос:
-
либо обслуживается локально на бэкенд-узле;
-
либо проксируется к владельцу объекта (узлу, который его обрабатывает).
Блокировки объектов
Любая операция с объектами домена выполняется через механизм кластерных блокировок.
Принцип работы:
-
Бэкенд запрашивает блокировку объекта у Dispatcher.
-
Dispatcher атомарно регистрирует блокировку.
-
После получения блокировки бэкенд выполняет обработку объекта.
Поддерживаются следующие типы блокировок:
-
временные;
-
рекурсивные (со счётчиком сессий).
Поведение при конфликте блокировок:
| Ситуация | Поведение |
|---|---|
Объект свободен |
Бэкенд получает блокировку и обрабатывает объект локально. |
Объект уже заблокирован |
Обработка выполняется удалённо через бэкенд-владельца объекта. |
IMAP/JUMP-подключение |
Соединение проксируется на бэкенд-владельца объекта. |
SMTP-доставка |
Используется удалённая папка владельца объекта. |
Инициализация и отказоустойчивость кластера
Назначение Dispatcher (Диспетчер)
При запуске бэкенд-узел выполняет поиск активного Dispatcher.
Если Dispatcher отсутствует:
-
Бэкенд пытается зарегистрировать себя в
hb.json. -
Первый успешно зарегистрировавшийся бэкенд становится Dispatcher.
При отказе Dispatcher:
-
Reserve автоматически принимает роль Dispatcher.
-
Информация о новом состоянии рассылается бэкенд-узлам кластера.
Если Dispatcher и Reserve отсутствуют одновременно, выбор нового Dispatcher выполняется через запись в hb.json.
