Introdução
Neste guia, primeiro veremos como o ClickHouse distribui uma consulta entre múltiplos shards por meio de tabelas distribuídas e, em seguida, como uma consulta pode aproveitar múltiplas réplicas durante sua execução.Em uma arquitetura shared-nothing, os clusters normalmente são divididos em múltiplos shards, com cada shard contendo um subconjunto do volume total de dados. Uma tabela distribuída fica sobre esses shards, fornecendo uma visão unificada dos dados completos. As leituras podem ser enviadas para a tabela local. A execução da consulta ocorrerá apenas no shard especificado, ou ela pode ser enviada para a tabela distribuída e, nesse caso, cada shard executará a consulta. O servidor no qual a tabela distribuída foi consultada agregará os dados e responderá ao cliente: A figura acima mostra o que acontece quando um cliente consulta uma tabela distribuída:
- A consulta SELECT é enviada arbitrariamente para uma tabela distribuída em um nó (por meio de uma estratégia round-robin ou após ser roteada para um servidor específico por um balanceador de carga). Esse nó passará a atuar como coordenador.
- O nó localizará cada shard que precisa executar a consulta por meio das informações especificadas pela tabela distribuída, e a consulta será enviada para cada shard.
- Cada shard lê, filtra e agrega os dados localmente e, em seguida, envia de volta ao coordenador um estado que pode ser mesclado.
- O nó coordenador mescla os dados e depois envia a resposta de volta ao cliente.
Arquitetura sem sharding
Apresentando réplicas paralelas
- A consulta do cliente é enviada a um nó depois de passar por um balanceador de carga. Esse nó se torna o coordenador dessa consulta.
- O nó analisa o índice de cada parte e seleciona as partes e os grânulos corretos para processamento.
- O coordenador divide a carga de trabalho em um conjunto de grânulos que pode ser atribuído a diferentes réplicas.
- Cada conjunto de grânulos é processado pelas réplicas correspondentes, e um estado passível de merge é enviado ao coordenador quando elas terminam.
- Por fim, o coordenador faz o merge de todos os resultados das réplicas e então retorna a resposta ao cliente.
- Algumas réplicas podem estar indisponíveis.
- A replicação no ClickHouse é assíncrona; algumas réplicas podem não ter as mesmas partes em um determinado momento.
- A latência de cauda entre réplicas precisa ser tratada de alguma forma.
- O cache do sistema de arquivos varia de réplica para réplica com base na atividade em cada réplica, o que significa que uma atribuição aleatória de tarefas pode levar a um desempenho menos eficiente, dada a localidade do cache.
Anúncios
- A consulta do cliente é enviada para um nó após passar por um balanceador de carga. Esse nó se torna o coordenador da consulta.
- O nó coordenador envia uma solicitação para obter anúncios de todas as réplicas do cluster. As réplicas podem ter visões ligeiramente diferentes do conjunto atual de partes de uma tabela. Por isso, precisamos coletar essas informações para evitar decisões incorretas de escalonamento.
- O nó coordenador então usa os anúncios para definir um conjunto de grânulos que podem ser atribuídos às diferentes réplicas. Aqui, por exemplo, podemos ver que nenhum grânulo da parte 3 foi atribuído à réplica 2 porque essa réplica não incluiu essa parte em seu anúncio. Observe também que nenhuma tarefa foi atribuída à réplica 3 porque a réplica não forneceu um anúncio.
- Depois que cada réplica tiver processado a consulta em seu subconjunto de grânulos e o estado mesclável tiver sido enviado de volta ao coordenador, o coordenador mescla os resultados e a resposta é enviada ao cliente.
Coordenação dinâmica
- As réplicas informam ao nó coordenador que conseguem processar tarefas; elas também podem especificar quanto trabalho conseguem processar.
- O coordenador atribui tarefas às réplicas.
- As réplicas 1 e 2 conseguem concluir sua tarefa muito rapidamente. Elas solicitarão outra tarefa ao nó coordenador.
- O coordenador atribui novas tarefas às réplicas 1 e 2.
- Todas as réplicas agora concluíram o processamento de sua tarefa. Elas solicitam mais tarefas.
- O coordenador, com base nos anúncios, verifica quais tarefas ainda precisam ser processadas, mas não há tarefas restantes.
- O coordenador informa às réplicas que tudo foi processado. Agora ele fará o merge de todos os estados mescláveis e responderá à consulta.
Gerenciando a localidade do cache
| Réplica 1 | Réplica 2 | Réplica 3 | |
|---|---|---|---|
| Parte 1 | g1, g6, g7 | g2, g4, g5 | g3 |
| Parte 2 | g1 | g2, g4, g5 | g3 |
| Parte 3 | g1, g6 | g2, g4, g5 | g3 |
max_parallel_replicas for menor
que o número de réplicas, então réplicas aleatórias serão escolhidas para a execução da consulta.
Roubo de tarefas
Limitações
Se você encontrar um problema que não seja uma das limitações listadas abaixo e
suspeitar que as réplicas paralelas sejam a causa, abra uma issue no GitHub usando
o rótulo
comp-parallel-replicas.| Limitation | Description |
|---|---|
| Consultas complexas | Atualmente, as réplicas paralelas funcionam muito bem para consultas simples. Camadas de complexidade, como CTEs, subconsultas, junções, consultas não planas etc., podem ter um impacto negativo no desempenho da consulta. |
| Consultas pequenas | Se você estiver executando uma consulta que não processa muitas linhas, executá-la em várias réplicas pode não resultar em melhor desempenho, já que o tempo de rede para a coordenação entre as réplicas pode adicionar ciclos à execução da consulta. Você pode reduzir esses problemas usando a configuração: parallel_replicas_min_number_of_rows_per_replica. |
| Réplicas paralelas são desabilitadas com FINAL | |
| Projeções não são usadas junto com réplicas paralelas | |
| Dados de alta cardinalidade e agregação complexa | Agregações de alta cardinalidade que exigem o envio de muitos dados podem deixar suas consultas significativamente mais lentas. |
| Compatibilidade com o novo analisador | O novo analisador pode tornar a execução da consulta significativamente mais lenta ou mais rápida em cenários específicos. |
| Configuração | Descrição |
|---|---|
enable_parallel_replicas | 0: desabilitado1: habilitado 2: força o uso de réplica paralela; gerará uma exceção se ela não for usada. |
cluster_for_parallel_replicas | O nome do cluster a ser usado para réplicas paralelas; se você estiver usando ClickHouse Cloud, use default. |
max_parallel_replicas | Número máximo de réplicas a serem usadas na execução da consulta em várias réplicas; se for especificado um número menor que o número de réplicas no cluster, os nós serão selecionados aleatoriamente. Esse valor também pode sofrer overcommit para acomodar o escalonamento horizontal. |
parallel_replicas_min_number_of_rows_per_replica | Ajuda a limitar o número de réplicas usadas com base no número de linhas que precisam ser processadas; o número de réplicas usadas é definido por: estimated rows to read / min_number_of_rows_per_replica. |
enable_analyzer | A execução de consultas com réplicas paralelas é compatível apenas com o analisador habilitado |
Investigando problemas com réplicas paralelas
system.query_log. Você também
pode consultar a tabela system.events
para ver todos os eventos que ocorreram no servidor e pode usar a
função de tabela clusterAllReplicas para ver as tabelas em todas as réplicas
(se você for usuário do Cloud, use default).
Query
Resposta
Resposta
Response
system.text_log também
contém informações sobre a execução de consultas com réplicas paralelas:
Query
Resposta
Resposta
Response
EXPLAIN PIPELINE. Ele mostra como o ClickHouse
vai executar uma consulta e quais recursos serão usados na
execução da consulta. Veja a consulta a seguir como exemplo:
EXPLAIN PIPELINE (without parallel replica)
EXPLAIN PIPELINE (with parallel replica)