Pular para o conteúdo principal

Alta disponibilidade

info

A alta disponibilidade está disponível na edição Semaphore Enterprise.

O Semaphore UI oferece suporte a implantações de alta disponibilidade (HA) no modo ativo-ativo, em que várias instâncias são executadas simultaneamente atrás de um balanceador de carga. Cada instância é totalmente capaz de atender requisições da interface, chamadas de API, jobs agendados e execução de tarefas. Se uma instância falhar, os nós restantes continuam operando sem interrupção.

Arquitetura

Uma implantação ativo-ativo típica é composta pelos seguintes componentes:

Balanceador de carga — Os usuários se conectam por meio de um balanceador de carga (por exemplo, NGINX, HAProxy ou um balanceador de carga em nuvem). O balanceador de carga distribui o tráfego HTTP e WebSocket entre os nós do Semaphore disponíveis.

Nós do Semaphore — Cada nó executa uma instância idêntica do Semaphore UI. Qualquer nó pode receber requisições de usuários, iniciar jobs de automação, processar tarefas agendadas e enviar atualizações em tempo real. Todos os nós são iguais — não há nó primário nem nó em espera.

Banco de dados compartilhado — Todas as instâncias se conectam a um banco de dados PostgreSQL ou MySQL compartilhado. O banco de dados atua como a única fonte de verdade para projetos, templates, inventários, agendamentos, histórico de tarefas, contas de usuário e configuração de RBAC.

atenção

SQLite e BoltDB não são suportados em implantações HA. Use PostgreSQL ou MySQL.

Redis — O Redis fornece a camada de coordenação que permite que vários nós se comportem como um único sistema. Ele desempenha três funções:

  • Locks distribuídos garantem que apenas uma instância execute um determinado job por vez, evitando a execução duplicada de tarefas.
  • Estado compartilhado da fila de tarefas mantém a fila de tarefas para que cada job seja capturado por exatamente um worker. Todos os nós veem a mesma fila e coordenam a execução.
  • Mensageria Pub/Sub permite que os nós transmitam eventos como atualizações de tarefas, notificações do cluster, invalidação de cache e mudanças de estado da interface. Isso mantém todos os nós sincronizados em tempo real.

Pré-requisitos

Antes de configurar o HA, você precisa de:

  • Chave de assinatura do Semaphore Enterprise.
  • Um banco de dados PostgreSQL ou MySQL compartilhado, acessível por todos os nós.
  • Uma instância Redis (ou um cluster Redis) acessível por todos os nós.
  • Um balanceador de carga com suporte a tráfego HTTP e WebSocket.
  • Dois ou mais servidores para executar as instâncias do Semaphore.

Todos os nós do Semaphore devem usar o mesmo banco de dados, a mesma instância Redis e a mesma configuração (exceto ha.node_id, que deve ser único em cada nó).

Configuração

Habilite o HA adicionando o bloco ha ao seu config.json em cada nó:

{
"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": "..."
}

Cada nó deve ter um ha.node_id único. Todo o restante da configuração deve ser idêntico em todos os nós.

Variáveis de ambiente

Como alternativa, configure o HA usando variáveis de ambiente:

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=***

Referência de configuração

Opção do arquivo de configuraçãoVariável de ambienteDescrição
ha.enabledSEMAPHORE_HA_ENABLEDHabilita o modo de alta disponibilidade.
ha.node_idSEMAPHORE_HA_NODE_IDIdentificador único deste nó.
ha.redis.addrSEMAPHORE_HA_REDIS_ADDREndereço do servidor Redis (por exemplo, localhost:6379).
ha.redis.dbSEMAPHORE_HA_REDIS_DBNúmero do banco de dados Redis.
ha.redis.passSEMAPHORE_HA_REDIS_PASSSenha do servidor Redis.
ha.redis.userSEMAPHORE_HA_REDIS_USERNome de usuário do servidor Redis.
ha.redis.tlsSEMAPHORE_HA_REDIS_TLSHabilita TLS na conexão com o Redis.
ha.redis.tls_skip_verifySEMAPHORE_HA_REDIS_TLS_SKIP_VERIFYIgnora a verificação do certificado TLS do Redis.

Consulte Configuração para ver a lista completa de opções disponíveis.

Balanceador de carga

Coloque um balanceador de carga na frente dos nós do Semaphore para distribuir o tráfego. O balanceador de carga deve oferecer suporte a conexões WebSocket para as atualizações da interface em tempo real.

Exemplo com NGINX

upstream semaphore {
server node1.example.com:3000 max_fails=3 fail_timeout=10s;
server node2.example.com:3000 max_fails=3 fail_timeout=10s;
server node3.example.com:3000 max_fails=3 fail_timeout=10s;
}

server {
listen 443 ssl;
server_name semaphore.example.com;

ssl_certificate /etc/ssl/certs/semaphore.crt;
ssl_certificate_key /etc/ssl/private/semaphore.key;

location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_pass http://semaphore;

proxy_connect_timeout 3s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
}


location /api/ws {

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_pass http://semaphore;

proxy_connect_timeout 3s;
proxy_send_timeout 1h;
proxy_read_timeout 1h;

proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 3;
}
}

Consulte Proxy reverso para mais detalhes sobre a configuração do NGINX.

Como funciona a execução de jobs

Em uma implantação com vários nós, a execução de tarefas segue um fluxo coordenado:

  1. O usuário dispara uma tarefa. Um usuário inicia um job pela interface ou pela API. A requisição pode chegar a qualquer nó do Semaphore.
  2. Os metadados da tarefa são armazenados. O nó que recebeu a requisição grava os metadados da tarefa no banco de dados e sinaliza o trabalho por meio do Redis.
  3. Um nó captura a tarefa. Um dos nós disponíveis obtém a tarefa do Redis, adquire um lock distribuído e a marca como em execução no banco de dados.
  4. A tarefa é executada. O nó executa a tarefa localmente ou a delega a um runner remoto. O progresso e os logs são gravados de volta no banco de dados.
  5. Os resultados são transmitidos. As atualizações da tarefa se propagam pelo Pub/Sub do Redis, de modo que todos os nós e os clientes da interface conectados permaneçam sincronizados.

Escalando com runners

O HA também permite o escalonamento horizontal da execução de tarefas. Em vez de executar jobs apenas nos próprios nós do Semaphore, a execução pode ser delegada a vários runners. Isso permite:

  • Distribuir a carga de trabalho pela sua infraestrutura.
  • Escalar a capacidade de automação de forma independente da camada web/API.
  • Isolar os ambientes de execução para limitar o raio de impacto.
  • Executar tarefas em muitos nós em paralelo.

Consulte Runners para ver as instruções de configuração.

Benefícios

  • Maior confiabilidade — Se uma instância falhar, as outras continuam atendendo o tráfego e executando jobs.
  • Manutenção sem tempo de inatividade — Os nós podem ser atualizados ou reiniciados individualmente sem parar o sistema.
  • Escalabilidade horizontal — Adicione nós do Semaphore atrás do balanceador de carga para aumentar a capacidade.
  • Sem dependência de um nó primário — Todos os nós são iguais, o que elimina mecanismos complexos de failover.
  • Estado consistente do cluster — O banco de dados compartilhado e a coordenação via Redis mantêm todas as instâncias sincronizadas.

Perguntas frequentes

O que é alta disponibilidade ativo-ativo?

HA ativo-ativo significa que várias instâncias da aplicação são executadas simultaneamente e todas atendem requisições. Não há nó primário — qualquer instância pode atender o tráfego e executar jobs.

Por que o Semaphore usa o Redis no modo HA?

O Redis atua como uma camada de coordenação entre as instâncias. Ele fornece locks distribuídos, estado compartilhado da fila de tarefas e mensageria Pub/Sub para garantir que os nós não executem o mesmo job simultaneamente.

Qual banco de dados devo usar em implantações HA?

O Semaphore oferece suporte a PostgreSQL e MySQL como banco de dados compartilhado. SQLite e BoltDB não podem ser usados no modo HA porque não oferecem suporte a acesso concorrente de vários processos.

O que acontece se um nó do Semaphore falhar?

O balanceador de carga direciona o tráfego para os nós restantes. Os jobs em execução continuam nas outras instâncias, e os novos jobs são capturados por qualquer nó disponível.

Posso escalar horizontalmente?

Sim. Você pode adicionar nós do Semaphore atrás do balanceador de carga para aumentar a capacidade web/API e adicionar runners para aumentar a capacidade de execução de tarefas.