Ao criar tabelas no Hologres, escolha o table group e o shard count adequados é uma das decisões mais importantes antes da entrada em produção. Um shard count inadequado causa um de dois problemas: shards em excesso geram sobrecarga de shuffle e inicialização, o que degrada a latência de consultas; shards insuficientes limitam a concorrência de consultas e o throughput de escrita. O objetivo é alinhar o shard count ao volume de dados e à carga de trabalho, não maximizar o paralelismo.
Shard counts recomendados
O shard count ideal depende de vários fatores: volume de dados, frequência de consultas, padrões de acesso (point query versus processamento analítico online (OLAP)), throughput de escrita e quantidade de tabelas no table group. Use a tabela abaixo como ponto de partida e ajuste conforme sua carga de trabalho real.
|
Tamanho total dos dados |
Shard count recomendado |
Especificações de instância recomendadas |
|
Menos de 40 milhões de linhas |
10–20 |
Mais de 32 núcleos de CPU |
|
40 milhões–400 milhões de linhas |
20–40 |
Mais de 64 núcleos de CPU |
|
400 milhões–4 bilhões de linhas |
40–80 |
Mais de 128 núcleos de CPU |
|
4 bilhões–40 bilhões de linhas |
80–240 |
Mais de 256 núcleos de CPU. Considere criar um table group dedicado. |
|
40 bilhões–400 bilhões de linhas |
160–400 |
Mais de 512 núcleos de CPU. Use múltiplos table groups. |
Esses intervalos são diretrizes, não requisitos rígidos. Uma tabela com pouco volume de dados pode residir em um table group com muitos shards, e uma tabela grande pode residir em um table group com um único shard. Selecione um shard count que equilibre alta concorrência, eficiência computacional, concentração de dados e sobrecarga mínima de shuffle.
Um table group deve conter no máximo 10.000 tabelas, incluindo tabelas filhas particionadas, mas excluindo tabelas externas. Exceder esse limite causa acúmulo de metadados e execução mais lenta de comandos DDL (Data Definition Language).
Para verificar o shard count atual do seu table group, execute:
SELECT * FROM hologres.hg_table_group_properties;
-- Sample output
tablegroup_name | property_key | property_value
-----------------+---------------+----------------
test_tg_default | is_default_tg | 1
test_tg_default | shard_count | 40
test_tg_default | tg_version | 1
test_tg_default | table_num | 1
(4 rows)
Escolha uma configuração de table group
Siga as decisões abaixo em ordem. Pare na primeira etapa em que as condições forem atendidas.
Etapa 1: O table group padrão atende ao seu volume de dados?
Compare o shard count atual com os intervalos recomendados acima. Se ele atender ao volume de dados atual e projetado, use o table group padrão, desde que todas as três condições a seguir se apliquem:
O volume total de dados em todas as tabelas é controlável e previsível.
Não há expectativa de mudança significativa no padrão de uso.
As tabelas do grupo precisam executar operações de local join eficientes.
Após upgrade ou downgrade das especificações da instância, o shard count do table group padrão não muda automaticamente. Verifique o shard count após qualquer alteração de especificação.
Se o table group padrão não for adequado, prossiga para a próxima etapa.
Etapa 2: É necessário criar um novo table group?
Crie um novo table group se alguma das condições a seguir se aplicar:
Incompatibilidade de volume de dados: O shard count existente é muito alto para o volume de dados da tabela (gerando muitos arquivos pequenos com alta sobrecarga de I/O) ou muito baixo (limitando a concorrência de consultas).
Isolamento de carga de escrita: Muitas tabelas no table group existente exigem escritas simultâneas, causando alta carga na instância. Isolar tabelas em um table group dedicado torna escritas e consultas mais independentes.
Correlação entre tabelas: Um conjunto de tabelas compartilha um padrão exclusivo de escrita ou consulta e tem requisitos de local join entre si, mas apresenta pouca correlação com as tabelas do table group existente. O local join exige que a chave de junção seja a chave de distribuição e que todas as tabelas envolvidas estejam no mesmo table group.
Dimensionamento da instância: Se a instância teve seu dimensionamento horizontal alterado (scale in ou scale out) em mais de cinco vezes, o shard count original pode não ser mais apropriado. O novo shard count deve ser maior que o número de nós de computação e menor que 60% do total de núcleos de CPU.
Se nenhuma das condições acima se aplicar, continue usando o table group existente.
Planeje múltiplos table groups
Antes dos testes de estresse e da entrada em produção, defina a função de cada table group e atribua as tabelas adequadamente. Considere os seguintes fatores:
Volume de dados
Alinhe o shard count à quantidade de dados armazenados no table group. Table groups com muitos shards são adequados para tabelas grandes; table groups com poucos shards são indicados para tabelas pequenas e médias.
Throughput de escrita
O shard count tem efeito direto e positivo no throughput de escrita. Cada shard possui uma capacidade máxima de escrita: com 100% de utilização de CPU, um único shard grava entre 3.000 e 5.000 registros por segundo (RPS) para registros de 1 KB.
Para estimar o shard count necessário com base em uma meta de throughput de escrita, considere que um shard operando com um terço da utilização de CPU sustenta 1.000 RPS para registros de 1 KB. Se sua meta for 60.000 RPS com registros de 1 KB, serão necessários pelo menos 60 shards (60.000 / 1.000 = 60). Esse valor pode ser ajustado posteriormente.
Os shards também atendem a requisições de leitura, portanto a CPU disponível para escritas é sempre inferior a 100%. Leve em conta a carga de leitura ao estimar o shard count.
Carga do table group
Se um table group contiver muitas tabelas acessadas frequentemente de forma concorrente, um shard count baixo pode não suportar a concorrência de consultas necessária. Considere o número esperado de tabelas e seus padrões de acesso ao definir o shard count.
FAQ
Tenho uma instância de 512 núcleos para OLAP em tempo real em uma tabela de eventos com 20–40 bilhões de linhas. Como configurar o table group e o shard count?
Este é um cenário de carga única, portanto um único table group é suficiente. O shard count padrão para uma instância de 512 núcleos é 160. Se a tabela de eventos possuir centenas de colunas, aumente o shard count para 200 ou mais para suportar maior concorrência OLAP.
Tenho uma instância de 256 núcleos com várias tabelas orientadas a colunas, cada uma com dezenas de milhões de linhas, e preciso de OLAP em nível de milissegundos com consultas group-by e filter. Como devo configurar o shard count?
Este também é um cenário de carga única; um único table group é suficiente. O shard count padrão para uma instância de 256 núcleos é 120. Para tabelas com dezenas de milhões de linhas, 10–20 shards são mais adequados, pois mais shards aumentam a sobrecarga de shuffle e dificultam a obtenção de análises em nível de milissegundos. Altere o shard count do table group padrão para um valor entre 16 e 40 e valide com um teste de estresse.
Como verificar se uma consulta lenta é causada por um shard count inadequado?
Execute EXPLAIN ANALYZE na consulta lenta e examine a saída em busca dos seguintes indicadores:
Shard count muito alto: Alta sobrecarga de inicialização da consulta (verifique a linha start query cost) ou alta sobrecarga de shuffle (verifique
Max_GetNext_Timede Redistribution Motion). No Hologres V0.10 e versões posteriores, essas métricas também estão disponíveis nos logs de consultas lentas.Shard count muito baixo: A utilização de CPU permanece abaixo de 100% durante computações longas, a sobrecarga de varredura de dados é alta (verifique
Max_GetNext_Timede Scan Node) ou o desempenho de escrita é baixo. Compare o RPS real com a linha de base de 3.000–5.000 RPS por shard para avaliar se o shard count é insuficiente.
O QPS de point query não está atingindo minha meta. O shard count é a causa?
Antes de ajustar o shard count, descarte outras causas: a consulta pode ser analítica em vez de uma verdadeira point query, os índices podem não estar em uso, os shards podem não estar divididos ou a CPU pode estar com 100% de utilização. Se nenhuma dessas situações se aplicar e uma única instrução SQL já estiver com desempenho otimizado, aumente o shard count para elevar a concorrência no backend para point queries.
Como detectar e corrigir data skew?
O Hologres fornece o campo interno hg_shard_id, que identifica o shard onde cada linha reside. Execute a consulta a seguir para verificar a existência de skew:
SELECT hg_shard_id, COUNT(1) FROM <table_name> GROUP BY hg_shard_id ORDER BY COUNT(1) DESC;
Se um shard contiver significativamente mais dados que os demais, há data skew. Ajuste a chave de distribuição para obter uma distribuição mais uniforme.