Este tópico aborda as perguntas mais frequentes sobre o ApsaraDB for ClickHouse, incluindo seleção de instâncias, dimensionamento, conexões, migração de dados, consultas e armazenamento.
-
Seleção e compra
-
Dimensionamento
-
Conexões
-
Migração e sincronização
How do I resolve the "too many parts" error that occurs during data import?
Why do row counts differ between Hive and ClickHouse after data import?
Why do row counts differ between Kafka and ClickHouse after data import?
How do I import data from an existing ClickHouse cluster to Alibaba Cloud ClickHouse?
How do I resolve the "Too many partitions for single INSERT block (more than 100)" error?
How do I resolve network connectivity issues between the destination cluster and a data source?
Can I migrate a Community-Compatible Edition cluster to an Enterprise Edition cluster?
-
Gravação e consulta de dados
How do I handle the memory limit exceeded error that occurs during a query?
Why does an Enterprise Edition cluster report a memory limit error when I run an SQL statement?
How do I handle the "concurrency limit exceeded" error that occurs during queries?
How do I resolve inconsistent results for the same query after data writes have stopped?
Why are created tables sometimes not visible and why do query results fluctuate?
How do I resolve timestamp mismatches between queried and written data?
How do I handle the "table does not exist" error that occurs after I create a table?
Why is no new data ingested after a Kafka external table is created?
Why does the time returned by a query not match the time zone of the client?
Why isn't data merged by primary key after an OPTIMIZE task completes?
Why doesn't the TTL setting take effect after an OPTIMIZE task completes?
Why don't UPDATE and DELETE operations take effect after an OPTIMIZE task completes?
How do I use DDL statements to add, delete, or modify columns?
How do I handle the "set global on cluster default" syntax error?
Why does deduplication by using the FINAL keyword in ClickHouse fail due to a JOIN operation?
Why are results inconsistent across consecutive queries in a Community-Compatible Edition cluster?
Why do DELETE/UPDATE operations in a Community-Compatible Edition cluster not complete?
-
Armazenamento de dados
-
Monitoramento, atualizações e parâmetros do sistema
-
Outros
ApsaraDB for ClickHouse versus versão da comunidade
O ApsaraDB for ClickHouse corrige bugs de estabilidade presentes na versão da comunidade e oferece resource queues para definir prioridades de uso de recursos por função de usuário.
Versões recomendadas para o ApsaraDB for ClickHouse
O ApsaraDB for ClickHouse utiliza versões LTS estáveis do kernel da comunidade open source. Novas versões geralmente ficam disponíveis após um período de estabilização de três meses. Recomendamos a versão 21.8 ou superior. Version Feature Comparison.
Instâncias de réplica única versus mestre-réplica
Uma instância de réplica única não possui um nó de réplica para cada nó de shard e, portanto, não oferece alta disponibilidade. Sua segurança de dados depende do armazenamento com múltiplas réplicas do disco em cloud subjacente, o que a torna uma opção com excelente custo-benefício.
Já a instância mestre-réplica fornece um nó de réplica para cada nó de shard. Caso ocorra falha em um nó primário, o nó de réplica correspondente garante a recuperação de desastres.
Erro de recursos insuficientes
Tente adquirir recursos em outra zona dentro da mesma região. As zonas de uma mesma região se conectam via VPC com latência insignificante.
Fatores que afetam o tempo de dimensionamento horizontal
O dimensionamento horizontal envolve migração de dados, portanto o processo demora mais em instâncias com maior volume de dados.
Impacto do dimensionamento
Para garantir a consistência dos dados durante a migração, a instância entra em estado somente leitura durante o dimensionamento.
Recomendações de dimensionamento horizontal
O dimensionamento horizontal é lento. Se seu cluster apresentar desempenho insuficiente, priorize o dimensionamento vertical. Vertical scaling and horizontal scaling for Community Edition clusters.
Descrição das portas
|
Protocolo |
Número da porta |
Descrição |
|
TCP |
3306 |
Utilize esta porta para conectar-se ao ApsaraDB for ClickHouse com a ferramenta clickhouse-client. Connect to ClickHouse using a command line interface. |
|
HTTP |
8123 |
Use esta porta para conectar-se ao ApsaraDB for ClickHouse via JDBC no desenvolvimento de aplicações. Connect to ClickHouse using JDBC. |
|
HTTPS |
8443 |
Acesse o ApsaraDB for ClickHouse por HTTPS através desta porta. Connect to ClickHouse using the HTTPS protocol. |
Portas de conexão do SDK para o Alibaba Cloud ClickHouse
Linguagem | HTTP | TCP |
Java | 8123 | 3306 |
Python | ||
Go |
SDKs para Go e Python
Os SDKs recomendados estão listados em Bibliotecas de clientes de terceiros.
Resolver o erro "connect timed out"
Experimente estas soluções:
Verifique a conectividade de rede. Use
pingpara testar o alcance da rede etelnetpara confirmar se as portas de banco de dados 3306 e 8123 estão abertas.Valide a configuração da lista de permissões do ClickHouse. Configure a whitelist.
Confirme o endereço IP público da sua máquina cliente. Em redes corporativas, esse endereço pode mudar com frequência; utilize um serviço de consulta de IP como o whatsmyip.
Impossível conectar a tabelas externas
Nas versões 20.3 e 20.8, o sistema valida automaticamente a conexão ao criar uma tabela externa. A criação bem-sucedida da tabela confirma a conectividade de rede. Se a criação falhar, os motivos mais comuns incluem:
O endpoint de destino e o ClickHouse não estão na mesma VPC, o que impede a conectividade de rede.
O servidor MySQL utiliza uma lista de permissões. É necessário adicionar o ClickHouse à lista de permissões do MySQL.
Para tabelas externas do Kafka, quando a tabela é criada com sucesso mas as consultas não retornam dados, geralmente os dados no Kafka falham ao analisar conforme o esquema da tabela. A mensagem de erro indicará a localização exata da falha de análise.
Solucionar problemas de conexão
Causas comuns de falhas de conexão e suas respectivas soluções:
-
Causa: O ambiente de rede está configurado incorretamente. A conexão pela rede interna só funciona se a aplicação e a instância estiverem na mesma VPC. Caso estejam em VPCs diferentes, ative um endpoint público e conecte-se pela rede pública.
Solução: Ative o acesso pela rede pública. Apply for and release public IP addresses.
-
Causa: O endereço IP do cliente não consta na lista de permissões da instância.
Solução: Adicione o IP do cliente à lista de permissões. Configure a whitelist.
-
Causa: O grupo de segurança da sua instância ECS bloqueia o tráfego na porta necessária.
Solução: Atualize as regras do grupo de segurança da ECS. Security group operation guide.
-
Causa: Um firewall corporativo está bloqueando a conexão.
Solução: Modifique as regras do firewall para permitir o tráfego de saída para a instância.
-
Causa: O nome de usuário ou a senha na string de conexão contém caracteres especiais, como !@#$%^&*()_+=. O cliente pode não interpretar esses caracteres corretamente, causando falha na conexão.
Solução: Codifique em URL quaisquer caracteres especiais na string de conexão. As regras de codificação são as seguintes:
! : %21 @ : %40 # : %23 $ : %24 % : %25 ^ : %5e & : %26 * : %2a ( : %28 ) : %29 _ : %5f + : %2b = : %3dPor exemplo, se sua senha for ab@#c, a senha codificada na string de conexão deve ser ab%40%23c.
-
Causa: O ApsaraDB for ClickHouse provisiona automaticamente uma instância Server Load Balancer (SLB) no modelo pagamento conforme o uso para seu cluster. Se houver pagamentos pendentes na sua conta Alibaba Cloud, a instância SLB pode ser suspensa, tornando sua instância do ApsaraDB for ClickHouse inacessível.
Solução: Verifique se há pagamentos pendentes na sua conta Alibaba Cloud e quite qualquer saldo devedor para restaurar o serviço.
Lidar com problemas de timeout no ClickHouse
O ApsaraDB for ClickHouse oferece diversos parâmetros relacionados a timeout para os protocolos HTTP e TCP.
Protocolo HTTP
O protocolo HTTP é o método mais comum para interagir com o ApsaraDB for ClickHouse em ambientes de produção. Clientes como o driver JDBC oficial, Alibaba Cloud DMS e DataGrip utilizam o protocolo HTTP em segundo plano. A porta padrão para o protocolo HTTP é 8123.
-
Como lidar com problemas de distributed_ddl_task_timeout
-
Este parâmetro define o tempo de espera para execução de consultas DDL distribuídas (com cláusula ON CLUSTER). O valor padrão é 180 segundos. Execute o comando abaixo no Alibaba Cloud DMS para defini-lo como parâmetro global. A nova configuração entra em vigor após reiniciar o cluster.
set global on cluster default distributed_ddl_task_timeout = 1800;Como o ZooKeeper gerencia e executa tarefas DDL distribuídas de forma assíncrona em fila, um timeout indica que a tarefa ainda aguarda execução, e não que falhou. Não reenvie a tarefa.
-
-
Como lidar com problemas de timeout de max_execution_time
-
Este parâmetro especifica o tempo máximo de execução de uma consulta. O valor padrão é 7200 segundos na plataforma Alibaba Cloud DMS e 30 segundos para clientes como o driver JDBC e DataGrip. Ao atingir esse limite, o ClickHouse cancela automaticamente a consulta. Substitua essa configuração no nível da consulta. Por exemplo:
select * from system.numbers settings max_execution_time = 3600. Alternativamente, execute o seguinte comando no Alibaba Cloud DMS para defini-lo como parâmetro global.set global on cluster default max_execution_time = 3600;
-
-
Como lidar com problemas de socket_timeout
Este parâmetro define o tempo de espera para um socket de escuta retornar um resultado pelo protocolo HTTP. O valor padrão é 7200s na plataforma DMS e 30s para o driver JDBC e DataGrip. Trata-se de um parâmetro JDBC para o protocolo HTTP, não do sistema ClickHouse. No entanto, ele afeta a eficácia da configuração do parâmetro max_execution_time, pois determina o limite de tempo no lado do cliente para aguardar um resultado. Portanto, ao ajustar o parâmetro max_execution_time, ajuste também o parâmetro socket_timeout para um valor ligeiramente superior ao max_execution_time. Para configurar esse parâmetro, adicione a propriedade socket_timeout à string de conexão JDBC. O valor é especificado em milissegundos. Exemplo: 'jdbc:clickhouse://127.0.0.1:8123/default?socket_timeout=3600000'.
-
Cliente trava ao conectar diretamente ao endereço IP do servidor ClickHouse
-
Quando uma instância ECS se conecta a um servidor ClickHouse entre grupos de segurança, pode ocorrer uma falha silenciosa de conexão. Isso acontece se o endereço IP do servidor ClickHouse não estiver na lista de permissões do grupo de segurança da instância ECS que executa o cliente JDBC. Durante a execução de consultas longas, problemas de roteamento podem impedir a entrega dos pacotes de resposta ao cliente, fazendo-o travar.
Assim como na resolução de problemas transitórios de conexão com instância SLB, ativar send_progress_in_http_headers resolve a maioria desses casos. Nas raras situações em que essa configuração não funcionar, adicione o endereço IP do servidor ClickHouse à lista de permissões do grupo de segurança da instância ECS onde o cliente está executando.
-
Protocolo TCP
O protocolo TCP é mais utilizado para análises interativas com a ferramenta nativa de linha de comando do ClickHouse. A porta comum para clusters da Community Edition é 3306. Como o protocolo TCP inclui pacotes keep-alive, ele não sofre timeouts no nível de socket. Basta gerenciar os parâmetros distributed_ddl_task_timeout e max_execution_time. Defina-os usando o mesmo método do protocolo HTTP.
Resolver o erro "Connection refused (localhost:9000)"
Problema: Após criar um dicionário em uma instância do Alibaba Cloud ClickHouse, a execução de uma consulta retorna o seguinte erro: "Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR) (version 23.8.16.1)".
Causa: O Alibaba Cloud ClickHouse utiliza mapeamento de portas. A porta exibida no console (por exemplo, 9000) é a porta do balanceador de carga, não a porta real do nó. Para acessar a instância com localhost, use a porta real do nó, não a porta do balanceador de carga.
-
Solução: Acesse a porta real do nó. Por exemplo, altere localhost:9000 para localhost:3003. A tabela abaixo mostra os mapeamentos de porta comuns para a Community Edition.
Porta do balanceador de carga
Porta real do nó
3306
3003
9000
3003
8123
3002
9004
3005
8443
3006
Porta do Prometheus inacessível no ApsaraDB for ClickHouse
Problema: Você configurou os parâmetros do Prometheus para o seu cluster ApsaraDB for ClickHouse, mas não consegue acessar a porta especificada do Prometheus. Por exemplo, o comando
telnet cc-xxxx.clickhouse.ads.aliyuncs.com:port-numberfalha.Causa: O endereço de conexão fornecido no console aponta para um balanceador de carga, enquanto o serviço Prometheus é executado nos nós subjacentes do ApsaraDB for ClickHouse. O balanceador de carga não está configurado para encaminhar tráfego em portas personalizadas para esses nós.
-
Solução: Conecte-se diretamente aos endereços IP dos nós subjacentes para acessar o Prometheus. Execute o comando a seguir para obter os endereços IP desses nós e use um dos endereços retornados para se conectar à porta do Prometheus.
SELECT * FROM system.clusters;
Erros de OOM durante a importação de dados do OSS
Causa comum: Alto uso de memória.
Para resolver esse problema, adote uma das seguintes medidas:
Divida arquivos grandes no OSS em arquivos menores antes de importá-los.
Faça o dimensionamento vertical do cluster para aumentar a memória disponível. Vertical and horizontal scaling for Community Edition clusters.
Como resolver o erro "too many parts"
O ClickHouse gera uma parte de dados para cada operação de escrita. Escrever uma única linha ou pequenos volumes de dados por vez cria um número excessivo de partes, o que sobrecarrega as operações de mesclagem e as consultas. O erro "too many parts" ocorre porque o ClickHouse aplica limites internos para evitar essa situação. Se esse erro acontecer, aumente o tamanho do lote de escrita. Caso não seja possível ajustar o tamanho do lote, aumente o valor do parâmetro merge_tree.parts_to_throw_insert no console.
Por que as importações com DataX estão lentas?
Causas comuns e soluções:
-
Causa 1: Configuração de parâmetros não otimizada. O ClickHouse apresenta melhor desempenho com um tamanho de
batchgrande e um número reduzido deconcurrent operations. Um únicobatchpode conter dezenas ou até centenas de milhares de linhas, dependendo do tamanho médio da linha. Como diretriz geral, estime 100 bytes por linha, mas ajuste esse valor conforme as características reais dos seus dados.Solução: Defina o número de
concurrent operationscomo 10 ou menos. Teste diferentes valores de parâmetros para encontrar a configuração ideal para sua carga de trabalho. -
Causa 2: Recursos insuficientes no
exclusive resource groupdo DataWorks. As instânciasECSnoexclusive resource grouppodem estar subdimensionadas. CPU ou memória insuficientes limitam o número deconcurrent operationse anetwork egress bandwidthdisponível. Da mesma forma, definir um tamanho debatchgrande em uma máquina com memória limitada pode acionar coletas de lixo (GC) frequentes do Java no processo do DataWorks, reduzindo o desempenho.Solução: Verifique as especificações da instância
ECSnos logs de saída do DataWorks. -
Causa 3: O gargalo está na
data source.Solução: Nos logs de saída do DataWorks, procure as métricas
totalWaitReaderTimeetotalWaitWriterTime. SetotalWaitReaderTimefor significativamente maior quetotalWaitWriterTime, o gargalo está na leitura (nadata source), e não na escrita. -
Causa 4: Uso de um
public network endpoint. Umpublic network endpointpossui largura de banda limitada e não é adequado para operações de importação ou exportação de dados de alto desempenho.Solução: Alterne para um endpoint de rede
VPC network. -
Causa 5: Presença de
dirty data. Normalmente, os dados são escritos em umbatch. No entanto, se houverdirty data, a escrita dobatchatual falha. O DataX então recorre ao modo de inserção linha a linha. Essa alternativa gera um excesso dedata partse reduz drasticamente o desempenho de escrita.Use os dois métodos a seguir para verificar a existência de
dirty data.-
Verifique mensagens de erro. Se o log contiver um erro
Cannot parse, isso indicadirty data.Execute a consulta SQL a seguir para identificar exceções.
SELECT written_rows, written_bytes, query_duration_ms, event_time, exception FROM system.query_log WHERE event_time BETWEEN '2021-11-22 22:00:00' AND '2021-11-22 23:00:00' AND lowerUTF8(query) LIKE '%insert into <table_name>%' and type != 'QueryStart' and exception_code != 0 ORDER BY event_time DESC LIMIT 30; -
Monitore a contagem de linhas do
batch. Se o número de linhas porbatchcair para 1, é muito provável que o DataX tenha encontradodirty datae alternado para o modo linha a linha.Utilize a consulta SQL abaixo para conferir a contagem de linhas.
SELECT written_rows, written_bytes, query_duration_ms, event_time FROM system.query_log WHERE event_time BETWEEN '2021-11-22 22:00:00' AND '2021-11-22 23:00:00' AND lowerUTF8(query) LIKE '%insert into <table_name>%' and type != 'QueryStart' ORDER BY event_time DESC LIMIT 30;
Solução: Identifique e corrija ou remova os
dirty datadadata source. -
Divergência na contagem de linhas após importação do Hive
Realize as verificações a seguir:
Consulte a tabela de sistema
query_logem busca de erros durante a importação. A presença de erros geralmente indica perda de dados.Verifique se o mecanismo da tabela suporta deduplicação. Por exemplo, ao usar o mecanismo
ReplacingMergeTree, a quantidade de linhas no ClickHouse pode ser menor que no Hive, pois esse mecanismo remove duplicatas.Confira a precisão da contagem de linhas na origem Hive, já que a contagem inicial da fonte pode estar incorreta.
Divergência na contagem de linhas entre ClickHouse e Kafka
Verifique os itens abaixo:
Analise a tabela de sistema
query_logpara identificar erros ocorridos durante a importação. Se houver erros, pode ter havido perda de dados.Confirme se o mecanismo da tabela realiza deduplicação de dados. O mecanismo
ReplacingMergeTree, por exemplo, remove entradas duplicadas, resultando em uma contagem de linhas menor no ClickHouse em comparação ao Kafka.Verifique se o parâmetro
kafka_skip_broken_messagesestá ativado na configuração da tabela externa do Kafka. Quando ativado, o ClickHouse ignora mensagens com falha de análise, reduzindo a contagem de linhas no ClickHouse em relação ao Kafka.
Importação de dados com Spark e Flink
Importar dados de um ClickHouse existente
Escolha um destes métodos:
Exporte arquivos usando o ClickHouse Client. Migrate data from a self-managed ClickHouse instance to ApsaraDB for ClickHouse Community Edition.
-
Utilize a função remote.
INSERT INTO <destination_table> SELECT * FROM remote('<connection_string>', '<database>', '<table>', '<username>', '<password>');
Erro de sincronização do MaterializeMySQL: The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires
Esse erro indica que o mecanismo MaterializeMySQL ficou sem sincronizar por um longo período, fazendo com que os logs binários do MySQL expirassem e fossem removidos.
Para resolver, exclua o banco de dados afetado e recrie-o no ApsaraDB for ClickHouse.
Por que as tabelas param de sincronizar e o campo sync_failed_tables na tabela de sistema system.materialize_mysql não está vazio ao usar o mecanismo MaterializeMySQL para sincronizar dados do MySQL?
Causa comum: Execução de uma instrução DDL (Data Definition Language) do MySQL não suportada pelo ApsaraDB for ClickHouse durante a sincronização.
Solução: Siga estas etapas para ressincronizar os dados do MySQL.
-
Exclua a tabela que parou de sincronizar.
DROP TABLE <table_name> ON cluster default;NotaNeste comando,
table_nameé o nome da tabela que parou de sincronizar. Se for uma tabela distribuída, exclua tanto a tabela distribuída quanto sua tabela local. -
Reinicie o processo de sincronização.
ALTER database <database_name> ON cluster default MODIFY SETTING skip_unsupported_tables = 1;NotaNeste comando,
<database_name>é o nome do banco de dados sincronizado no ApsaraDB for ClickHouse.
Resolvendo o erro "Too many partitions for single INSERT block (more than 100)"
Esse erro ocorre quando uma única operação INSERT tenta escrever em mais partições do que o permitido pelo parâmetro max_partitions_per_insert_block, cujo padrão é 100. No ClickHouse, cada operação de escrita cria uma parte de dados. Uma partição pode conter uma ou mais partes. Se uma instrução INSERT gravar dados em muitas partições distintas simultaneamente, ela gera partes demais, sobrecarregando as operações de mesclagem e consulta. Para evitar degradação de desempenho, o ClickHouse impõe esse limite.
Para resolver, ajuste a estratégia de particionamento ou modifique o parâmetro max_partitions_per_insert_block.
Ajuste o esquema da tabela, altere o método de particionamento ou garanta que uma única operação de inserção não ultrapasse o limite de partições.
-
Se o caso de uso exigir escrita em muitas partições simultaneamente, aumente o limite de
max_partitions_per_insert_blockconforme o volume de dados. Use a sintaxe abaixo para modificar o parâmetro:Single-node instance
SET GLOBAL max_partitions_per_insert_block = XXX;Multi-node instance
SET GLOBAL ON cluster DEFAULT max_partitions_per_insert_block = XXX;NotaA comunidade ClickHouse recomenda o valor padrão de 100. Definir esse valor muito alto pode degradar o desempenho. Após concluir a importação em massa de dados, reverta o parâmetro para o valor padrão.
Erro de limite de memória excedido para insert into select
-
Causa: Alto consumo de memória.
Solução: Ajuste o parâmetro
max_insert_threadspara reduzir o uso de memória. -
Causa: Uso da instrução
insert into selectpara importar dados entre clusters ClickHouse.Solução: Migre os dados importando-os a partir de arquivos. Migrate data from a self-managed ClickHouse instance to ApsaraDB for ClickHouse Community Edition.
Consultando uso de CPU e memória
A tabela de sistema system.query_log fornece estatísticas de uso de CPU e memória para cada consulta.
Solucionando erros de limite de memória
O servidor ClickHouse monitora o uso de memória em vários níveis. Para uma única consulta, um rastreador de memória agrega o consumo de todas as threads dessa consulta. Esse rastreador reporta a um rastreador global de memória. A solução depende do erro específico encontrado.
Um erro com
Memory limit (for query)significa que a consulta falhou por consumir memória excessiva, ultrapassando o limite de 70% da capacidade total de memória da instância. Para resolver, faça um upgrade vertical para aumentar a capacidade de memória da instância.Um erro com
Memory limit (for total)indica que o uso geral de memória na instância excedeu o limite sistêmico de 90% da capacidade total. Esse erro pode resultar de alta concorrência de consultas ou tarefas assíncronas em segundo plano intensivas em recursos, como mesclagens de chave primária após escritas de dados. Primeiro, tente reduzir a concorrência de consultas. Se o erro persistir, realize um upgrade vertical para aumentar a memória da instância.
Erro de memory limit em consulta SQL na Enterprise Edition
Causa: Cada nó em um cluster Alibaba Cloud ApsaraDB for ClickHouse Enterprise Edition possui 32 unidades de computação ClickHouse (CCUs) e 128 GB de memória. O sistema operacional utiliza parte dessa memória, deixando aproximadamente 115 GB para execução de consultas. Por padrão, uma única consulta SQL roda em um nó. Um erro de memory limit ocorre se uma consulta usar mais de 115 GB de memória.
O limite máximo de CCU de um cluster determina seu número de nós. Se o limite máximo de CCU for superior a 64, o número de nós em um cluster Enterprise Edition será: Maximum CCU limit / 32. Se o limite máximo de CCU for 64 ou menos, o cluster Enterprise Edition terá dois nós.
Solução: Adicione a cláusula SETTINGS a seguir à sua instrução SQL para habilitar a execução paralela em vários nós. Essa técnica distribui a carga de memória, prevenindo o erro de memory limit.
SETTINGS
allow_experimental_analyzer = 1,
allow_experimental_parallel_reading_from_replicas = 1;
Consumo excessivo de memória no GROUP BY
Defina o parâmetro max_bytes_before_external_group_by para limitar o consumo de memória nas operações GROUP BY. Observe que a configuração allow_experimental_analyzer afeta a aplicação desse parâmetro.
Tratando erros de Limite de Concorrência Excedido
A concorrência máxima padrão de consultas para um servidor é 100. Modifique esse valor no console:
Faça login no console do ApsaraDB for ClickHouse.
Na página Clusters, selecione Clusters of Community-compatible Edition e clique no ID do cluster desejado.
No painel de navegação à esquerda, clique em Parameter Configuration.
Na página Parameter Configuration, clique no ícone de edição na coluna Parameter Value referente ao parâmetro
max_concurrent_queries.Insira o novo valor na caixa de diálogo e clique em OK.
Clique em Submit Parameters.
Clique em OK.
Resultados de consulta inconsistentes com escritas de dados interrompidas
Descrição do problema: Ao consultar dados usando select count(*), apenas cerca de metade do total de dados é retornada, ou os resultados oscilam.
Considere as seguintes soluções:
Verifique se você está usando um cluster multi-nó. Em clusters multi-nó, é necessário criar uma tabela distribuída. Escreva e consulte essa tabela para obter resultados consistentes. Caso contrário, cada consulta pode atingir um shard diferente. Create a distributed table.
Confirme se você está usando um cluster mestre-réplica. Nesse tipo de cluster, utilize tabelas com mecanismos da série Replicated para sincronizar dados entre réplicas. Sem isso, cada consulta pode atingir uma réplica diferente, causando inconsistência nos resultados. Table engines.
Tabelas invisíveis e resultados de consulta flutuantes
Causas comuns e soluções:
-
Causa 1: Processo de criação de tabela incorreto. Um cluster distribuído ClickHouse não possui semântica DDL distribuída nativa. Se você usar uma instrução
create tableem um cluster ClickHouse autogerenciado, a instrução pode retornar sucesso, mas a tabela será criada apenas no servidor atualmente conectado. Ao conectar-se a outro servidor, a tabela não ficará visível.Solução:
-
Ao criar uma tabela, use a instrução
create table <table_name> on cluster default. A cláusulaon cluster defaulttransmite a instrução para todos os nós no cluster padrão.CREATE TABLE test ON cluster default (a UInt64) Engine = MergeTree() ORDER BY tuple(); -
Crie outra tabela utilizando o mecanismo de tabela distribuída sobre a tabela de teste.
CREATE TABLE test_dis ON cluster default AS test Engine = Distributed(default, default, test, cityHash64(a));
-
-
Causa 2: Tabela ReplicatedMergeTree mal configurada. O mecanismo ReplicatedMergeTree é uma versão aprimorada do MergeTree que oferece sincronização mestre-réplica. Em instâncias de réplica única, só é possível criar tabelas com o mecanismo
MergeTree. Já em instâncias mestre-réplica, é obrigatório criar tabelas com o mecanismo ReplicatedMergeTree.Solução: Ao criar uma tabela em uma instância mestre-réplica, use
ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')ouReplicatedMergeTree()para configurar o mecanismo ReplicatedMergeTree. Os argumentos emReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')fazem parte de um modelo fixo e não devem ser modificados.
Discrepâncias em dados de timestamp
Execute SELECT timezone() para verificar se o fuso horário corresponde ao local. Caso contrário, defina o item de configuração 'timezone' para o fuso horário local. Consulte Modify running parameter values for configuration items para obter instruções.
Tabela não encontrada após a criação
Esse problema geralmente ocorre quando uma instrução DDL é executada em apenas um nó.
Para resolver, certifique-se de que a instrução DDL inclua a cláusula on cluster. Table creation syntax.
Ausência de novos dados em tabelas externas do Kafka
Primeiro, execute uma consulta select * from na tabela externa do Kafka. Se a consulta falhar, verifique a mensagem de erro, pois frequentemente isso se deve a uma falha na análise dos dados. Se a consulta retornar resultados, confirme se os campos da tabela de destino (a tabela de armazenamento subjacente à tabela externa do Kafka) correspondem aos da tabela externa do Kafka. Se a escrita de dados falhar, os campos não correspondem. Por exemplo:
insert into <destination table> as select * from <Kafka external table>;
Incompatibilidade entre hora e fuso horário do cliente
Esse problema ocorre quando a configuração use_client_time_zone está definida com um fuso horário incorreto.
Dados não visíveis após operação de escrita?
Sintoma: Após escrever dados em uma tabela, consultas subsequentes não conseguem encontrar os dados.
Causa: As possíveis causas incluem:
Os esquemas da tabela distribuída e das tabelas locais são inconsistentes.
Após a escrita de dados em uma tabela distribuída, a distribuição de arquivos temporários está incompleta.
Após a escrita de dados em uma réplica de um cluster mestre-réplica, a sincronização entre réplicas está incompleta.
Análise e soluções:
Inconsistent schemas
Consulte a tabela de sistema system.distribution_queue para verificar erros ocorridos durante escritas na tabela distribuída.
Incomplete file distribution
Análise da causa: Em um cluster multi-nó ApsaraDB for ClickHouse, se sua aplicação se conectar ao banco de dados via nome de domínio e executar uma instrução INSERT em uma tabela distribuída, um Server Load Balancer (SLB) de front-end roteará a solicitação para um nó aleatório do cluster. O nó que recebe a solicitação grava parte dos dados em seu disco local e armazena o restante como arquivos temporários. Esses arquivos são então distribuídos assincronicamente para os outros nós. Se uma consulta for executada antes da conclusão desse processo de distribuição, ela poderá não retornar os dados ainda não distribuídos.
Solução: Se sua aplicação exigir forte consistência de leitura após escrita, adicione a cláusula settings insert_distributed_sync = 1 à sua instrução INSERT. Essa configuração alterna a operação INSERT para o modo síncrono. A instrução retorna uma mensagem de sucesso somente após os dados serem distribuídos para todos os nós.
Ativar essa configuração aumenta o tempo de execução das instruções INSERT, pois a operação precisa aguardar a conclusão da distribuição de dados. Avalie o compromisso entre consistência de dados e desempenho de escrita para sua aplicação.
Essa configuração aplica-se no nível do cluster e deve ser usada com cautela. Primeiro, teste a configuração em uma única consulta. Após validar os resultados, aplique-a no nível do cluster apenas se o seu negócio exigir.
-
Para aplicar essa configuração a uma única consulta, anexe-a ao final da instrução. Por exemplo:
INSERT INTO <table_name> values() settings insert_distributed_sync = 1; Para aplicar essa configuração no nível do cluster, configure-a no arquivo user.xml. Configure user.xml parameters.
Incomplete replica synchronization
Análise da causa: Em um cluster mestre-réplica ApsaraDB for ClickHouse, ao executar uma instrução INSERT, o cluster executa a operação em uma réplica escolhida aleatoriamente. Os dados são então sincronizados assincronicamente para a outra réplica. Se uma consulta SELECT subsequente for roteada para a réplica que ainda não concluiu a sincronização, a consulta poderá não retornar os dados esperados.
Solução: Se sua aplicação exigir forte consistência de leitura após escrita, adicione a cláusula settings insert_quorum = 2 à sua instrução INSERT. Essa configuração força a sincronização de réplicas a rodar em modo síncrono. A instrução INSERT retorna uma mensagem de sucesso somente após a sincronização dos dados ser concluída em ambas as réplicas.
Considere os pontos abaixo ao usar este parâmetro:
Essa configuração aumenta o tempo de execução das instruções INSERT, pois a operação precisa aguardar a conclusão da sincronização das réplicas. Avalie o compromisso entre consistência de dados e desempenho de escrita para sua aplicação.
Após definir este parâmetro, as operações
INSERTdevem aguardar o sucesso da sincronização entre réplicas. Isso significa que, se uma réplica estiver indisponível, todas as operações de escrita configuradas cominsert_quorum = 2falharão, o que entra em conflito com a garantia de confiabilidade de uma configuração de réplica dupla.Essa configuração aplica-se no nível do cluster e deve ser usada com cautela. Primeiro, teste a configuração em uma única consulta. Após validar os resultados, aplique-a no nível do cluster apenas se o seu negócio exigir.
-
Para aplicar essa configuração a uma única consulta, anexe-a ao final da instrução. Por exemplo:
INSERT INTO <table_name> values() settings insert_quorum = 2; Para aplicar essa configuração no nível do cluster, configure-a no arquivo user.xml. Configure user.xml parameters.
Por que o TTL não exclui dados expirados
Sintoma
Um TTL foi configurado corretamente para uma tabela, mas os dados expirados nela não são excluídos automaticamente. Isso indica que a configuração de TTL não está surtindo efeito.
Etapas de solução de problemas
-
Verifique se a configuração de TTL da tabela é adequada.
Defina o TTL com base nos requisitos do seu negócio. Recomendamos configurar o TTL no nível de dia e evitar configurações no nível de segundo ou minuto, como
TTL event_time + INTERVAL 30 SECOND. -
Verifique o parâmetro
materialize_ttl_after_modify.Esse parâmetro controla se uma nova regra de TTL se aplica aos dados existentes após a execução de uma instrução ALTER MODIFY TTL. O valor padrão é 1 (ativado). Um valor igual a 0 significa que a regra se aplica apenas a novos dados, e os dados existentes não são afetados pelo TTL.
-
Consulte a configuração do parâmetro
SELECT * FROM system.settings WHERE name like 'materialize_ttl_after_modify'; -
Modifique a configuração do parâmetro
ImportanteEste comando verifica todos os dados existentes e pode gerar uma alta carga de recursos. Use-o com cautela.
ALTER TABLE $table_name MATERIALIZE TTL;
-
-
Analise a estratégia de limpeza de partições.
Quando o parâmetro
ttl_only_drop_partsestá definido como 1, o ClickHouse exclui uma parte de dados somente quando todas as linhas dentro dessa parte expiraram.-
Consulte a configuração do parâmetro
ttl_only_drop_partsSELECT * FROM system.merge_tree_settings WHERE name LIKE 'ttl_only_drop'; -
Verifique o status de expiração da partição
SELECT partition, name, active, bytes_on_disk, modification_time, min_time, max_time, delete_ttl_info_min, delete_ttl_info_max FROM system.parts c WHERE database = 'your_dbname' AND TABLE = 'your_tablename' LIMIT 100;delete_ttl_info_min: Valor mínimo da chave datetime usado para a regra TTL DELETE nesta parte.
delete_ttl_info_max: Valor máximo da chave datetime usado para a regra TTL DELETE nesta parte.
-
Caso as regras de partição e de TTL não estejam alinhadas, alguns dados podem não ser limpos prontamente. A seguir, explicamos como as regras de partição e de TTL interagem.
Se as regras de partição e de TTL estiverem alinhadas (por exemplo, particionamento por dia e definição de um TTL diário), o ClickHouse consegue determinar a expiração com base no ID da partição e excluir uma partição inteira de uma só vez. Essa é a estratégia mais eficiente. Para obter o melhor desempenho, recomendamos combinar uma estratégia de particionamento (como por dia) com ttl_only_drop_parts=1 para excluir dados expirados de forma eficiente.
Quando as regras não estão alinhadas e
ttl_only_drop_parts = 1, o ClickHouse verifica as informações de TTL de cada parte. Uma parte é excluída somente depois que todos os seus dados ultrapassam o timestamp delete_ttl_info_max.Quando as regras não estão alinhadas e
ttl_only_drop_parts = 0, o ClickHouse precisa verificar os dados dentro de cada parte para encontrar e excluir linhas expiradas individualmente. Esta é a estratégia que mais consome recursos.
-
-
Controle a frequência de acionamento de merges.
A exclusão de dados expirados ocorre de forma assíncrona durante os merges, não em tempo real. É possível controlar a frequência de merges com o parâmetro merge_with_ttl_timeout ou forçar a materialização do TTL usando a instrução ALTER TABLE ... MATERIALIZE TTL.
-
Consulte o parâmetro
SELECT * FROM system.merge_tree_settings WHERE name = 'merge_with_ttl_timeout';NotaA unidade é segundos. O valor padrão para uma instância online é 7200 segundos (2 horas).
-
Modifique o parâmetro
Se merge_with_ttl_timeout estiver definido com um valor muito alto, a frequência de acionamento do merge de TTL diminui, atrasando a limpeza de dados expirados. Reduza esse parâmetro para aumentar a frequência de limpeza. Para mais detalhes, consulte Descrição do parâmetro.
-
-
Verifique as configurações dos parâmetros do pool de threads.
A remoção de dados por TTL ocorre durante a fase de merge de partes e é limitada pelos parâmetros
max_number_of_merges_with_ttl_in_pool(padrão: 2 para instâncias online) ebackground_pool_size(padrão: 16 para instâncias online).-
Consulte a atividade atual das threads em segundo plano
SELECT * FROM system.metrics WHERE metric LIKE 'Background%';A métrica
BackgroundPoolTaskindica o número de tarefas ativas no momento no pool em segundo plano. -
Modifique os parâmetros
Se as outras configurações de parâmetros estiverem corretas e a utilização da CPU estiver baixa, considere aumentar o parâmetro
max_number_of_merges_with_ttl_in_poolconforme as necessidades do seu negócio, por exemplo, de 2 para 4 ou de 4 para 8. Se isso não resolver o problema, considere aumentar o parâmetrobackground_pool_size.ImportanteÉ necessário reiniciar o cluster se você ajustar o parâmetro
max_number_of_merges_with_ttl_in_pool. Não é necessário reiniciar o cluster ao aumentar o parâmetrobackground_pool_size, mas é obrigatório reiniciá-lo ao diminuir o parâmetrobackground_pool_size.
-
-
Verifique se o esquema da tabela e o design de particionamento são adequados.
Se uma tabela não for particionada de forma eficaz ou se a granularidade da partição for muito grosseira, a eficiência da limpeza por TTL diminui. Para uma limpeza eficiente, recomendamos alinhar a granularidade da partição com a granularidade do TTL (por exemplo, definindo ambos com um intervalo diário). Para mais detalhes, consulte Melhores práticas.
-
Verifique se o cluster tem espaço em disco suficiente.
As operações de merge em segundo plano acionam a limpeza por TTL e exigem espaço em disco disponível. Partes de dados grandes ou espaço em disco insuficiente (por exemplo, uso superior a 90%) podem impedir operações de merge e as subsequentes exclusões por TTL.
-
Verifique outros parâmetros do sistema em
system.merge_tree_settings.merge_with_recompression_ttl_timeout: O atraso mínimo antes que um merge com TTL de recompressão possa se repetir. Por padrão, isso significa que as regras de TTL são aplicadas a uma tabela pelo menos a cada 4 horas. Se precisar aplicar regras de TTL com mais frequência, reduza este valor.
max_number_of_merges_with_ttl_in_pool: Este parâmetro controla o número máximo de threads disponíveis para tarefas de TTL. Se o número de tarefas de merge com TTL em andamento no pool de threads em segundo plano exceder esse valor, o ClickHouse não agendará novas tarefas de merge com TTL.
Tarefas de optimize lentas
Uma tarefa de optimize exige uso intensivo de CPU e disco. Ela compete por recursos com consultas simultâneas, portanto, pode ser executada lentamente sob carga elevada.
Falha no merge de chave primária após optimize
Um primary key merge deve atender aos dois pré-requisitos a seguir para funcionar corretamente.
A chave
ORDER BYdeve incluir apartition keydastorage table. Umprimary key mergenão ocorre entre partições diferentes.Para uma
distributed table, a chaveORDER BYdeve incluir a chave de sharding, determinada pelohash algorithm. Umprimary key mergenão ocorre entre nós diferentes.
A tabela a seguir descreve comandos comuns de optimize e seus comportamentos.
Comando | Descrição |
| Este comando tenta selecionar e mesclar |
| Este comando visa uma Nota Para tabelas sem uma |
| Este comando força um merge de todas as partições na tabela. Ele remescla partições mesmo que elas já consistam em um único |
Para qualquer um desses comandos de optimize, você pode definir o parâmetro optimize_throw_if_noop. Se esse parâmetro estiver ativado, o comando lançará uma exceção caso não realize nenhum merge, permitindo que você determine se a tarefa foi realmente executada.
TTL de dados ineficaz após optimize
A seguir estão as causas comuns e suas soluções.
-
Causa 1: A evicção de dados por TTL ocorre durante a fase de merge de chave primária. Se uma parte de dados não for mesclada por um longo período, o sistema não conseguirá evictar os dados expirados contidos nela.
Solução:
Acione manualmente uma tarefa de merge executando
optimize finalouoptimize a specific partition.Ao criar uma tabela, defina parâmetros como merge_with_ttl_timeout e ttl_only_drop_parts para mesclar partes de dados que contenham dados expirados com maior frequência.
-
Causa 2: Se o TTL de uma tabela for modificado ou adicionado, as partes de dados existentes podem ter informações de TTL ausentes ou incorretas. Isso também pode impedir a evicção de dados expirados.
Solução:
Regenere as informações de TTL executando
alter table materialize ttl.Atualize as informações de TTL executando
optimize partition.
Atualizações e exclusões não surtem efeito após OPTIMIZE
O ApsaraDB for ClickHouse executa operações de atualização e exclusão de forma assíncrona. Monitore o progresso consultando a tabela de sistema system.mutations.
Adicionar, excluir ou modificar colunas com DDL
Para modificar uma tabela local, execute uma instrução DDL. Para uma tabela distribuída, o procedimento depende se há dados sendo gravados nela no momento.
Se nenhum dado estiver sendo gravado na tabela, modifique primeiro a tabela local e, em seguida, a tabela distribuída.
-
Se houver dados sendo gravados na tabela, o procedimento dependerá do tipo de modificação.
Tipo
Ações
Adicionar uma coluna anulável
Modifique a tabela local.
Modifique a tabela distribuída.
Modificar o tipo de dados de uma coluna (para um tipo conversível)
Excluir uma coluna anulável
Modifique a tabela distribuída.
Modifique a tabela local.
Adicionar uma coluna não anulável
Interrompa a gravação de dados.
Execute
SYSTEM FLUSH DISTRIBUTEDna tabela distribuída.Modifique a tabela local.
Modifique a tabela distribuída.
Retome a gravação de dados.
Excluir uma coluna não anulável
Renomear uma coluna
Operações DDL lentas ou travadas
A execução global de DDL é sequencial, e consultas complexas podem causar deadlocks.
Experimente estas soluções:
Aguarde a conclusão da operação.
Tente encerrar a consulta no console.
Erro de tempo limite de tarefa DDL distribuída
Modifique o tempo limite padrão executando set global on cluster default distributed_ddl_task_timeout=xxx, onde xxx é o tempo limite em segundos. Modify cluster parameters.
Erro de sintaxe: "set global on cluster default"
-
Causa 1: O cliente ClickHouse analisa a sintaxe. No entanto,
set global on cluster defaulté uma sintaxe do lado do servidor. Se a versão do cliente for incompatível com o servidor, o cliente bloqueará essa instrução.Solução:
Use uma ferramenta que não realize análise de sintaxe no lado do cliente. Exemplos incluem ferramentas baseadas em JDBC, como DataGrip e DBeaver.
Escreva um programa JDBC para executar a instrução.
-
Causa 2: Na instrução
set global on cluster default key = value;, ovalueé uma string, mas não está entre aspas.Solução: Coloque o valor da string entre aspas.
Ferramenta de BI recomendada
Recomendamos o Quick BI.
IDEs recomendadas para consulta de dados
DataGrip, DBeaver.
Suporte à busca vetorial
Sim. O ApsaraDB for ClickHouse oferece suporte à busca vetorial. Recursos relevantes:
Resolver o erro ON CLUSTER is not allowed for Replicated database
Se o seu cluster for da Enterprise Edition e a instrução de criação de tabela incluir ON CLUSTER default, você poderá encontrar o erro ON CLUSTER is not allowed for Replicated database. Isso ocorre em algumas versões menores. Atualize sua instância para a versão mais recente. Upgrade minor engine versions.
Resolver o erro Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny')
Problema: Se você usar um cluster Community Edition com vários nós, poderá encontrar o erro Exception: Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny'). quando uma consulta usar JOIN ou IN para unir várias tabelas distribuídas.
Causa: Quando uma consulta une várias tabelas distribuídas, pode ocorrer amplificação de consulta. Por exemplo, em um cluster de três nós, uma consulta de junção entre duas tabelas distribuídas se expande em 3 x 3 subconsultas nas tabelas locais subjacentes. Isso consome recursos significativos e aumenta a latência. Para evitar isso, o sistema bloqueia essas consultas por padrão.
Como funciona: Ao substituir o operador IN ou JOIN por GLOBAL IN ou GLOBAL JOIN, você instrui o mecanismo a executar a subconsulta do lado direito em um único nó. O resultado é armazenado em uma tabela temporária, que é então transmitida para todos os outros nós para concluir a junção localmente.
Impacto do uso de GLOBAL IN ou GLOBAL JOIN:
A tabela temporária é enviada para todos os servidores remotos. Evite essa estratégia para grandes conjuntos de dados.
-
Usar
GLOBAL INouGLOBAL JOINcom a funçãoremote()pode produzir resultados incorretos. Isso acontece porque a subconsulta, que deveria ser executada na instância externa, é executada na instância atual.Por exemplo, você executa a seguinte instrução em
instance_apara consultar dados da instância externacc-bp1wc089c****.SELECT * FROM remote('cc-bp1wc089c****.clickhouse.ads.aliyuncs.com:3306', `default`, test_tbl_distributed1, '<your_Account>', '<YOUR_PASSWORD>') WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);Nesse caso,
instance_aexecuta a subconsultaSELECT id FROM test_tbl_distributed1para gerar uma tabela temporária, vamos chamá-la detemp_table_A. Os dados detemp_table_Asão então enviados para a instância externacc-bp1wc089c****para a consulta final. A instância externacc-bp1wc089c****acaba executando a instruçãoSELECT * FROM default.test_tbl_distributed1 WHERE id IN (temp_table_A);.O problema surge da origem dos dados na tabela temporária.
Com base na descrição acima, a instrução final executada pela instância
cc-bp1wc089c****éSELECT * FROM default.test_tbl_distributed1 WHERE id IN (temporary table A);. No entanto, o conjunto de condições definido na tabela temporária A foi gerado na instância a. Neste exemplo, a instânciacc-bp1wc089c****deveria ter executadoSELECT * FROM default.test_tbl_distributed1 WHERE id IN (SELECT id FROM test_tbl_distributed1 );, e o conjunto de condições deveria ter se originado da instânciacc-bp1wc089c****. Portanto, o uso de GLOBAL IN ou GLOBAL JOIN faz com que a subconsulta recupere o conjunto de condições de uma fonte incorreta, o que leva a um resultado incorreto.
Soluções:
Solução 1: Modifique o código SQL da sua aplicação para substituir manualmente IN ou JOIN por GLOBAL IN ou GLOBAL JOIN.
Por exemplo, altere esta instrução:
SELECT * FROM test_tbl_distributed WHERE id IN (SELECT id FROM test_tbl_distributed1);
para:
SELECT * FROM test_tbl_distributed WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);
Solução 2: Modifique o parâmetro de sistema distributed_product_mode ou prefer_global_in_and_join para que o sistema converta automaticamente IN ou JOIN em GLOBAL IN ou GLOBAL JOIN.
distributed_product_mode
Execute a seguinte instrução para definir distributed_product_mode como global. Essa configuração converte automaticamente operações padrão de IN ou JOIN em GLOBAL IN ou GLOBAL JOIN quando necessário.
SET GLOBAL ON cluster default distributed_product_mode='global';
Uso
Finalidade: Controla como o ClickHouse lida com subconsultas distribuídas.
-
Valores:
deny(padrão): Proíbe subconsultas distribuídas deINeJOINe lança a exceção"Double-distributed IN/JOIN subqueries is denied".local: Reescreve a subconsulta para usar a tabela local no shard de destino, preservando um operador padrão deINouJOIN.global: Converte consultas deINouJOINem consultas deGLOBAL INouGLOBAL JOIN.allow: Permite subconsultas padrão deINeJOIN, o que pode causar amplificação de consulta.
Cenários aplicáveis: Aplica-se apenas a consultas que usam
INouJOINpara unir várias tabelas distribuídas.
prefer_global_in_and_join
prefer_global_in_and_join
Execute a seguinte instrução para definir o parâmetro prefer_global_in_and_join como 1. Essa configuração converte automaticamente operações padrão de IN ou JOIN em GLOBAL IN ou GLOBAL JOIN.
SET GLOBAL ON cluster default prefer_global_in_and_join = 1;
Uso
Finalidade: Controla o comportamento dos operadores
INeJOIN.-
Valores:
0(padrão): Proíbe subconsultas distribuídas deINeJOINe lança a exceção"Double-distributed IN/JOIN subqueries is denied".1: Habilita subconsultas distribuídas deINeJOINconvertendo-as automaticamente em consultas deGLOBAL INouGLOBAL JOIN.
Cenários aplicáveis: Aplica-se apenas a consultas que usam
INouJOINpara unir várias tabelas distribuídas.
Visualizar espaço em disco da tabela
Para visualizar o espaço em disco usado por cada tabela, execute a seguinte consulta.
SELECT table, formatReadableSize(sum(bytes)) as size, min(min_date) as min_date, max(max_date) as max_date FROM system.parts WHERE active GROUP BY table;
Visualizar tamanho dos dados frios
A seguir está um exemplo de consulta:
SELECT * FROM system.disks;
Consultar dados no cold storage
Utilize a seguinte consulta:
SELECT * FROM system.parts WHERE disk_name = 'cold_disk';
Mover dados de partição para o cold storage
Para mover uma partição de dados para o cold storage, execute a seguinte instrução:
ALTER TABLE table_name MOVE PARTITION partition_expr TO DISK 'cold_disk';
Lacunas nos dados de monitoramento
As causas mais comuns incluem:
Uma consulta que aciona um erro OOM.
Reinicialização da instância provocada por uma alteração de configuração.
Reinício da instância após um upgrade ou downgrade.
Upgrade suave sem migração de dados
O suporte a upgrades suaves em um cluster ClickHouse depende da data de criação. Clusters adquiridos após 1º de dezembro de 2021 permitem upgrade in-place sem migração de dados. Já os clusters comprados antes dessa data exigem a migração dos dados. Upgrade the major engine version.
Tabelas de sistema comuns
A tabela a seguir descreve as tabelas de sistema mais utilizadas e suas funções.
|
Parâmetro |
Descrição |
|
system.processes |
Contém informações sobre instruções SQL em execução no momento. |
|
system.query_log |
Armazena o log de instruções SQL executadas. |
|
system.merges |
Apresenta detalhes sobre operações de merge no cluster. |
|
system.mutations |
Fornece informações sobre operações de mutação no cluster. |
Modificar parâmetros no nível do sistema
Os parâmetros no nível do sistema correspondem às configurações no arquivo config.xml. Para modificá-los:
Faça login no console do ApsaraDB for ClickHouse.
Na página Clusters, selecione Clusters of Community-compatible Edition e clique no ID do cluster desejado.
No painel de navegação à esquerda, clique em Parameter Configuration.
Na página Parameter Configuration, clique no ícone de edição na coluna Parameter Value referente ao parâmetro
max_concurrent_queries.Insira o novo valor na caixa de diálogo e clique em OK.
Clique em Submit Parameters.
Clique em OK.
Após clicar em OK, o processo clickhouse-server é reiniciado automaticamente, causando uma desconexão transitória de aproximadamente 1 minuto.
Modificar parâmetros no nível do usuário
Os parâmetros no nível do usuário correspondem aos itens de configuração no arquivo users.xml. Para alterar um parâmetro, execute a instrução abaixo.
SET global ON cluster default ${key}=${value};
Salvo especificação em contrário, a alteração entra em vigor imediatamente.
Modificar cota
Especifique o parâmetro de cota nas settings de uma instrução de execução:
settings max_memory_usage = XXX;
Variação no uso de CPU e memória entre nós
Em um cluster multi-node com dual-replica ou single-replica, o write node apresenta maior CPU usage e memory usage em comparação aos demais node s durante write operation s intensivas. O uso se equilibra entre os node s assim que os dados são sincronizados.
Visualizar logs detalhados do sistema
-
Descrição do problema:
Como visualizar logs detalhados do sistema para solucionar erros ou identificar possíveis problemas.
-
Solução:
-
Verifique o parâmetro
text_log.leveldo seu cluster e adote uma das medidas a seguir:Se
text_log.levelestiver vazio, o log de texto está desativado. Para ativá-lo, defina um valor para esse parâmetro.Caso
text_log.leveljá possua um valor, verifique se o nível de log atende aos seus requisitos. Se não atender, modifique o parâmetro para o nível desejado.
Conecte-se ao banco de dados alvo. Connect to a database.
-
Execute a instrução a seguir para visualizar e analisar os logs.
SELECT * FROM system.text_log;
-
Resolver problemas de conectividade de rede
Se o cluster de destino e a fonte de dados estiverem na mesma VPC e região, verifique se o endereço IP de cada um consta na lista de permissões do outro.
Para configurar a lista de permissões do ClickHouse, consulte Set a Whitelist.
Para outras fontes de dados, consulte a documentação específica de cada produto.
Caso as condições acima não sejam atendidas, estabeleça primeiro a conectividade usando uma solução de rede adequada. Em seguida, adicione o endereço IP de cada recurso à lista de permissões do outro.
|
Cenário |
Solução |
|
Conectividade em cloud híbrida |
|
|
Conectividade VPC entre regiões e contas diferentes |
|
|
Conectividade na mesma região com VPCs distintas |
Use Cloud Enterprise Network to Achieve Same-region VPC Connectivity (Basic Edition) |
|
Conectividade VPC entre regiões e contas diferentes |
|
|
Conectividade via rede pública |
|
|
Conflito de endereços |
Migração da Community para a Enterprise Edition
Sim, é possível migrar um cluster ClickHouse Community Edition para um cluster Enterprise Edition.
A migração de dados entre clusters Enterprise Edition e Community Edition pode ser feita utilizando a função remote ou por meio da exportação e importação de arquivos de dados. Migrate data from a self-managed ClickHouse cluster to Alibaba Cloud ClickHouse Community-Compatible Edition.
Schemas inconsistentes durante a migração de dados
Descrição do problema
A migração de dados exige schemas de banco de dados e tabelas consistentes em todos os shards. Caso contrário, a migração de alguns bancos de dados ou tabelas pode falhar.
Soluções
-
O schema de uma tabela MergeTree (que não seja uma tabela interna de uma materialized view) está inconsistente entre os shards.
Investigue se a lógica de negócio está causando as discrepâncias de schema entre os shards:
Se você espera que os schemas das tabelas sejam idênticos em todos os shards, recrie as tabelas para garantir a consistência.
Caso sua lógica de negócio utilize intencionalmente schemas de tabela diferentes entre os shards, Submit a ticket para entrar em contato com o suporte técnico e obter assistência.
-
A tabela interna de uma materialized view apresenta inconsistências entre os shards.
-
Solução 1: Renomeie as tabelas internas e aponte explicitamente a materialized view e a tabela distribuída para a tabela MergeTree de destino. O procedimento abaixo utiliza a materialized view original
up_down_votes_per_day_mvcomo exemplo.-
Liste as tabelas que não estão presentes em todos os nós.
NODE_NUM= Número de shards × Número de réplicas.SELECT database,table,any(create_table_query) AS sql,count() AS cnt FROM cluster(default, system.tables) WHERE database NOT IN ('system', 'information_schema', 'INFORMATION_SCHEMA') GROUP BY database, table HAVING cnt != <NODE_NUM>; -
Identifique as materialized views que possuem um número incorreto de tabelas internas.
SELECT substring(hostName(),38,8) AS host,* FROM cluster(default, system.tables) WHERE uuid IN (<UUID1>, <UUID2>, ...); -
Desative o comportamento padrão de sincronização do cluster. Esta etapa é obrigatória para clusters ApsaraDB for ClickHouse, mas não é necessária para clusters ClickHouse autogerenciados. Em seguida, renomeie a tabela interna para assegurar a consistência em todos os nós. Para reduzir riscos operacionais, obtain the IP address of each node, conecte-se à porta 3005 e execute as instruções a seguir individualmente em cada nó.
SELECT count() FROM mv_test.up_down_votes_per_day_mv; SET enforce_on_cluster_default_for_ddl=0; RENAME TABLE `mv_test`.`.inner_id.9b40675b-3d72-4631-a26d-25459250****` TO `mv_test`.`up_down_votes_per_day`; -
Remova a materialized view. Execute as instruções abaixo individualmente em cada nó.
SELECT count() FROM mv_test.up_down_votes_per_day_mv; SET enforce_on_cluster_default_for_ddl=0; DROP TABLE mv_test.up_down_votes_per_day_mv; -
Crie uma nova materialized view que aponte explicitamente para a tabela interna renomeada. Execute as instruções a seguir individualmente em cada nó.
SELECT count() FROM mv_test.up_down_votes_per_day_mv; SET enforce_on_cluster_default_for_ddl=0; CREATE MATERIALIZED VIEW mv_test.up_down_votes_per_day_mv TO `mv_test`.`up_down_votes_per_day` ( `Day` Date, `UpVotes` UInt32, `DownVotes` UInt32 ) AS SELECT toStartOfDay(CreationDate) AS Day, countIf(VoteTypeId = 2) AS UpVotes, countIf(VoteTypeId = 3) AS DownVotes FROM mv_test.votes GROUP BY Day;Nota: É necessário definir explicitamente as colunas da tabela de destino na definição da materialized view. Não dependa da inferência de tipos da instrução SELECT, pois isso pode causar erros inesperados. Por exemplo, se uma coluna chamada
tcp_cnfor calculada usando uma função de estado de agregação comosumIfStatena instruçãoSELECT, você deve definir seu tipo na tabela de destino como AggregateFunction, tal comoAggregateFunction(sum, Float64).Uso correto
CREATE MATERIALIZED VIEW net_obs.public_flow_2tuple_1m_local TO net_obs.public_flow_2tuple_1m_local_inner ( ... tcp_cnt AggregateFunction(sum, Float64), ) AS SELECT ... sumIfState(pkt_cnt, protocol = '6') AS tcp_cnt, FROM net_obs.public_flow_5tuple_1m_local ...Uso incorreto
CREATE MATERIALIZED VIEW net_obs.public_flow_2tuple_1m_local TO net_obs.public_flow_2tuple_1m_local_inner AS SELECT ... sumIfState(pkt_cnt, protocol = '6') AS tcp_cnt, FROM net_obs.public_flow_5tuple_1m_local ...
-
Solução 2: Renomeie as tabelas internas, reconstrua as materialized views em todos os nós e, em seguida, migre os dados das tabelas internas antigas.
Solução 3: Implemente uma estratégia de escrita dupla para as materialized views e aguarde 7 dias para que os dados sejam sincronizados.
-
Falha em instruções SQL na Enterprise Edition 24.5 ou superior
Por padrão, instâncias da Enterprise Edition 24.5 ou superior utilizam o novo analisador de consultas. Esse analisador oferece melhor desempenho, mas pode não ser compatível com versões anteriores de algumas instruções SQL legadas. Se você encontrar um erro de parsing, reverta para o analisador legado. Saiba mais sobre o novo analisador.
SET allow_experimental_analyzer = 0;
Suspender um cluster
O recurso de suspensão está disponível apenas para clusters Enterprise Edition. Clusters ClickHouse Community Edition não podem ser suspensos. Para suspender um cluster Enterprise Edition, acesse a página Enterprise Edition Clusters. Selecione a região desejada no canto superior esquerdo. Na lista de clusters, localize o cluster alvo e clique em
> Suspend na coluna Actions.
Converter uma tabela MergeTree para ReplicatedMergeTree
Descrição do problema
Usuários sem familiaridade com o ClickHouse podem criar tabelas com o engine MergeTree equivocadamente em um cluster de múltiplas réplicas. Isso impede a sincronização de dados entre os nós de réplica de cada shard. Consequentemente, consultas na tabela distribuída correspondente podem retornar resultados inconsistentes. Para resolver esse problema, converta a tabela MergeTree em uma tabela ReplicatedMergeTree.
Solução
O ClickHouse não fornece uma instrução DDL para alterar diretamente o engine de armazenamento de uma tabela. Para converter uma tabela MergeTree em ReplicatedMergeTree, crie uma nova tabela com o engine ReplicatedMergeTree e importe os dados da tabela original.
Por exemplo, suponha que você tenha uma tabela MergeTree chamada table_src e sua respectiva tabela distribuída chamada table_src_d em um cluster de múltiplas réplicas. Para converter essa tabela MergeTree em ReplicatedMergeTree, siga estas etapas:
Crie a tabela ReplicatedMergeTree de destino,
table_dst, e sua tabela distribuída correspondente,table_dst_d. CREATE TABLE.Importe os dados da tabela MergeTree
table_srcparatable_dst_d. Utilize um dos dois métodos a seguir.
Ambos os métodos consultam os dados de origem na tabela MergeTree local.
Se o volume de dados for pequeno, insira os dados diretamente na tabela distribuída
table_dst_dpara distribuí-los uniformemente.Caso os dados na tabela MergeTree original
table_srcjá estejam balanceados entre todos os nós e o volume seja grande, insira os dados diretamente na tabela ReplicatedMergeTree localtable_dstem cada nó.Para conjuntos de dados grandes, o processo de importação pode levar bastante tempo. Ao utilizar a função
remote(), configure um valor de timeout adequado.
Usar a função remote
-
Obtenha o endereço IP de cada nó.
SELECT cluster, shard_num, replica_num, is_local, host_address FROM system.clusters WHERE cluster = 'default'; -
Importe os dados utilizando a função remote.
Passe sequencialmente os endereços IP obtidos na etapa anterior para a função
remote()e execute a instrução para cada um deles.INSERT INTO table_dst_d SELECT * FROM remote('node1', db.table_src) ;Por exemplo, se os endereços IP de dois nós forem
10.10.0.165e10.10.0.167, execute as seguintes instruçõesINSERTseparadamente:INSERT INTO table_dst_d SELECT * FROM remote('10.10.0.167', default.table_src) ; INSERT INTO table_dst_d SELECT * FROM remote('10.10.0.165', default.table_src) ;Executar as instruções para todos os endereços IP dos nós converte a tabela MergeTree em uma tabela ReplicatedMergeTree.
Usar tabelas locais
Se você tiver uma instância ECS com o cliente ClickHouse instalado em sua VPC, faça login em cada nó separadamente para realizar as operações a seguir.
-
Obtenha o endereço IP de cada nó.
SELECT cluster, shard_num, replica_num, is_local, host_address FROM system.clusters WHERE cluster = 'default'; -
Importe os dados.
Faça login em cada nó sequencialmente usando seu endereço IP e execute a instrução abaixo.
INSERT INTO table_dst_d SELECT * FROM db.table_src ;Executar a instrução em todos os nós converte a tabela MergeTree em uma tabela ReplicatedMergeTree.
Executar múltiplas instruções SQL na mesma sessão
Definir um session_id exclusivo garante que o servidor ClickHouse mantenha um contexto consistente para requisições com o mesmo session ID. Isso permite executar várias instruções SQL em uma única sessão. Este exemplo demonstra como fazer isso com o ClickHouse Java Client (V2).
-
Adicione a dependência ao arquivo pom.xml do seu projeto Maven.
<dependency> <groupId>com.clickhouse</groupId> <artifactId>client-v2</artifactId> <version>0.8.2</version> </dependency> -
Defina um
session IDpersonalizado em CommandSettings.package org.example; import com.clickhouse.client.api.Client; import com.clickhouse.client.api.command.CommandSettings; public class Main { public static void main(String[] args) { Client client = new Client.Builder() .addEndpoint("endpoint") // Instance endpoint .setUsername("username") // Username .setPassword("password") // Password .build(); try { client.ping(10); CommandSettings commandSettings = new CommandSettings(); // Set the session_id commandSettings.serverSetting("session_id","examplesessionid"); // Set the max_block_size parameter for the session client.execute("SET max_block_size=65409 ",commandSettings); // Execute the queries client.execute("SELECT 1 ",commandSettings); client.execute("SELECT 2 ",commandSettings); } catch (Exception e) { throw new RuntimeException(e); } finally { client.close(); } } }
Neste exemplo, ambas as instruções SELECT são executadas na mesma sessão com max_block_size definido como 65409. ClickHouse Java Client: Java Client | ClickHouse Docs.
Por que a deduplicação com FINAL falha ao usar JOIN
Sintoma
Ao utilizar a palavra-chave FINAL para deduplicar resultados de consulta, a operação falha se a instrução SQL contiver uma cláusula JOIN. Consequentemente, dados duplicados permanecem na saída. Veja abaixo um exemplo de instrução SQL:
SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;
Causa
Trata-se de um bug conhecido e ainda não corrigido no ClickHouse. A deduplicação falha devido a um conflito entre a lógica de execução do FINAL e do JOIN. ClickHouse issue #8655.
Solução
-
Solução 1 (Recomendada): Ative o otimizador experimental. Habilite o
FINALno nível da consulta adicionando uma configuração à sua query. Esse método dispensa a declaração no nível da tabela. Exemplo:Se a instrução SQL original for:
SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;Remova a palavra-chave
FINALdo nome da tabela e anexe as configurações allow_experimental_analyzer = 1,FINAL = 1 à instrução. A instrução revisada fica assim:SELECT * FROM t1 JOIN t2 WHERE xxx SETTINGS allow_experimental_analyzer = 1, FINAL = 1;ImportanteO parâmetro
allow_experimental_analyzeré suportado apenas nas versões 23.8 e posteriores. Caso utilize uma versão anterior, faça o upgrade antes de modificar a instrução SQL. Upgrade a major engine version. -
Solução 2 (Use com cautela):
Force uma mesclagem para deduplicação executando periodicamente
OPTIMIZE TABLE local_table_name FINAL. Isso mescla os dados antecipadamente, mas deve ser usado com cautela em tabelas grandes, pois gera alta sobrecarga de I/O.Modifique a consulta SQL: Remova a palavra-chave
FINAL. A deduplicação de dados passará a depender da consulta aos dados já mesclados.
ImportanteUtilize esta abordagem com cautela, pois a operação consome recursos significativos de I/O e pode afetar o desempenho de tabelas grandes.
Por que as operações DELETE ou UPDATE ficam incompletas?
Sintoma
Ao executar operações de exclusão (DELETE) ou atualização (UPDATE) de dados em um cluster do ApsaraDB for ClickHouse Community-compatible Edition, as tarefas permanecem incompletas por um longo período.
Causa
Diferentemente das operações síncronas do MySQL, as operações DELETE e UPDATE em um cluster do ApsaraDB for ClickHouse Community-compatible Edition são assíncronas e executadas com base no mecanismo de Mutation. Portanto, as alterações não entram em vigor em tempo real. O processo principal de uma Mutation é o seguinte:
Envio da tarefa: O usuário executa o comando
ALTER TABLE ... UPDATE/DELETEpara gerar uma tarefa assíncrona.Marcação de dados: O sistema cria um arquivo
mutation_*.txtem segundo plano para registrar o intervalo de dados a ser modificado. As alterações não são aplicadas imediatamente.Reescrita em segundo plano: O ClickHouse reescreve gradualmente a
data partafetada e aplica as alterações durante o processo de mesclagem.Limpeza de dados antigos: Após a conclusão da mesclagem, os blocos de dados antigos são marcados para exclusão.
Portanto, emitir muitas operações de Mutation em um curto período pode bloquear tarefas e deixar as operações DELETE e UPDATE incompletas. Para evitar acúmulo, execute a seguinte instrução SQL para verificar se há Mutations em execução antes de iniciar uma nova.
SELECT * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;
Solução
-
Verifique se há um número excessivo de tarefas de Mutation em execução no cluster.
Execute a seguinte instrução SQL para visualizar o status atual das Mutations no cluster:
SELECT * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0; -
Caso haja muitas tarefas de Mutation em execução, use uma conta privilegiada para cancelar algumas ou todas elas.
-
Cancele todas as tarefas de Mutation de uma única tabela.
KILL MUTATION WHERE database = 'default' AND table = '<table_name>' -
Cancele uma tarefa de Mutation específica.
KILL MUTATION WHERE database = 'default' AND table = '<table_name>' AND mutation_id = '<mutation_id>'Para obter o mutation_id, execute a seguinte instrução SQL:
SELECT mutation_id, * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;
-
Como resolver o erro "Code: 241. DB::Exception: Memory limit (total) exceeded" no ApsaraDB for ClickHouse Enterprise Edition?
-
Sintoma: Ao executar uma instrução SQL, você encontra a seguinte mensagem de erro, mesmo que a memória total do seu cluster exceda o limite de memória especificado na mensagem:
Code: 241. DB::Exception: Memory limit (total) exceeded: would use 115.28 GiB (attempt to allocate chunk of 133791376 bytes), maximum: 115.20 GiB. OvercommitTracker decision: Query was selected to stop by OvercommitTracker.: While executing AggregatingTransform. (MEMORY_LIMIT_EXCEEDED) (version 24.2.2.16476 (official build)) -
Causa: No ApsaraDB for ClickHouse Enterprise Edition, um único nó possui um limite de CCU (máximo de 32 CCUs, onde 1 CCU equivale aproximadamente a 1 vCore e 4 GiB de memória). Se uma única consulta SQL consumir mais memória do que o limiar do nó, o MemoryTracker intercepta a consulta. O limiar padrão é 0,9 vezes a memória total do nó. Execute a seguinte instrução SQL para consultar o limiar:
SELECT * FROM system.server_settings WHERE name = 'max_server_memory_usage_to_ram_ratio'; Solução: Defina o parâmetro allow_experimental_parallel_reading_from_replicas como 1. Isso distribui a fase de leitura de dados entre vários nós, diluindo o consumo de memória. Enterprise Edition.
Por que os resultados das consultas são inconsistentes?
Sintoma
Em um cluster do ApsaraDB for ClickHouse Community-compatible Edition, a execução da mesma instrução SQL várias vezes retorna resultados inconsistentes.
Causa
Resultados inconsistentes para a mesma consulta em um cluster do ApsaraDB for ClickHouse Community-compatible Edition podem ocorrer por dois motivos principais:
-
Consultas direcionadas a uma tabela local em um cluster multi-shard.
Em um cluster multi-shard do ApsaraDB for ClickHouse Community-compatible Edition, é necessário criar uma tabela distribuída além das tabelas locais. Nesses clusters, o processo de gravação de dados ocorre da seguinte forma:
Os dados são primeiramente gravados na tabela distribuída, que então os distribui para tabelas locais em diferentes shards para armazenamento.
Ao consultar dados, a fonte varia conforme o tipo de tabela consultada:
Consulta a uma tabela distribuída: A tabela distribuída agrega e retorna dados das tabelas locais de todos os shards.
Consulta a uma tabela local: Cada consulta retorna dados da tabela local de um shard selecionado aleatoriamente, o que causa resultados inconsistentes.
-
Uma tabela em um cluster de duas réplicas não foi criada com um motor da série Replicated*.
Em um cluster de duas réplicas do ApsaraDB for ClickHouse Community-compatible Edition, as tabelas devem ser criadas com um motor da série Replicated*, como o motor ReplicatedMergeTree, para permitir a sincronização de dados entre réplicas.
Se uma tabela em um cluster de duas réplicas for criada sem um motor da série Replicated*, os dados não serão sincronizados entre as réplicas, o que pode causar resultados de consulta inconsistentes.
Solução
-
Identifique o tipo de cluster.
Verifique as informações do cluster para determinar se ele é um cluster multi-shard, de duas réplicas ou multi-shard com duas réplicas. Siga estas etapas:
Faça login no console do ApsaraDB for ClickHouse.
No canto superior esquerdo da página, selecione Clusters of Community-compatible Edition.
-
Na lista de clusters, clique no ID do cluster desejado para abrir a página de informações do cluster.
Visualize a Edition na seção Cluster Properties e os Node Groups na seção Configuration Information. Determine o tipo de cluster com base nas seguintes propriedades:
Se o número de grupos de nós for maior que 1, o cluster é multi-shard.
Se a série for High-availability Edition, o cluster é de duas réplicas.
Se ambas as condições forem atendidas, o cluster é multi-shard com duas réplicas.
-
Escolha uma solução conforme o tipo de cluster.
Cluster multi-shard
Verifique o tipo da tabela consultada. Se for uma tabela local, consulte a tabela distribuída em seu lugar.
Caso não exista uma tabela distribuída, crie uma. Create a table.
Cluster de duas réplicas
Verifique a instrução
CREATE TABLEda tabela alvo. Se o motor não for da sérieReplicated*, recrie a tabela. Create a table.Cluster multi-shard com duas réplicas
Verifique o tipo da tabela consultada.
Se for uma tabela local, consulte a tabela distribuída. Caso não exista uma tabela distribuída, crie uma.
Se estiver consultando uma tabela distribuída, verifique se o motor da tabela local correspondente é da série
Replicated*. Caso contrário, recrie a tabela local com um motor da sérieReplicated*. Create a table.
Por que o ReplacingMergeTree falha na deduplicação após uma mesclagem forçada?
Sintoma
O motor ReplacingMergeTree no ClickHouse deduplica dados com a mesma chave primária durante o processo de mesclagem de dados. No entanto, após forçar uma mesclagem de dados executando o comando abaixo, dados duplicados com a mesma chave primária ainda podem existir:
optimize TABLE <table_name> FINAL ON cluster default;
Causa
O motor ReplacingMergeTree deduplica dados apenas em um único nó. Se dados com a mesma chave primária forem distribuídos para nós diferentes porque a expressão sharding_key não foi especificada explicitamente (por padrão, os dados são alocados aleatoriamente usando a função rand()), o motor não consegue deduplicar os dados em todo o cluster.
Solução
Recrie a tabela local e a tabela distribuída. Ao criar a tabela distribuída, defina a expressão sharding_key como a chave primária da tabela local. CREATE TABLE.
É obrigatório recriar tanto a tabela distribuída quanto a tabela local. Recriar apenas a tabela distribuída afeta somente novos dados, deixando os dados existentes não deduplicados.