Todos os produtos
Search
Central de documentação

ApsaraDB for ClickHouse:Perguntas frequentes

Última atualização: Oct 09, 2026

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.

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 ping para testar o alcance da rede e telnet para 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
    = : %3d

    Por 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-number falha.

  • 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:

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 batch grande e um número reduzido de concurrent operations. Um único batch pode 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 operations como 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 group do DataWorks. As instâncias ECS no exclusive resource group podem estar subdimensionadas. CPU ou memória insuficientes limitam o número de concurrent operations e a network egress bandwidth disponível. Da mesma forma, definir um tamanho de batch grande 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 ECS nos 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 totalWaitReaderTime e totalWaitWriterTime. Se totalWaitReaderTime for significativamente maior que totalWaitWriterTime, o gargalo está na leitura (na data source), e não na escrita.

  • Causa 4: Uso de um public network endpoint. Um public network endpoint possui 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 um batch. No entanto, se houver dirty data, a escrita do batch atual falha. O DataX então recorre ao modo de inserção linha a linha. Essa alternativa gera um excesso de data parts e 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 indica dirty 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 por batch cair para 1, é muito provável que o DataX tenha encontrado dirty data e 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 data da data source.

Divergência na contagem de linhas após importação do Hive

Realize as verificações a seguir:

  1. Consulte a tabela de sistema query_log em busca de erros durante a importação. A presença de erros geralmente indica perda de dados.

  2. 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.

  3. 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:

  1. Analise a tabela de sistema query_log para identificar erros ocorridos durante a importação. Se houver erros, pode ter havido perda de dados.

  2. 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.

  3. Verifique se o parâmetro kafka_skip_broken_messages está 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:

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.

  1. Exclua a tabela que parou de sincronizar.

    DROP TABLE <table_name> ON cluster default;
    Nota

    Neste 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.

  2. Reinicie o processo de sincronização.

    ALTER database <database_name> ON cluster default MODIFY SETTING skip_unsupported_tables = 1;
    Nota

    Neste 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_block conforme 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;
    Nota

    A 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

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.

Nota

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:

  1. Faça login no console do ApsaraDB for ClickHouse.

  2. Na página Clusters, selecione Clusters of Community-compatible Edition e clique no ID do cluster desejado.

  3. No painel de navegação à esquerda, clique em Parameter Configuration.

  4. Na página Parameter Configuration, clique no ícone de edição na coluna Parameter Value referente ao parâmetro max_concurrent_queries.

  5. Insira o novo valor na caixa de diálogo e clique em OK.

  6. Clique em Submit Parameters.

  7. 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 table em 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:

    1. Ao criar uma tabela, use a instrução create table <table_name> on cluster default. A cláusula on cluster default transmite 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();
    2. 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}') ou ReplicatedMergeTree() para configurar o mecanismo ReplicatedMergeTree. Os argumentos em ReplicatedMergeTree('/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.

Importante
  • 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.

Importante

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 INSERT devem 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 com insert_quorum = 2 falharã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

  1. 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.

  2. 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

      Importante

      Este comando verifica todos os dados existentes e pode gerar uma alta carga de recursos. Use-o com cautela.

      ALTER TABLE $table_name MATERIALIZE TTL;
  3. Analise a estratégia de limpeza de partições.

    Quando o parâmetro ttl_only_drop_parts está 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_parts

      SELECT * 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.

  4. 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';
      Nota

      A 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.

  5. 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) e background_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 BackgroundPoolTask indica 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_pool conforme 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âmetro background_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âmetro background_pool_size, mas é obrigatório reiniciá-lo ao diminuir o parâmetro background_pool_size.

  6. 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.

  7. 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.

  8. 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 BY deve incluir a partition key da storage table. Um primary key merge não ocorre entre partições diferentes.

  • Para uma distributed table, a chave ORDER BY deve incluir a chave de sharding, determinada pelo hash algorithm. Um primary key merge não ocorre entre nós diferentes.

A tabela a seguir descreve comandos comuns de optimize e seus comportamentos.

Comando

Descrição

optimize table test;

Este comando tenta selecionar e mesclar data parts do MergeTree, mas pode retornar sem executar nenhuma ação. Mesmo quando executado, não garante um primary key merge completo para todos os registros da tabela. Geralmente, não recomendamos o uso deste comando.

optimize table test partition tuple();

Este comando visa uma partition específica e mescla todos os seus data parts. Ele pode retornar sem executar nenhuma ação. Ao concluir a tarefa, consolida todos os dados dentro da partition especificada em um único data part, completando o primary key merge para aquela partition. No entanto, o merge não inclui dados gravados enquanto a tarefa está em execução. A tarefa não é executada novamente se a partition já consistir em um único data part.

Nota

Para tabelas sem uma partition key, a partition padrão é tuple().

optimize table test final;

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 data part. Isso é útil para forçar a exclusão de registros que excederam seu Time to Live (TTL). Esta operação é a que mais consome recursos e ainda pode retornar sem realizar um merge.

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 final ou optimize 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

    1. Modifique a tabela local.

    2. Modifique a tabela distribuída.

    Modificar o tipo de dados de uma coluna (para um tipo conversível)

    Excluir uma coluna anulável

    1. Modifique a tabela distribuída.

    2. Modifique a tabela local.

    Adicionar uma coluna não anulável

    1. Interrompa a gravação de dados.

    2. Execute SYSTEM FLUSH DISTRIBUTED na tabela distribuída.

    3. Modifique a tabela local.

    4. Modifique a tabela distribuída.

    5. 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;, o value é 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 IN ou GLOBAL JOIN com a função remote() 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_a para consultar dados da instância externa cc-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_a executa a subconsulta SELECT id FROM test_tbl_distributed1 para gerar uma tabela temporária, vamos chamá-la de temp_table_A. Os dados de temp_table_A são então enviados para a instância externa cc-bp1wc089c**** para a consulta final. A instância externa cc-bp1wc089c**** acaba executando a instrução SELECT * 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ância cc-bp1wc089c**** deveria ter executado SELECT * 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ância cc-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 de IN e JOIN e 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 de IN ou JOIN.

    • global: Converte consultas de IN ou JOIN em consultas de GLOBAL IN ou GLOBAL JOIN.

    • allow: Permite subconsultas padrão de IN e JOIN, o que pode causar amplificação de consulta.

  • Cenários aplicáveis: Aplica-se apenas a consultas que usam IN ou JOIN para 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 IN e JOIN.

  • Valores:

    • 0 (padrão): Proíbe subconsultas distribuídas de IN e JOIN e lança a exceção "Double-distributed IN/JOIN subqueries is denied".

    • 1: Habilita subconsultas distribuídas de IN e JOIN convertendo-as automaticamente em consultas de GLOBAL IN ou GLOBAL JOIN.

  • Cenários aplicáveis: Aplica-se apenas a consultas que usam IN ou JOIN para 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:

  1. Faça login no console do ApsaraDB for ClickHouse.

  2. Na página Clusters, selecione Clusters of Community-compatible Edition e clique no ID do cluster desejado.

  3. No painel de navegação à esquerda, clique em Parameter Configuration.

  4. Na página Parameter Configuration, clique no ícone de edição na coluna Parameter Value referente ao parâmetro max_concurrent_queries.

  5. Insira o novo valor na caixa de diálogo e clique em OK.

  6. Clique em Submit Parameters.

  7. 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:

    1. Verifique o parâmetro text_log.level do seu cluster e adote uma das medidas a seguir:

      1. Se text_log.level estiver vazio, o log de texto está desativado. Para ativá-lo, defina um valor para esse parâmetro.

      2. Caso text_log.level já 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.

      Configure config.xml parameters.

    2. Conecte-se ao banco de dados alvo. Connect to a database.

    3. 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

Network Interconnection Between On-Premises and Cloud

Conectividade VPC entre regiões e contas diferentes

Cross-account VPC-to-VPC Connection

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

Use Cloud Enterprise Network to Achieve Cross-region and Cross-account VPC-to-VPC Connection (Basic Edition)

Conectividade via rede pública

Use Internet NAT Gateway SNAT to Access the Internet

Conflito de endereços

Use VPC NAT Gateway to Resolve Address Conflicts

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_mv como exemplo.

      1. 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>;
      2. 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>, ...);
      3. 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`;
      4. 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;
      5. 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_cn for calculada usando uma função de estado de agregação como sumIfState na instrução SELECT, você deve definir seu tipo na tabela de destino como AggregateFunction, tal como AggregateFunction(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 image> 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:

  1. Crie a tabela ReplicatedMergeTree de destino, table_dst, e sua tabela distribuída correspondente, table_dst_d. CREATE TABLE.

  2. Importe os dados da tabela MergeTree table_src para table_dst_d. Utilize um dos dois métodos a seguir.

Nota
  • 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_d para distribuí-los uniformemente.

  • Caso os dados na tabela MergeTree original table_src já estejam balanceados entre todos os nós e o volume seja grande, insira os dados diretamente na tabela ReplicatedMergeTree local table_dst em 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

  1. Connect to ClickHouse through DMS.

  2. Obtenha o endereço IP de cada nó.

    SELECT 
        cluster,
        shard_num,
        replica_num,
        is_local,
        host_address
    FROM system.clusters
    WHERE cluster = 'default';
    
  3. 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.165 e 10.10.0.167, execute as seguintes instruções INSERT separadamente:

    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.

  1. Connect to ClickHouse using the command line interface.

  2. Obtenha o endereço IP de cada nó.

    SELECT 
        cluster,
        shard_num,
        replica_num,
        is_local,
        host_address
    FROM system.clusters
    WHERE cluster = 'default';
  3. 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).

  1. 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>
  2. Defina um session ID personalizado 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 FINAL no 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 FINAL do 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; 
    Importante

    O 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):

    1. 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.

    2. Modifique a consulta SQL: Remova a palavra-chave FINAL. A deduplicação de dados passará a depender da consulta aos dados já mesclados.

    Importante

    Utilize 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:

  1. Envio da tarefa: O usuário executa o comando ALTER TABLE ... UPDATE/DELETE para gerar uma tarefa assíncrona.

  2. Marcação de dados: O sistema cria um arquivo mutation_*.txt em segundo plano para registrar o intervalo de dados a ser modificado. As alterações não são aplicadas imediatamente.

  3. Reescrita em segundo plano: O ClickHouse reescreve gradualmente a data part afetada e aplica as alterações durante o processo de mesclagem.

  4. 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

  1. 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;
  2. 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

  1. 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:

    1. Faça login no console do ApsaraDB for ClickHouse.

    2. No canto superior esquerdo da página, selecione Clusters of Community-compatible Edition.

    3. 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.

  2. 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 TABLE da tabela alvo. Se o motor não for da série Replicated*, 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érie Replicated*. 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.

Importante

É 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.