Conceitos fundamentais de dimensionamento no Azure Cosmos DB for PostgreSQL
APLICA-SE AO: Azure Cosmos DB for PostgreSQL (da plataforma da extensão de dados Citus para PostgreSQL)
Antes de investigarmos as etapas de criação de um novo aplicativo, vale a pena obter uma visão geral rápida dos termos e conceitos envolvidos.
Visão geral da arquitetura
O Azure Cosmos DB for PostgreSQL permite distribuir as tabelas e/ou esquemas entre vários computadores em um cluster e consultá-las claramente da mesma forma que você faz uma consulta básica no PostgreSQL:
Na arquitetura do Azure Cosmos DB for PostgreSQL, há vários tipos de nós:
- O nó coordenador armazena os metadados da tabela distribuída e é responsável pelo planejamento distribuído.
- Por outro lado, os nós de trabalho armazenam os dados, metadados reais e fazem a computação.
- Tanto o nó coordenador quanto os nós de trabalho são bancos de dados básicos PostgreSQL, com a extensão
citus
carregada.
Para distribuir uma tabela normal PostgreSQL, como campaigns
no diagrama acima, execute um comando chamado create_distributed_table()
. Depois de executar esse comando, o Azure Cosmos DB for PostgreSQL criará fragmentos de forma transparente para a tabela entre os nós de trabalho. No diagrama, os fragmentos são representados como caixas azuis.
Para distribuir um esquema normal de PostgreSQL, execute o comando citus_schema_distribute()
. Depois de executar esse comando, o Azure Cosmos DB for PostgreSQL transforma de forma transparente as tabelas nesses esquemas em tabelas colocalizadas em um único fragmento que pode ser movidas como uma unidade entre os nós do cluster.
Observação
Em um cluster sem nós de trabalho, os fragmentos das tabelas distribuídas estão no nó coordenador.
Os fragmentos são tabelas básicas PostgreSQL (mas especialmente nomeadas) que contêm fatias dos dados. Em nosso exemplo, como distribuímos campaigns
por company_id
, os fragmentos realizam campanhas, em que as campanhas de diferentes empresas são atribuídas a fragmentos diferentes.
Coluna de distribuição (também conhecida como chave de fragmento)
create_distributed_table()
é a função magic que o Azure Cosmos DB for PostgreSQL fornece para distribuir tabelas e usar recursos em vários computadores.
SELECT create_distributed_table(
'table_name',
'distribution_column');
O segundo argumento acima escolhe uma coluna da tabela como coluna de distribuição. Pode ser qualquer coluna com um tipo nativo PostgreSQL (e o número inteiro e o texto são mais comuns). O valor da coluna de distribuição determina quais linhas entram em quais fragmentos, por isso a coluna de distribuição também é chamada de chave de fragmento.
O Azure Cosmos DB for PostgreSQL decide como executar as consultas com base no uso da chave de fragmento:
A consulta envolve | Onde é executada |
---|---|
apenas uma chave de fragmento | no nó de trabalho que contém o fragmento |
várias chaves de fragmento | paralelizadas em vários nós |
A escolha da chave de fragmento determina o desempenho e a escalabilidade dos aplicativos.
- A distribuição irregular de dados nas chaves de fragmento (também conhecida como distorção de dados) não é ideal para desempenho. Por exemplo, não escolha uma coluna para a qual um único valor representa 50% dos dados.
- As chaves de fragmento com baixa cardinalidade podem afetar a escalabilidade. Você só pode usar a mesma quantidade de fragmentos e de valores de chave distintos. Escolha uma chave com cardinalidade entre centenas e milhares.
- A junção de duas tabelas grandes com chaves de fragmentos diferentes pode ser lenta. Escolha uma chave de fragmento comum entre as tabelas grandes. Saiba mais em colocação.
Colocalização
Outro conceito intimamente relacionado à chave de fragmento é a colocação. As tabelas fragmentadas pelos mesmos valores da coluna de distribuição são colocadas – Os fragmentos das tabelas colocadas são armazenados juntos nos mesmos trabalhos.
Veja abaixo duas tabelas fragmentadas pela mesma chave, site_id
. Elas são colocadas.
O Azure Cosmos DB for PostgreSQL garante que as linhas com um valor correspondente de site_id
em ambas as tabelas sejam armazenadas no mesmo nó de trabalho. Você pode observar que, para ambas as tabelas, as linhas com site_id=1
são armazenadas no trabalho 1. Da mesma forma para outras IDs do site.
A colocação ajuda a otimizar a junções nessas tabelas. Se você unir as duas tabelas em site_id
, o Azure Cosmos DB for PostgreSQL poderá executar a junção localmente nos nós de trabalho, sem embaralhar os dados entre os nós.
Tabelas dentro de um esquema distribuído são sempre colocalizadas em conjunto.