Um VPS, uma região

Prévia grátis 4 min de leitura

Perguntas sobre multi-região ficam mais fáceis de responder a partir de um ponto de partida conhecido. Aqui está o desta aplicação, tirado do config/deploy.yml.

A topologia

servers:
  web:
    hosts:
      - <%= ENV.fetch("NOR_SERVER_IP") %>

volumes:
  - /opt/newbieonrails/storage:/rails/storage

accessories:
  db:
    image: postgres:16
    host: <%= ENV.fetch("NOR_SERVER_IP") %>
    directories:
      - /opt/newbieonrails/db:/var/lib/postgresql/data

O mesmo endereço de servidor aparece duas vezes. A aplicação Rails e o contêiner PostgreSQL rodam no mesmo host. O diretório de dados do banco é um diretório desse host, e as capas de curso e imagens de lição enviadas ficam num volume do mesmo disco.

São quatro bancos lógicos (primary, cache, queue e cable), todos nesse único contêiner Postgres. O Solid Queue roda dentro do Puma.

Tudo é uma máquina só.

Por que este é um bom ponto de partida

Ele permite responder à primeira pergunta: o que uma segunda região exigiria?

flowchart TB
  A["um VPS"] --> B["Rails + Puma + Solid Queue"]
  A --> C["contêiner Postgres 16"]
  A --> D["/opt/newbieonrails/storage — envios no disco do host"]
  C --> E["4 bancos lógicos: primary, cache, queue, cable"]
  D --> F["o primeiro bloqueio, e não é o banco"]

O bloqueio que ninguém cita primeiro

Os arquivos enviados.

O /opt/newbieonrails/storage é um diretório no disco de uma máquina. Um segundo servidor de aplicação em outra região não consegue lê-lo de jeito nenhum.

Toda conversa sobre multi-região começa pelo banco, e nesta aplicação o banco é o segundo problema. Armazenamento de objetos é pré-requisito. Não tem nada a ver com consistência ou replicação, e dá mais ou menos um dia de trabalho: levar o Active Storage para um armazenamento compatível com S3, migrar os blobs existentes e mudar uma linha de configuração.

A lição geral vale mais do que este caso. Antes de perguntar como replicar estado, encontre todo lugar onde há estado guardado. Um volume do host, um cache em disco local, um store em memória do processo, um arquivo escrito por uma tarefa rake: cada um é uma suposição de região única, e nenhum aparece num diagrama de banco.

A física

Um número governa tudo o que vem a seguir, e nenhuma engenharia o elimina.

A luz percorre cerca de 200 quilômetros por milissegundo na fibra. De São Paulo a Frankfurt são uns 9.800 quilômetros, o que dá cerca de 50 milissegundos em cada sentido, e os cabos de verdade fazem caminhos mais longos que a distância em linha reta sobre o globo. Só a luz já precisa de uns 100 milissegundos para a ida e volta, e uma rede de verdade soma o roteamento: em 28/09/2026, um ping de São Paulo a Frankfurt deu 198 milissegundos em média.

Compare com os números que esta aplicação já tem. Uma ida e volta local ao PostgreSQL leva 0,03ms, como mediu o curso de nível Pleno "Testes: banco de dados em memória". Uma ida e volta entre continentes é milhares de vezes mais lenta (umas 6.600 vezes, naquele ping), e essa proporção é o assunto do curso inteiro.

Operação Tempo
Ida e volta local ao banco 0,03ms
Chamada de serviço no mesmo datacenter ~1ms
Ida e volta no mesmo continente 20–40ms
Ida e volta entre continentes 150–200ms

Uma página que faz quatro consultas ao banco gasta 0,12ms com elas localmente, e 600ms se o banco estiver em outro continente. Nenhum ajuste resolve isso.

Por que esta aplicação um dia perguntaria

Ela é publicada em inglês e em pt-BR. Dois públicos de idioma provavelmente significam dois públicos geográficos, e um deles está longe de onde quer que o único VPS esteja.

Esse é o gatilho real. Não é escala nem tráfego: é a distância entre quem usa e a única máquina. Quem está a duzentos milissegundos de distância paga isso em toda página, e nenhuma otimização de consulta muda isso.

Dá para medir antes de construir qualquer coisa. A lição 2 é essa medição, e ela costuma mostrar que a resposta não é um segundo banco.

Pontos-chave

  • Um servidor roda a aplicação Rails e o contêiner Postgres, e os arquivos enviados ficam num volume do mesmo disco.
  • O primeiro bloqueio é o armazenamento de objetos, não o banco: outra região não consegue ler um volume do host.
  • Antes de replicar estado, encontre todo lugar onde há estado guardado. A maioria das suposições de região única não está no diagrama de banco.
  • Uma ida e volta entre continentes leva 150–200ms (São Paulo a Frankfurt: 198ms), contra 0,03ms localmente: milhares de vezes mais lenta.
  • O gatilho é a distância entre quem usa e a única máquina, e dá para medi-la antes de construir qualquer coisa.
Aula 1 de 7 · grátis

Continue com a aula 2

Meça antes de replicar

Apresenta quatro medições a fazer antes de replicar e explica por que CDN e cache de borda vêm antes.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...