Modelos de sharding em clusters elásticos no Base de Dados do Azure para PostgreSQL flexible server

O compartilhamento é uma técnica usada em sistemas de banco de dados e computação distribuída para particionar horizontalmente dados em vários servidores ou nós. Envolve dividir uma grande base de dados ou conjunto de dados em partes menores e mais geríveis chamadas fragmentos. Um fragmento contém um subconjunto dos dados e, juntos, fragmentos formam o conjunto de dados completo.

Os clusters elásticos nos servidores flexíveis do Base de Dados do Azure para PostgreSQL oferecem dois tipos de fragmentação de dados: baseada em linhas e baseada em esquemas. Cada opção tem as suas vantagens e desvantagens, pelo que pode escolher a abordagem que melhor se adequa aos requisitos da sua aplicação.

Fragmentação baseada em linha

Nas tabelas fragmentadas no modelo de esquema partilhado numa única base de dados, também conhecido como fragmentação por linhas, os inquilinos coexistem como linhas na mesma tabela. Defines uma coluna de distribuição para determinar o inquilino, que divide uma tabela horizontalmente.

O sharding baseado em linhas é o método mais eficiente em termos de hardware. Os nós no cluster acomodam e distribuem os tenants de forma densa. No entanto, esta abordagem exige garantir que todas as tabelas do esquema têm a coluna de distribuição e que todas as consultas na aplicação são filtradas por essa coluna. A fragmentação por linhas funciona bem em cargas de trabalho de IoT e para tirar o máximo partido do hardware.

Benefícios:

  • Melhor desempenho.
  • Melhor densidade de locatários por nó.

Desvantagens:

  • Requer modificações de esquema.
  • Requer modificações de consulta de aplicativo.
  • Exige que todos os inquilinos partilhem o mesmo esquema.

Fragmentação baseada em esquema

O sharding baseado em esquema utiliza uma base de dados partilhada e um modelo de esquema separado. Cada esquema atua como um fragmento lógico dentro da base de dados. As aplicações multi-inquilino podem usar um esquema para cada inquilino para fragmentar facilmente com base na dimensão do inquilino. Não precisas de mudar consultas, e a aplicação só precisa de uma pequena modificação para definir o correto search_path ao mudar de inquilinos. A fragmentação baseada em esquema é uma solução ideal para microsserviços e para ISVs (Fornecedores Independentes de Software) que implantam aplicativos que não podem sofrer as alterações necessárias para integrar a fragmentação baseada em linha.

Benefícios:

  • Os locatários podem ter esquemas heterogêneos.
  • Não são necessárias modificações de esquema.
  • Nenhuma modificação de consulta de aplicativo é necessária.
  • A compatibilidade SQL de fragmentação baseada em esquema é melhor em comparação com a fragmentação baseada em linha.

Desvantagens:

  • Menos inquilinos por nó em comparação com a fragmentação por linhas.

Compartilhamento de compensações

Fragmentação baseada em esquema Fragmentação baseada em linha
Modelo de multilocação Esquema separado por locatário Tabelas compartilhadas com colunas de ID do locatário
Versão Citus 12.0+ Todas as versões
Passos extras em comparação com o PostgreSQL padrão Nenhuma, apenas uma alteração de configuração create_distributed_table Use em cada tabela para distribuir e posicionar as tabelas por ID de inquilino
Número de inquilinos 1-10K 1-1 M+
Requisito de modelagem de dados Sem chaves estrangeiras em esquemas distribuídos É necessário incluir uma coluna de ID do locatário (uma coluna de distribuição, também conhecida como chave de fragmentação) em cada tabela, bem como nas chaves primárias e chaves estrangeiras.
Requisito SQL em consultas de nó singular Usar um único esquema distribuído por consulta As cláusulas JOIN e WHERE devem incluir a coluna tenant_id
Consultas paralelas entre locatários Não Yes
Definições de tabela personalizadas por locatário Yes Não
Controlo de acesso Permissões de esquema Permissões de esquema
Partilha de dados entre inquilinos Sim, usando tabelas de referência (em um esquema separado) Sim, usando tabelas de referência
Inquilino para isolamento de estilhaços Cada inquilino tem o seu próprio grupo de shards por definição. Pode atribuir aos IDs de inquilinos específicos um grupo de shards próprio através de isolate_tenant_to_new_shard