
Выпустили в 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.
