Высокая доступность Enterprise
Высокая доступность доступна в редакции Semaphore Enterprise.
Semaphore UI поддерживает развёртывание в режиме высокой доступности (HA) active-active, при котором несколько экземпляров работают одновременно за балансировщиком нагрузки. Каждый экземпляр полностью способен обрабатывать запросы UI, вызовы API, запланированные задания и выполнение задач. Если один экземпляр выходит из строя, остальные узлы продолжают работать без перерыва.
Архитектура
Типичное развёртывание active-active состоит из следующих компонентов:
Балансировщик нагрузки — пользователи подключаются через балансировщик нагрузки (например, NGINX, HAProxy или облачный балансировщик). Балансировщик распределяет HTTP- и WebSocket-трафик между доступными узлами Semaphore.
Узлы Semaphore — на каждом узле работает идентичный экземпляр Semaphore UI. Любой узел может принимать запросы пользователей, запускать задания автоматизации, обрабатывать запланированные задачи и отправлять обновления в реальном времени. Все узлы равноправны — нет основного или резервного узла.
Общая база данных — все экземпляры подключаются к общей базе данных PostgreSQL или MySQL. База данных выступает единым источником истины для проектов, шаблонов, инвентарей, расписаний, истории задач, учётных записей пользователей и конфигурации RBAC.
SQLite и BoltDB не поддерживаются для HA-развёртываний. Используйте PostgreSQL или MySQL.
Redis — Redis обеспечивает слой координации, который позволяет нескольким узлам работать как единая система. Он выполняет три функции:
- Распределённые блокировки гарантируют, что конкретное задание в каждый момент времени выполняет только один экземпляр, предотвращая дублирование выполнения задач.
- Общее состояние очереди задач поддерживает очередь задач так, что каждое задание берёт ровно один worker. Все узлы видят одну и ту же очередь и координируют выполнение.
- Обмен сообщениями Pub/Sub позволяет узлам рассылать события, такие как обновления задач, уведомления кластера, инвалидация кэша и изменения состояния UI. Это поддерживает синхронизацию всех узлов в реальном времени.
Предварительные требования
Перед настройкой HA вам понадобятся:
- Ключ подписки Semaphore Enterprise.
- Общая база данных PostgreSQL или MySQL, доступная со всех узлов.
- Сервер Redis или развёртывание Redis Sentinel, доступное со всех узлов. Redis Cluster не поддерживается.
- Балансировщик нагрузки, поддерживающий HTTP- и WebSocket-трафик.
- Два или более сервера для запуска экземпляров Semaphore.
Все узлы Semaphore должны использовать одну и ту же базу данных, один и тот же бэкенд Redis и одинаковую конфигурацию (за исключением ha.node_id, который должен быть уникальным для каждого узла).
Конфигурация
Включите HA, добавив блок ha в config.json на каждом узле:
{
"dialect": "postgres",
"postgres": {
"host": "db.example.com:5432",
"name": "semaphore",
"user": "semaphore",
"pass": "***"
},
"ha": {
"enabled": true,
"node_id": "node-1",
"redis": {
"addr": "redis.example.com:6379",
"db": 0,
"pass": "***"
}
},
"cookie_hash": "...",
"cookie_encryption": "...",
"access_key_encryption": "..."
}
У каждого узла должен быть уникальный ha.node_id. Вся остальная конфигурация должна быть идентичной на всех узлах.
Переменные окружения
Также HA можно настроить с помощью переменных окружения:
SEMAPHORE_HA_ENABLED=true
SEMAPHORE_HA_NODE_ID=node-1
SEMAPHORE_HA_REDIS_ADDR=redis.example.com:6379
SEMAPHORE_HA_REDIS_DB=0
SEMAPHORE_HA_REDIS_PASS=***