Tutoriais de VPS
Design de arquitetura de alta disponibilidade para VPS empresarial (2026): um roteiro prático do ponto único à disponibilidade
Muitos querem ir direto para "hot standby de duas máquinas/multiativo" e acabam gastando muito dinheiro enquanto ainda entram em pânico durante quedas. O mais crítico da alta disponibilidade empresarial não é o diagrama de arquitetura, mas se dá para implementar na ordem certa. Este artigo explica com um roteiro reversível: L0 primeiro completa segurança/backup/monitoramento, L1 torna a aplicação sem estado, L2 adiciona dois nós + LB, L3 remove o ponto único na entrada; além disso, inclui exemplos mínimos de configuração de HAProxy/Keepalived, checklists de banco primário-réplica e simulados de recuperação.

Quando você faz alta disponibilidade (HA) empresarial, a armadilha mais comum não é "não saber a tecnologia", mas errar a ordem.
Muitos times vão direto para desenhar hot standby de duas máquinas e montar multiativo, e o resultado é:
- O negócio ainda tem pontos únicos (por exemplo, upload de arquivos, sessões locais, um único banco de dados)
- Monitoramento e alertas não estão bem feitos, então quando há uma queda você depende dos usuários para reportar
- Você tem backups mas não faz simulados de recuperação, e só quando algo realmente dá errado descobre que os backups são inúteis
Este artigo não trata de misticismo nem vende uma "arquitetura perfeita". Escrevo com um objetivo mais realista:
Ajudar você a subir a disponibilidade passo a passo de forma reversível.
Já vi muitos "requisitos falsos":
- Na verdade o negócio permite manutenção de madrugada, mas as pessoas se assustam com a palavra "empresarial"
- Na verdade o volume de usuários não é grande, e uma única máquina + backup + monitoramento já basta
- Na verdade o maior risco não é uma queda, mas apagar o banco de dados por engano, certificados vencidos ou disco cheio
Você pode julgar rapidamente com duas perguntas:
- Quanto tempo você aceita que uma falha dure? (RTO)
- Quanta perda de dados você aceita? (RPO)
Se você ainda não escreveu RTO/RPO em um documento, não se apresse em montar HA.
Um lembrete rápido: antes de fazer HA, calcule bem o "custo de tempo". Muitos projetos não são derrubados pelos servidores, mas pelo custo de manutenção.
Sugiro dividir HA em quatro níveis e entregar por nível.
O objetivo deste passo é:
- Uma única máquina também rodar de forma estável
- Quando algo der errado, você conseguir localizar
- Os dados poderem ser recuperados
O conjunto mínimo de três peças:
- Segurança: SSH/firewall/Fail2Ban
- Backup: backup automático + capacidade de restaurar
- Monitoramento: saber quando um serviço caiu + o disco encheu + um certificado está prestes a vencer
Os links correspondentes para "copiar a lição de casa":
- Guia de hardening de segurança de VPS (SSH + firewall + Fail2Ban)
- Solução de backup automático de VPS (Rclone)
- Monitoramento e alertas de VPS (Prometheus + Grafana)
Se você nem terminou o L0, não se apresse em falar de L2/L3.
Para fazer HA, a primeira coisa a resolver não é "adicionar mais duas máquinas", mas:
- Se a aplicação consegue escalar horizontalmente.
As armadilhas mais comuns de falta de estado:
- Sessões guardadas na memória local (troca para outra máquina e os usuários perdem a sessão)
- Uploads de arquivos gravados no disco local (troca para outra máquina e os arquivos não são encontrados)
- Tarefas agendadas rodando em uma máquina específica (após a troca, executam duas vezes ou são perdidas)
Soluções típicas:
- Colocar as sessões no Redis (ou usar JWT sem estado, mas controlando os riscos)
- Colocar os arquivos em armazenamento de objetos (S3/R2) ou armazenamento compartilhado
- Usar um mecanismo de "agendamento único" para tarefas agendadas (leader election / um nó de jobs separado)
Neste passo, você deve pelo menos alcançar:
- Dois nós de aplicação (App A / App B)
- Uma entrada (LB) fazendo verificações de integridade e encaminhamento
Arquitetura mínima implementável:
- Cliente → LB → App A / App B
- App → DB (por enquanto pode ser um único banco, mas você precisa de backups e simulados de recuperação)
Não faça verificações de integridade do tipo "a porta responde = está vivo". O melhor é um endpoint real /healthz:
- Verificar se o processo está vivo
- Verificar se as dependências (DB/Redis) estão disponíveis (pelo menos uma verificação superficial)
Você pode começar com a configuração mais simples para construir a capacidade de comutar tráfego.
Abaixo há um exemplo mínimo funcional (basta trocar as portas pelas suas):
# /etc/haproxy/haproxy.cfg(示例)
frontend fe_http
bind :80
default_backend be_app
backend be_app
balance roundrobin
option httpchk GET /healthz
http-check expect status 200
server app_a 10.0.0.11:8080 check
server app_b 10.0.0.12:8080 check
A ideia de verificação é simples:
- Pare o serviço em
app_a(ou faça/healthzretornar 500) - Acesse o LB e veja se as requisições caem automaticamente em
app_b
Muitos terminam o L2 e acham que já têm HA.
Mas se o LB em si é uma única máquina, então ele é o novo ponto único.
As práticas comuns são:
- LB duplo + VIP flutuante com VRRP (Keepalived)
- Ou usar o LB gerenciado do provedor de nuvem (menos complicação, mas você precisa aceitar as regras e os custos)
A armadilha mais comum aqui se chama split-brain:
- Os dois nós acham que são o mestre
- O mesmo VIP fica "sendo puxado de um lado para o outro"
A chave para resolver o split-brain não é "adicionar mais configuração", mas:
- Ter arbitragem/prioridade claras
- Ter políticas de verificação de integridade e isolamento (fencing)
- Os simulados de falha precisam cobrir cenários como "partição de rede" (não simule apenas desligamentos)
Abaixo há uma forma comum de escrever (exemplo, apenas a estrutura central).
Nó mestre (MASTER):
# /etc/keepalived/keepalived.conf(示例)
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass CHANGE_ME
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
chk_haproxy
}
}
No nó de backup (BACKUP), altere state para BACKUP, diminua priority (por exemplo, 100) e mantenha o restante igual.
Você precisa verificar duas coisas:
- Se
haproxyrealmente cair, o VIP vai flutuar para a outra máquina? - Em cenários de partição de rede/split-brain, o VIP vai "ficar pulando de um lado para o outro"?
Em cenários de VPS autogerenciados, o fencing muitas vezes não consegue ser 100% perfeito, mas pelo menos você deve:
- Vincular a "flutuação da entrada" às verificações de integridade
- Deixar claro quem tem o direito de ser MASTER em caso de falha
- Incluir os simulados no processo (não depender da memória)
O banco de dados costuma ser a parte mais difícil do HA e a mais propensa a dar errado.
Dou um princípio prático:
- Primeiro torná-lo recuperável (backup + simulados)
- Depois fazer primário-réplica/separação de leitura e escrita
- Só por último considerar multimestre/distribuído (a menos que você realmente precise)
- Primário único (Primary)
- Uma réplica somente leitura (Replica)
- Backup automático + simulados de recuperação periódicos
- Monitorar métricas básicas como "atraso de replicação/disco/conexões/consultas lentas"
Você precisa se perguntar duas coisas:
- Qual é realmente o seu volume de escrita?
- Você consegue aceitar "somente leitura/somente escrita por um curto período" como estratégia de degradação?
Muitos negócios conseguem perfeitamente:
- Passar para somente leitura primeiro em caso de falha
- Restaurar o serviço primeiro
- Depois corrigir a consistência aos poucos
Isso é mais realista do que buscar "nunca cair".
Não espere discutir na hora quando a falha acontecer.
Sugiro escrever o Runbook mais curto que seja utilizável (mesmo 5 linhas já servem):
- Quem é o responsável quando ocorre uma falha (um nome/um grupo)
- Como determinar se o Primary realmente caiu (não olhe só o ping)
- Quando acionar a comutação (quais condições precisam ser atendidas)
- A estratégia de reversão após a comutação (o que fazer se o novo Primary tiver problemas)
- Como preencher dados/corrigir a consistência após o incidente
Depois de escrever este Runbook, sua "alta disponibilidade" já é melhor que a da maioria dos times.
Alta disponibilidade não se escreve em documentos, se pratica.
Sugiro fazer pelo menos estes 6 simulados (em ordem):
- Matar o processo da aplicação: o LB consegue desviar o tráfego?
- Desconectar o nó de aplicação da rede: a verificação de integridade consegue detectar?
- Banco de dados cai: o serviço consegue degradar (retornar erros claros/somente leitura)?
- Disco cheio: o monitoramento consegue alertar com antecedência?
- Certificado vencido: consegue alertar 7 dias antes?
- "Operação errada": dá para restaurar do backup uma tabela/arquivo apagado?
| Cenário | Método de acionamento | Comportamento esperado | Comportamento real | RTO | Retrospectiva/melhoria |
|---|---|---|---|---|---|
| App A cai | kill / stop service | Comutação automática | |||
| LB cai | stop keepalived | O VIP flutua | |||
| DB cai | stop db | Degradação/somente leitura |
Se você quiser verificar no nível de rede (perda de pacotes/jitter/desvios), pode executar um processo completo com mtr para deixar claro (e também é mais fácil convencer a si mesmo/aos colegas quando algo der errado):
Termino com um conselho pouco "de arquiteto":
- Primeiro leve o L0 a "recuperável, alertável, diagnosticável"
- Depois faça a falta de estado
- Em seguida dois nós + LB
- Só por último torne a entrada/banco de dados de alta disponibilidade
A cada passo que você der, você deve conseguir responder a uma pergunta:
Depois deste passo, quanto menos vou entrar em pânico durante uma queda?
Se você consegue responder, está no caminho certo.