Переделать связь нод в кластере на автоматическое обнаружение #9

Closed
opened 2026-04-26 22:40:53 +03:00 by aleksey · 1 comment
Owner
  • Убрать статический JOIN_NODES. Вместо него реализовать механизм автоматического поиска узлов через DNS-лукап или библиотеку libcluster (стратегия Cluster.Strategy.DNSPoll), используя общее DNS-имя сервиса (например, eventhub-node). Ноды должны самостоятельно находить друг друга и формировать кластер без ручного указания имён.
- Убрать статический `JOIN_NODES`. Вместо него реализовать механизм автоматического поиска узлов через DNS-лукап или библиотеку `libcluster` (стратегия `Cluster.Strategy.DNSPoll`), используя общее DNS-имя сервиса (например, `eventhub-node`). Ноды должны самостоятельно находить друг друга и формировать кластер без ручного указания имён.
aleksey added the Future label 2026-04-26 22:40:53 +03:00
Author
Owner

🎯 Цель
Заменить статический JOIN_NODES на автоматическое обнаружение узлов через DNS-лукап, чтобы ноды могли самостоятельно формировать кластер без ручного указания имён.

📊 Анализ текущей реализации
Docker Compose: Каждая нода (eventhub-node1, eventhub-node2, eventhub-node3) имеет уникальный hostname (.local) и статическую переменную окружения JOIN_NODES с полным списком всех нод.

Erlang-код: Функция connect_nodes/0 читает JOIN_NODES и пытается подключиться к перечисленным узлам с помощью net_kernel:connect_node/1.

🛠️ План реализации
Этап 1: Подготовка Docker-окружения
Добавить общий сетевой алиас eventhub-node для всех трёх нод в docker-compose.yml. Docker Compose автоматически создаст DNS-запись, разрешающуюся в IP-адреса всех контейнеров с этим алиасом.

Удалить переменные JOIN_NODES из конфигурации.

Этап 2: Реализация обнаружения в Erlang
Создать новый модуль src/infra/cluster_discovery.erl или добавить функцию discover_nodes/0 в eventhub_app.erl.

Использовать DNS-лукап (без внешних зависимостей, таких как libcluster). В Erlang/OTP есть встроенный DNS-клиент inet_res:lookup/3, который можно использовать для разрешения имени eventhub-node в список IP-адресов.

Алгоритм:

Выполнить DNS-запрос типа A/AAAA для имени eventhub-node.
Для каждого IP-адреса сформировать полное имя узла (eventhub-node@).
Попытаться подключиться с помощью net_kernel:connect_node/1.
Повторять попытки с заданным интервалом (например, каждые 5 секунд) для обнаружения новых нод.
Этап 3: Интеграция и настройка
Заменить вызов connect_nodes/0 на новый discover_nodes/0 в eventhub_app:start/2.

Обработать таймауты и повторные попытки: использовать timer:sleep/1 и рекурсивный вызов, чтобы периодически проверять наличие новых узлов (на случай, если ноды добавляются позже).

Этап 4: Тестирование
Локальное тестирование: Запустить кластер из трёх нод через docker compose up и убедиться, что они автоматически находят друг друга.

Проверка в CI: Убедиться, что интеграционные тесты проходят без статической конфигурации.

💡 Рекомендация
DNS-лукап через inet_res проще в реализации и не требует дополнительных зависимостей, в отличие от libcluster. При этом он полностью решает задачу автоматического обнаружения в Docker-сети.

🎯 Цель Заменить статический JOIN_NODES на автоматическое обнаружение узлов через DNS-лукап, чтобы ноды могли самостоятельно формировать кластер без ручного указания имён. 📊 Анализ текущей реализации Docker Compose: Каждая нода (eventhub-node1, eventhub-node2, eventhub-node3) имеет уникальный hostname (.local) и статическую переменную окружения JOIN_NODES с полным списком всех нод. Erlang-код: Функция connect_nodes/0 читает JOIN_NODES и пытается подключиться к перечисленным узлам с помощью net_kernel:connect_node/1. 🛠️ План реализации Этап 1: Подготовка Docker-окружения Добавить общий сетевой алиас eventhub-node для всех трёх нод в docker-compose.yml. Docker Compose автоматически создаст DNS-запись, разрешающуюся в IP-адреса всех контейнеров с этим алиасом. Удалить переменные JOIN_NODES из конфигурации. Этап 2: Реализация обнаружения в Erlang Создать новый модуль src/infra/cluster_discovery.erl или добавить функцию discover_nodes/0 в eventhub_app.erl. Использовать DNS-лукап (без внешних зависимостей, таких как libcluster). В Erlang/OTP есть встроенный DNS-клиент inet_res:lookup/3, который можно использовать для разрешения имени eventhub-node в список IP-адресов. Алгоритм: Выполнить DNS-запрос типа A/AAAA для имени eventhub-node. Для каждого IP-адреса сформировать полное имя узла (eventhub-node@<ip>). Попытаться подключиться с помощью net_kernel:connect_node/1. Повторять попытки с заданным интервалом (например, каждые 5 секунд) для обнаружения новых нод. Этап 3: Интеграция и настройка Заменить вызов connect_nodes/0 на новый discover_nodes/0 в eventhub_app:start/2. Обработать таймауты и повторные попытки: использовать timer:sleep/1 и рекурсивный вызов, чтобы периодически проверять наличие новых узлов (на случай, если ноды добавляются позже). Этап 4: Тестирование Локальное тестирование: Запустить кластер из трёх нод через docker compose up и убедиться, что они автоматически находят друг друга. Проверка в CI: Убедиться, что интеграционные тесты проходят без статической конфигурации. 💡 Рекомендация DNS-лукап через inet_res проще в реализации и не требует дополнительных зависимостей, в отличие от libcluster. При этом он полностью решает задачу автоматического обнаружения в Docker-сети.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: EventHub/EventHubBack#9