PRODPlataforma BaaS europeia soberanaAbra o painel →

Desempenho · 11 minutos de leitura

Banco de dados dedicado versus compartilhado: desempenho e isolamento

Affane Daylami · Fondateur · 31 de maio de 2026

Voltar ao blog

Um banco de dados compartilhado não significa que seus dados estejam misturados com os de outro cliente. Isso significa que seu banco de dados é executado em um servidor Postgres compartilhado com outros bancos de dados. Portanto, a verdadeira questão não é “meus dados estão isolados?” » mas “são meus recursos?” ". CPU, memória, conexões e taxa de transferência de disco podem ser degradadas por causa de um vizinho barulhento, mesmo quando cada inquilino tem seu próprio banco de dados, sua própria tabela, suas próprias políticas.

Este texto em inglês foi gerado automaticamente a partir do original em francês e ainda não foi revisado.
Esta página foi traduzida automaticamente. A versão em inglês é oficial.

Este artigo compara os modelos de locação Postgres mais documentados (esquema compartilhado, por base de locatário, cluster dedicado, também chamado de banco de dados por locatário versus banco de dados compartilhado), explica o mecanismo noisy neighbore detalha como o Aurabase implementa seu próprio modelo de duas camadas, verificado no código do provisionador. Para a metodologia que aplicamos antes de publicar um número de desempenho, consulte nossa metodologia de benchmark de back-end .

Se você está procurando a questão do vazamento de dados entre dois clientes (RLS, políticas, service_role), este não é o ângulo deste artigo: nossa comparação de RLS e banco de dados dedicado por projeto cobre esse isolamento lógico em detalhes. Aqui estamos falando de recursos físicos: CPU, IO, conexões, cache.

O essencial

  • Um banco de dados compartilhado não é necessariamente um esquema compartilhado: Aurabase dá a cada projeto seu próprio banco de dados Postgres, mesmo em seus níveis padrão, compartilhando apenas o cluster.
  • noisy neighbor degrada recursos físicos (CPU, IOPS, conexões, autovacuum), não a confidencialidade dos dados: RLS não resolve, esse não é o seu papel.
  • O provisionador Aurabase roteia para exatamente duas arquiteturas, verificadas no código: FullyDedicated (cluster CNPG inteiro reservado para um projeto, nível empresarial) ou SharedClusterDedicated (base dedicada no cluster CNPG da organização, nunca compartilhada com outra organização).
  • Um cluster de frota Aurabase tem um limite de capacidade padrão observado de 1.000 bases por cluster, configurável, além do qual a recomendação é migrar para um cluster dedicado.
  • A escolha certa depende das suas reais restrições (conformidade, previsibilidade de tráfego, orçamento), e não de um reflexo “dedicado é sempre melhor”.
#
Os modelos

Três modelos de gestão do Postgres, do mais compartilhado ao mais isolado

A documentação oficial da Microsoft sobre a arquitetura de aplicativos SaaS multilocatários distingue três modelos de locação, geralmente chamados de Silo (recursos dedicados por locatário), Pool (recursos totalmente compartilhados) e Bridge (uma mistura dos dois, alguns locatários isolados, outros compartilhados). Esses três modelos se aplicam diretamente ao Postgres, no nível do esquema, do banco de dados ou de todo o cluster.

Concretamente, para um back-end do Postgres, isso fornece três arquiteturas distintas. O esquema compartilhado (uma base única, uma coluna tenant_id, políticas RLS que filtram as linhas) é o modelo de Pool mais comum em guias multilocatários: econômico, mas a fronteira entre dois clientes se torna uma expressão SQL avaliada tabela por tabela. A base por locatário em um cluster compartilhado é um modelo Bridge intermediário: cada locatário tem sua própria base Postgres (um comando CREATE DATABASEreal), mas várias bases coexistem no mesmo cluster físico, compartilhando, portanto, CPU, IO e conexões. O cluster totalmente dedicado por locatário é o modelo Silo completo: recursos de CPU, RAM e IO completamente isolados, geralmente reservados para locatários com alta conformidade ou problemas de carga.

ModeloIsolamento de recursosIsolamento de armazenamentoEsforço Operacional
Esquema compartilhado (tenant_id + RLS)NenhumNenhum (mesa comunitária)Mínimo (1 base para operar)
Por locatário, cluster compartilhadoParcial (CPU/IO do cluster)Total (base própria)Moderado (N bases, 1 cluster)
Cluster totalmente dedicado por locatárioTotalTotalAlto (1 cluster por locatário)

Terminologia Silo/Pool/Bridge: documentação oficial da Microsoft, padrões de arquitetura SaaS multi-tenant (Azure Architecture Center).

O modelo intermediário, base por locatário em um cluster compartilhado, muitas vezes está ausente dos guias que apresentam a escolha como binária entre “uma base única para todos” e “um servidor por cliente”. No entanto, este é o que o Aurabase usa por padrão, detalhado abaixo.

A escolha entre esses três modelos surge com cada decisão de arquitetura multilocatário, não apenas com um provedor de BaaS: uma equipe que constrói seu próprio back-end SaaS em Postgres gerenciados (RDS, Cloud SQL ou uma instância auto-hospedada) faz exatamente a mesma arbitragem, com os mesmos mecanismos de contenção em ação, uma vez que vários clientes são colocados na mesma instância física.

#
O mecanismo

O vizinho barulhento: o que piora quando os recursos são compartilhados

Um noisy neighbor (vizinho barulhento) é um locatário que consome uma parcela desproporcional dos recursos compartilhados de uma infraestrutura, em detrimento de outros locatários no mesmo servidor. O termo vem da nuvem pública, mas se aplica diretamente a um cluster Postgres compartilhado: um banco de dados pode degradar o desempenho de outros sem nunca tocar em seus dados.

Seis mecanismos surgem com mais frequência na produção:

  • Contenção de CPU: uma consulta cara (junção sem índice, classificação massiva) consome ciclos de CPU que o kernel compartilha entre todos os bancos de dados ativos no cluster.
  • Contenção de IOPS: um backup, um VACUUM FULL ou uma importação massiva satura a taxa de transferência do disco do cluster, retardando leituras e gravações em outros bancos de dados.
  • Esgotamento da conexão: max_connections limita o número de conexões ativas em todo o nível do cluster, não por base. Uma base que abre demais diminui a margem das outras.
  • Contenção de autovacuum: o autovacuum é executado com um número limitado de trabalhadores por cluster; um banco de dados com alta taxa de gravação pode atrasar a limpeza das tabelas de outro banco de dados.
  • Remoção de cache: shared_buffers é uma memória única para todo o cluster; um banco de dados com um grande conjunto de trabalhos pode remover as páginas em cache de um banco de dados vizinho menor.
  • Janelas de manutenção compartilhadas: backup, failover de réplica ou atualização principal aplicam-se a todo o cluster, não por base.
Cluster compartilhado com quatro projetos versus cluster dedicado a um único projetoÀ esquerda, um cluster CNPG compartilhado hospeda quatro bases (Projeto A a D) que convergem para o mesmo pool de CPUs, IOPS e conexões compartilhadas, portanto, possível contenção entre elas. À direita, um cluster CNPG dedicado hospeda apenas um projeto, com CPU, IOPS e conexões reservadas, portanto não é possível contenção externa.Cluster compartilhadoProjeto AProjeto BProjeto CProjeto DCPU · IOPS compartilhadasconexões compartilhadasPossível disputa entre A, B, C, DCluster dedicadoSeu projetoCPU · IOPS reservadosconexões reservadasSem restrição externa

Diagrama estrutural, não um resultado de medição: nenhum número comparativo de desempenho publicado até o momento para essas duas topologias.

O orçamento de conexão costuma ser o sintoma mais visível na produção, mesmo antes da latência. Este é o assunto detalhado de nosso guia de ajuste de max_connections e nossa comparação PgBouncer, Supavisor e PgCat.

Um pooler de modo de transação (PgBouncer, Supavisor, PgCat) atenua o esgotamento da conexão, mas não remove a contenção de CPU ou IOPS: ele reutiliza conexões de servidor existentes, não adiciona núcleos de CPU adicionais ou taxa de transferência de disco ao cluster. Nosso artigo sobre o modo de pool de transações detalha o que esse modo realmente muda e o que ele não muda.

#
O limite

RLS isola dados, não recursos

A segurança em nível de linha resolve um problema diferente: evita que uma consulta leia ou modifique as linhas de outro locatário, no nível lógico. Ele não reserva nenhum ciclo de CPU, nenhum slot de conexão, nenhuma taxa de transferência de disco para um locatário específico.

Dois inquilinos podem ter políticas de RLS perfeitamente estanques e degradar-se ao mesmo tempo: o vizinho barulhento é um problema de recursos físicos, não de direitos de acesso. Confundir os dois leva a uma falsa sensação de segurança operacional quando o EPIRB estiver em vigor.

Informações

Para isolamento lógico (políticas RLS, service_role, fronteira entre projetos no lado da segurança), consulte nosso artigo dedicado: RLS e base dedicada por projeto, a escolha do isolamento multilocatário do Aurabase. Este artigo permanece no nível dos recursos físicos.

#
No código

O modelo Aurabase, verificado em código

O código do provisionador (aura-provisioner) documenta exatamente duas arquiteturas possíveis para um projeto Postgres ativo, a partir de uma consolidação de provisionamento que o código chama de Tarefa 12: FullyDedicated e SharedClusterDedicated. Os modelos legados com granularidade de esquema foram removidos do caminho de provisionamento.

O nível enterprise aciona FullyDedicated: um cluster CNPG inteiro, reservado para este único projeto. Todos os outros níveis (gratuito, profissional, equipe) são direcionados para SharedClusterDedicated: um banco de dados Postgres project_<uuid> completo, no cluster CNPG da organização do projeto. Portanto, não é um esquema compartilhado: mesmo em um plano padrão, seu banco de dados é um banco de dados Postgres completo, e não uma linha entre outras em uma tabela comum. O que é compartilhado é o cluster (CPU, RAM, disco, conexões), não a base em si.

O cluster CNPG de uma organização é criado quando seu primeiro projeto Postgres é provisionado e nunca hospeda um projeto de outra organização, uma opção de design bloqueada no nível do código (org_cluster.rs, bloqueio de aconselhamento do Postgres por organização na criação). O único possível vizinho barulhento no patamar compartilhado do Aurabase é, portanto, outro projeto de sua própria organização, nunca de um cliente terceirizado.

fleet.rsrust
/// Capacidade nominal (número de bases de projetos) de um cluster organizacional.
/// Limite de observabilidade: além disso, direcione a organização para FullyDedicated.
/// Controlável via FLEET_CLUSTER_CAPACITY (padrão 1000, limitado [1, 1_000_000]).
pub fn fleet_cluster_capacity() -> i32 {
    std::env::var("FLEET_CLUSTER_CAPACITY")
        .ok()
        .and_then(|v| v.parse::<i32>().ok())
        .filter(|n| (1..=1_000_000).contains(n))
        .unwrap_or(1000)
}
2
Arquiteturas possíveis
FullyDedicated ou SharedClusterDedicated, nenhum outro
1000
Bases/cluster (padrão)
Configurável, limitado entre 1 e 1.000.000
PG 16
Versão Postgres
Ainda não PG 17 em clusters de inquilinos/frotas

Especificações de arquitetura de cluster PostgreSQL gerenciada pela Aurabase.

Este limite de 1.000 bases por cluster não é um limite rígido: é um benchmark de observabilidade que aciona uma recomendação para migrar para FullyDedicated, não um bloqueio automático. Ele não orienta mais nenhuma decisão de posicionamento; agora é possível apenas um cluster por organização.

Cada cluster, dedicado ou frota, expõe um Pooler CNPG (PgBouncer) que absorve parte da pressão nas conexões ativas, em ambas as topologias. O que esse pooler realmente altera para a contenção de recursos é detalhado abaixo.

O dimensionamento de CPU/RAM de um cluster compartilhado também não é uniforme entre organizações: ele deriva do nível da organização através de uma função dedicada (FleetSizing::from_org_plan, verificada em org_cluster.rs), e não de um tamanho único aplicado a todos os níveis. Uma organização no nível de equipe não dimensiona seu cluster da mesma forma que uma organização no nível livre.

Essas duas arquiteturas rodam no PostgreSQL 16, e não na versão 17, verificada no Dockerfile da imagem CNPG utilizada na produção. Esta escolha de versão tem suas próprias implicações de ajuste, detalhadas em nossa comparação Postgres 16 vs 17 vs 18.

#
A decisão

Quando o pooling é suficiente, quando a dedicação se torna necessária

Astuce

O pooling não é um compromisso barato. Corresponde ao tráfego da grande maioria dos projetos em desenvolvimento, lançamento ou crescimento moderado, onde um cluster dedicado representaria um custo adicional sem benefício mensurável.

SinalCompartilhado é suficienteDedicado recomendado
Cumprimento formal do isolamento físico (saúde, RH, setor público)NãoSim
Tráfego previsível, picos moderadosSim
Pico de carga imprevisível e sustentadoRisco de restriçãoSim
Orçamento apertado, produto em fase de validaçãoSim
Cláusula contratual (DPA) exigindo isolamento documentadoNãoSim

Para projetos sujeitos a uma obrigação contratual de isolamento físico documentado, nossas páginas DPA e detalham o que cada nível cobre.

A desvantagem do modelo base por locatário, destacada por diversas ferramentas de gerenciamento de migração de esquema como o Bytebase, é operacional e não técnica: cada migração deve ser aplicada e verificada em cada base, uma por uma, mesmo quando coexistem no mesmo cluster. Um cluster totalmente dedicado não elimina esse custo, até o acrescenta: uma migração por cluster para monitorar de forma independente, em vez de apenas uma.

Recursos especializados em arquitetura de software multilocatário, como CodeOpinion, apresentam regularmente essa abordagem intermediária (por locatário em infraestrutura compartilhada) como um compromisso razoável entre o esquema compartilhado e o cluster totalmente dedicado, em vez de uma escolha binária entre os dois extremos.

Passar de compartilhado para dedicado não requer reescrever um esquema ou alterar mecanismos: em ambos os casos, é Postgres, com a mesma cadeia pg_dump / pg_restore descrita em nosso guia de migração Supabase para Aurabase. Alterar o nível continua sendo uma operação de alternância, não uma reescrita do aplicativo.

#
Perguntas frequentes

Perguntas frequentes

Um banco de dados compartilhado Aurabase pode ser retardado por um projeto de outra empresa?+
O cluster CNPG compartilhado Aurabase pertence a uma única organização e nunca hospeda um projeto de uma organização terceirizada, verificado no código do provisionador (org_cluster.rs). O único vizinho barulhento possível neste nível é outro projeto de sua própria organização.
A camada compartilhada do Aurabase usa um esquema compartilhado com uma coluna tenant_id?+
Não. Cada projeto recebe seu próprio banco de dados Postgres (<9>project_<uuid></9>), mesmo nos níveis gratuito, profissional e de equipe. O que é compartilhado é o cluster CNPG (CPU, RAM, disco, conexões), não a base em si ou seu diagrama.
Como posso saber se meu projeto precisa de um cluster dedicado?+
Três sinais surgem com mais frequência: um requisito formal de conformidade sobre o isolamento físico de recursos, tráfego sustentado e imprevisível que satura regularmente as conexões disponíveis, ou uma cláusula contratual do tipo DPA que exige isolamento documentado. Abaixo destes limiares, o agrupamento continua a ser, na maioria dos casos, economicamente mais racional.
O limite de 1.000 bases por cluster é um limite rígido?+
Não, é um limite de observabilidade, não um bloqueio técnico automático. É configurável através da variável FLEET_CLUSTER_CAPACITY (padrão 1000, limitado entre 1 e 1.000.000) e é utilizado para sinalizar que uma organização deve ser orientada para um cluster dedicado.
O EPIRB é suficiente para evitar vizinhos barulhentos?+
Não. O RLS filtra as linhas visíveis por uma consulta; ele não reserva CPU, nem IOPS, nem conexões para um locatário específico. Dois locatários com políticas de RLS perfeitamente estanques ainda podem degradar um ao outro se compartilharem o mesmo cluster físico. Veja nosso artigo sobre RLS e base dedicada por projeto para a parte de isolamento lógico.
Por que o pooling custa menos que um cluster dedicado?+
Porque o custo fixo de um cluster Postgres (CPU, RAM, armazenamento reservado, backups) é distribuído entre todas as bases da organização que o ocupam, ao invés de ser pago integralmente por um único projeto. Um cluster dedicado permanece cobrado mesmo quando a carga real do projeto é baixa, o que o torna uma escolha racional, especialmente quando uma conformidade ou semáforo o justifica, e não antes.
#
Conclusão

O que lembrar

Base dedicada e base compartilhada não entram em conflito na segurança dos dados: ambos os modelos podem isolar corretamente um inquilino de outro no nível lógico. Eles se opõem em recursos físicos (CPU, IOPS, conexões, cache, janelas de manutenção). É este plano que define um vizinho barulhento, e não uma política de RLS mal escrita.

O modelo Aurabase, verificado no código do provisionador, mantém por padrão um compromisso intermediário: um banco de dados Postgres dedicado por projeto, em um cluster compartilhado, mas estritamente reservado para uma única organização, com um cluster totalmente dedicado reservado para o nível de negócios. A escolha certa depende dos seus reais constrangimentos e não de um reflexo onde o dedicado seria sempre a melhor opção.

PRONTO PARA IMPLEMENTAR?

Seu back-end em cinco minutos.

Não é necessário cartão de crédito · 500 MB grátis · 50.000 MAU