Выпустили в open source go-discovery — Go-библиотеку для автоматического обнаружения узлов кластера Tarantool 3.0. Фильтрация по ролям и тегам, подписка на изменения топологии, пул соединений с балансировкой — все это теперь доступно на GitHub под лицензией BSD-2.

Какую проблему решает

Если у вас кластер Tarantool из 5 узлов — можно захардкодить адреса и не думать. Но когда узлов 50+, начинаются проблемы:

  • Узлы падают и поднимаются

  • Реплики становятся мастерами (и наоборот)

  • Добавляются новые инстансы

  • Меняется конфигурация ролей и тегов

В Tarantool 3.0 вся конфигурация кластера может храниться в централизованном хранилище: etcd или Tarantool Config Storage. Но как клиентскому приложению узнать, куда отправлять запросы? И как реагировать на изменения?

go-discovery автоматизирует эту работу: получает топологию из централизованного хранилища, фильтрует узлы по нужным критериям, следит за изменениями и управляет пулом соединений.

Основные возможности

Discovery — получение списка узлов

Библиотека читает конфигурацию кластера из централизованного хранилища и возвращает актуальный список узлов с их характеристиками: имя, группа, репликасет, роли, теги, режим работы (RW/RO), адреса для подключения.

Фильтрация — только нужные узлы

Редко нужны все узлы кластера. Чаще — подмножество по определенным критериям. Библиотека предоставляет набор фильтров, которые можно комбинировать:

  • По группам — выбрать узлы из конкретных групп

  • По репликасетам — ограничить выборку определенными репликасетами

  • По именам — указать конкретные узлы

  • По режиму RW/RO — только мастера или только реплики

  • По ролям — узлы с определенными ролями (storage, api, router и т.д.)

  • По тегам ролей — фильтрация по roles_cfg.tags

  • По тегам приложения — фильтрация по app.cfg.tags

Фильтры применяются последовательно, сужая выборку.

Подписка — реакция на изменения

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

Библиотека поддерживает два режима отслеживания:

  • Подписка на изменения — мгновенное уведомление при изменении конфигурации

  • Периодический опрос — fallback-вариант с настраиваемым интервалом

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

Pool — пул соединений с autodiscovery

Главная ценность — пул соединений, который сам управляет подключениями на основе событий от подсистемы discovery:

  • Автоматически добавляет соединения к новым узлам

  • Удаляет соединения к недоступным узлам

  • Балансирует нагрузку между доступными узлами

Доступны две стратегии балансировки:

  • Round Robin — запросы распределяются по кругу между всеми узлами

  • Priority — запросы идут на узлы с наивысшим приоритетом (например, предпочитать свой дата-центр), остальные используются как резерв

Архитектура

Библиотека разделена на два уровня:

Базовый пакет go-discovery:

  • Получение списка узлов из etcd

  • Фильтрация по критериям

  • Подписка на изменения топологии

Пакет go-discovery/pool:

  • Пул соединений поверх go-tarantool

  • Стратегии балансировки

  • Автоматическое управление соединениями

Можно использовать только базовый пакет, если нужен просто список узлов. Или подключить pool для полноценного управления соединениями.

Все построено на интерфейсах — легко расширять, тестировать и подменять реализации.

Установка и начало работы

Библиотека устанавливается стандартно через go get. Для работы требуется:

  • Go 1.21+

  • Подключение к etcd с конфигурацией кластера Tarantool 3.0

  • Коннектор go-tarantool v2 (для пакета pool)

Документация с примерами доступна в репозитории.

Roadmap

Что планируем добавить:

  • Прямое получение топологии от Tarantool — когда узлы научатся отдавать информацию о соседях

  • Теги для отдельных узлов — сейчас поддерживаются только теги ролей и приложений

  • Метрики и трейсинг — интеграция с Prometheus и OpenTelemetry

Ссылки:


Попробуйте go-discovery и расскажите, что думаете. Вопросы и предложения — в комментариях или в GitHub Issues.