Todos os produtos
Search
Central de documentação

ApsaraDB for ClickHouse:Perguntas frequentes

Última atualização: Sep 17, 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 de kernel LTS estáveis 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.

  • Uma instância mestre-réplica fornece um nó de réplica para cada nó de shard. Se um nó primário falhar, o nó de réplica correspondente garante a recuperação de desastres.

Erro de recursos insuficientes

Tente adquirir recursos em uma zona diferente 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 estiver com 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, se a tabela for criada com sucesso mas as consultas não retornarem dados, geralmente isso ocorre porque os dados no Kafka não conseguem ser analisados 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 soluções:

  • Causa: O ambiente de rede está configurado incorretamente. A conexão via 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 em atraso na sua conta Alibaba Cloud, a instância SLB pode ser suspensa, tornando sua instância 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, o Alibaba Cloud DMS e o 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 a 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 uma fila, um timeout indica que a tarefa ainda está na fila para 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 o 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 comando abaixo 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 o DataGrip. Este não é um parâmetro de sistema do ClickHouse, mas sim um parâmetro JDBC para o protocolo HTTP. 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 definir esse parâmetro, adicione a propriedade socket_timeout à string de conexão JDBC. O valor é especificado em milissegundos. Por 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. Essa falha 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. Se uma consulta de longa duração for executada, problemas de roteamento podem impedir a entrega dos pacotes de resposta ao cliente, fazendo com que ele trave.

      Assim como na resolução de problemas transitórios de conexão com uma 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á em execução.

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. Gerencie apenas os parâmetros distributed_ddl_task_timeout e max_execution_time. Defina-os usando o mesmo método descrito para o protocolo HTTP.

Resolver o erro "Connection refused (localhost:9000)"

  • Problema: Após criar um dicionário em uma instância 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ó, e 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 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 roda 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 abaixo para obter os endereços IP dos nós subjacentes. Em seguida, use um dos endereços IP obtidos para conectar-se à 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, execute uma das seguintes ações:

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 impõe limites internos para evitar essa situação. Se esse erro ocorrer, 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 sã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 com base nas 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 pelas 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: Mude 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 reverte para um modo de inserção linha a linha. Essa reversão 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 encontrar 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, isso indica fortemente que o DataX encontrou dirty data e alternou para o modo linha a linha.

      Execute a consulta SQL a seguir para verificar 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 a dirty data da data source.

Discrepância na contagem de linhas após importação do Hive

Realize as seguintes verificações:

  1. Verifique erros durante a importação na tabela de sistema query_log. Se houver erros, provavelmente ocorreu perda de dados.

  2. Confirme se o mecanismo da tabela suporta deduplicação. Por exemplo, ao usar o mecanismo de tabela ReplacingMergeTree, o número de linhas no ClickHouse pode ser menor que no Hive, pois esse mecanismo remove duplicatas.

  3. Valide a precisão da contagem de linhas na origem Hive, pois a contagem inicial da origem pode estar incorreta.

Discrepância na contagem de linhas entre ClickHouse e Kafka

Verifique os seguintes pontos:

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

  2. Verifique 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. Confira se o parâmetro kafka_skip_broken_messages está ativado na configuração da tabela externa do Kafka. Quando ativado, o ClickHouse ignora mensagens que falham na 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

Utilize 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 parou de sincronizar por um período prolongado, fazendo com que o log binário do MySQL expirasse e fosse removido.

Para resolver esse problema, 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 a tabela for distribuída, você deve excluir 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 valor padrão é 100. No ClickHouse, cada operação de escrita cria uma parte de dados. Uma partição pode conter uma ou mais partes de dados. Se uma instrução INSERT escrever dados em muitas partições distintas simultaneamente, ela gera partes de dados em excesso, o que pode sobrecarregar as operações de mesclagem e consulta. Para evitar degradação de desempenho, o ClickHouse impõe esse limite.

Para resolver esse problema, ajuste sua estratégia de particionamento ou modifique o parâmetro max_partitions_per_insert_block.

  • Ajuste o esquema da tabela, modifique o método de particionamento ou garanta que uma única operação de inserção não exceda o limite de partições.

  • Se o seu caso de uso exigir escrita em muitas partições simultaneamente, aumente o limite de max_partitions_per_insert_block com base no volume de dados. Use a sintaxe a seguir 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 de dados em massa, reverta o parâmetro para seu valor padrão.

Erro de limite de memória excedido para insert into select

Consultando o 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 rastreia o uso de memória em vários níveis. Para uma única consulta, um rastreador de memória agrega o uso de memória de todos os threads dessa consulta. Esse rastreador então reporta a um rastreador de memória global. A solução depende do erro específico encontrado.

  • Um erro com Memory limit (for query) significa que a consulta falhou porque consumiu memória excessiva, ultrapassando seu limite de 70% da capacidade total de memória da instância. Para resolver, realize 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 global de 90% da capacidade total de memória da instância. Esse erro pode resultar de alta concorrência de consultas ou de tarefas assíncronas em segundo plano intensivas em recursos, como tarefas de mesclagem de chave primária executadas após escritas de dados. Primeiro, tente reduzir a concorrência de consultas. Se o erro persistir, realize um upgrade vertical para aumentar a capacidade de 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 é executada em um nó. Ocorre um erro de memory limit se uma consulta utilizar 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, o que pode prevenir 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 se este parâmetro entra em vigor.

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 quando as escritas de dados cessaram

Descrição do problema: Ao consultar dados usando select count(*), apenas cerca de metade do total de dados é retornada, ou os resultados flutuam.

Considere as seguintes soluções:

  • Verifique se você está usando um cluster multi-nó. Em um cluster 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.

  • Verifique se você está usando um cluster mestre-réplica. Em um cluster mestre-réplica, utilize tabelas com um mecanismo da série Replicated para sincronizar dados entre réplicas. Caso contrário, cada consulta pode atingir uma réplica diferente, levando a resultados inconsistentes. 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 uma mensagem de sucesso, mas a tabela será criada apenas no servidor atualmente conectado. Ao conectar-se a um servidor diferente, a tabela não estará 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 que utilize 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 de tabela ReplicatedMergeTree é uma versão aprimorada do mecanismo MergeTree que fornece sincronização mestre-réplica. Em uma instância de réplica única, só é possível criar tabelas com o mecanismo MergeTree. Em uma instância mestre-réplica, você deve 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 de tabela 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 fuso horário 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. Isso frequentemente se deve a uma falha na análise dos dados. Se a consulta retornar resultados, verifique se os campos da tabela de destino (a tabela de armazenamento subjacente à tabela externa do Kafka) e da tabela externa do Kafka correspondem. 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 uma 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 da réplica 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 ApsaraDB for ClickHouse multi-nó, se sua aplicação se conectar ao banco de dados usando um 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 no cluster. O nó que recebe a solicitação escreve 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 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 um 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
  • Habilitar essa configuração aumenta o tempo de execução das instruções INSERT, pois a operação deve 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 essa configuração em uma única consulta. Após verificar 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 do 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 ser executada em modo síncrono. A instrução INSERT retorna uma mensagem de sucesso somente após a conclusão da sincronização de dados em ambas as réplicas.

Importante

Considere os seguintes pontos ao usar este parâmetro:

  • Essa configuração aumenta o tempo de execução das instruções INSERT, pois a operação deve aguardar a conclusão da sincronização da réplica. 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 conflita 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 essa configuração em uma única consulta. Após verificar 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 definir 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 expiram.

    • 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 TTL não estejam alinhadas, alguns dados podem não ser limpos prontamente. A seguir, explicamos como as regras de partição e TTL interagem.

      • Se as regras de partição e 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.

      • Se as regras não estiverem alinhadas e ttl_only_drop_parts = 0, o ClickHouse precisa verificar os dados dentro de cada parte para encontrar e excluir linhas expiradas individuais. 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 background

      SELECT * FROM system.metrics WHERE metric LIKE 'Background%';

      A métrica BackgroundPoolTask indica o número de tarefas ativas no momento no pool em background.

    • 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 é preciso 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 schema 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 background acionam a limpeza por TTL e exigem espaço disponível em disco. Partes de dados grandes ou espaço insuficiente em disco (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: Delay 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 background exceder esse valor, o ClickHouse não agenda novas tarefas de merge com TTL.

Tarefas de optimize lentas

Uma tarefa de optimize exige muita 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. Pode retornar sem realizar 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, defina o parâmetro optimize_throw_if_noop. Se este parâmetro estiver ativado, o comando lança uma exceção caso não realize nenhum merge, permitindo determinar se a tarefa foi realmente executada.

TTL de dados ineficaz após optimize

Veja abaixo 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 consegue 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 contêm dados expirados com maior frequência.

  • Causa 2: Se o TTL de uma tabela for modificado ou adicionado, 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.

  • Caso haja dados sendo gravados na tabela, o procedimento depende 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)

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

    Remover 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 timeout em tarefa DDL distribuída

Modifique o timeout padrão executando set global on cluster default distributed_ddl_task_timeout=xxx, onde xxx é o timeout 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 bloqueia esta 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 a busca vetorial

Sim. O ApsaraDB for ClickHouse oferece suporte a 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 usa JOIN ou IN para unir múltiplas 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);

    Neste 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 múltiplas 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 múltiplas 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 de dados frios

A seguir, um exemplo de consulta:

SELECT * FROM system.disks;

Consultar dados no cold storage

Use a seguinte consulta:

SELECT * FROM system.parts WHERE disk_name = 'cold_disk';

Mover dados de partição para 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 comuns incluem:

  • Uma consulta que aciona um erro OOM.

  • Reinicialização da instância acionada por uma alteração de configuração.

  • Reinicialização da instância após upgrade ou downgrade.

Upgrade suave sem migração de dados

O suporte a upgrade suave em um cluster ClickHouse depende da data de criação. Clusters adquiridos após 1º de dezembro de 2021 suportam upgrade in-place sem migração de dados. Clusters adquiridos antes dessa data exigem migração de dados. Upgrade the major engine version.

Tabelas de sistema comuns

A tabela a seguir descreve tabelas de sistema comuns 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

Contém um log de instruções SQL executadas.

system.merges

Contém informações sobre operações de merge no cluster.

system.mutations

Contém informações sobre operações de mutação no cluster.

Modificar parâmetros de nível de sistema

Os parâmetros de nível de 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 alvo.

  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 reinicia automaticamente, causando uma desconexão transitória de cerca de 1 minuto.

Modificar parâmetros de nível de usuário

Os parâmetros de nível de usuário correspondem aos itens de configuração no arquivo users.xml. Para modificar um parâmetro, execute a seguinte instrução.

SET global ON cluster default ${key}=${value};

Salvo especificação em contrário, a alteração entra em vigor imediatamente.

Modificar quota

Especifique o parâmetro de quota nas settings de uma instrução de execução:

settings max_memory_usage = XXX;

Uso variado 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 do que outros node s durante write operation s intensas. 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 problemas potenciais.

  • Solução:

    1. Verifique o parâmetro text_log.level do seu cluster e siga um destes procedimentos:

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

      2. Se text_log.level tiver um valor, verifique se o nível de log atende aos seus requisitos. Caso contrário, 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 seguinte instrução 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 está 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 respectiva de cada produto.

Se as condições acima não forem atendidas, estabeleça primeiro a conectividade usando uma solução de rede adequada. Em seguida, adicione o endereço IP de cada um à lista de permissões do outro.

Cenário

Solução

Conectividade de nuvem 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 diferentes

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 Enterprise Edition

Sim, é possível migrar um cluster ClickHouse Community Edition para um cluster Enterprise Edition.

Você pode migrar dados entre clusters Enterprise Edition e Community Edition usando a função remote ou exportando e importando 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 da sua aplicação 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 usa 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 garantir a consistência em todos os nós. Para reduzir o risco operacional, 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. Exclua a materialized view. 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; 
        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: Defina 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, defina seu tipo na tabela de destino como AggregateFunction, por exemplo 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 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 a sincronização dos dados.

Falha em instruções SQL na Enterprise Edition 24.5 ou posterior

Por padrão, instâncias da Enterprise Edition 24.5 ou posterior 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 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 da Enterprise Edition. Clusters da ClickHouse Community Edition não podem ser suspensos. Para suspender um cluster da Enterprise Edition, acesse a página de Clusters da Enterprise Edition. 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 para 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 tabela distribuída correspondente 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.

  • Para volumes pequenos de dados, insira os dados diretamente na tabela distribuída table_dst_d para distribuí-los uniformemente.

  • Se os dados da tabela MergeTree original table_src já estiverem balanceados entre todos os nós e o volume for grande, insira os dados diretamente na tabela ReplicatedMergeTree local table_dst em cada nó.

  • Conjuntos de dados grandes podem tornar o processo de importação demorado. Ao utilizar a função remote(), configure um valor de timeout apropriado.

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

Caso possua 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 seguinte instrução.

    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 único 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 usar a palavra-chave FINAL para deduplicar resultados de consulta, a deduplicação falha se a instrução SQL contiver uma cláusula JOIN. Como resultado, 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 de FINAL e 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. Este método não exige 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. Se estiver usando 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á então 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.

Sintoma

Ao usar a palavra-chave FINAL para deduplicar resultados de consulta, a deduplicação falha se a instrução SQL contiver uma cláusula JOIN. Como resultado, 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 de FINAL e 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. Este método não exige 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. Se estiver usando 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á então 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 realizar operações de exclusão (DELETE) ou atualização (UPDATE) de dados em um cluster 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 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 dos 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 as data part afetadas 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 operações DELETE e UPDATE incompletas. Para evitar acúmulo, execute a seguinte instrução SQL para verificar se há Mutations em andamento 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. Se houver 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;

Sintoma

Ao realizar operações de exclusão (DELETE) ou atualização (UPDATE) de dados em um cluster 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 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 dos 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 as data part afetadas 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 operações DELETE e UPDATE incompletas. Para evitar acúmulo, execute a seguinte instrução SQL para verificar se há Mutations em andamento 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. Se houver 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:

  • As consultas têm como alvo uma tabela local em um cluster com múltiplos shards.

    Em um cluster com múltiplos shards 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 funciona da seguinte forma:

    Os dados são gravados primeiro na tabela distribuída, que então os distribui para as tabelas locais em diferentes shards para armazenamento.

    Ao consultar dados, a origem 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 mecanismo 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 mecanismo da série Replicated*, como o mecanismo ReplicatedMergeTree, para permitir a sincronização de dados entre as réplicas.

    Se uma tabela em um cluster de duas réplicas for criada sem um mecanismo 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. Determine o tipo de cluster.

    Verifique as informações do cluster para determinar se ele é um cluster com múltiplos shards, um cluster de duas réplicas ou um cluster com múltiplos shards e duas réplicas. Siga estas etapas:

    1. Faça logon 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 possui múltiplos shards.

      • Caso a série seja High-availability Edition, trata-se de um cluster de duas réplicas.

      • Quando ambas as condições forem atendidas, o cluster é do tipo múltiplos shards e duas réplicas.

  2. Escolha uma solução conforme o tipo de cluster.

    Cluster com múltiplos shards

    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 desejada. Se o mecanismo não for da série Replicated*, recrie a tabela. Create a table.

    Cluster com múltiplos shards e duas réplicas

    Verifique o tipo da tabela consultada.

    Para tabelas locais, consulte a tabela distribuída. Se não houver uma tabela distribuída, crie uma.

    Ao consultar uma tabela distribuída, verifique se o mecanismo da tabela local correspondente pertence à série Replicated*. Caso contrário, recrie a tabela local com um mecanismo da série Replicated*. Create a table.

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:

  • As consultas têm como alvo uma tabela local em um cluster com múltiplos shards.

    Em um cluster com múltiplos shards 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 funciona da seguinte forma:

    Os dados são gravados primeiro na tabela distribuída, que então os distribui para as tabelas locais em diferentes shards para armazenamento.

    Ao consultar dados, a origem 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 mecanismo 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 mecanismo da série Replicated*, como o mecanismo ReplicatedMergeTree, para permitir a sincronização de dados entre as réplicas.

    Se uma tabela em um cluster de duas réplicas for criada sem um mecanismo 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. Determine o tipo de cluster.

    Verifique as informações do cluster para determinar se ele é um cluster com múltiplos shards, um cluster de duas réplicas ou um cluster com múltiplos shards e duas réplicas. Siga estas etapas:

    1. Faça logon 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 possui múltiplos shards.

      • Caso a série seja High-availability Edition, trata-se de um cluster de duas réplicas.

      • Quando ambas as condições forem atendidas, o cluster é do tipo múltiplos shards e duas réplicas.

  2. Escolha uma solução conforme o tipo de cluster.

    Cluster com múltiplos shards

    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 desejada. Se o mecanismo não for da série Replicated*, recrie a tabela. Create a table.

    Cluster com múltiplos shards e duas réplicas

    Verifique o tipo da tabela consultada.

    Para tabelas locais, consulte a tabela distribuída. Se não houver uma tabela distribuída, crie uma.

    Ao consultar uma tabela distribuída, verifique se o mecanismo da tabela local correspondente pertence à série Replicated*. Caso contrário, recrie a tabela local com um mecanismo da série Replicated*. Create a table.

Por que o ReplacingMergeTree falha na deduplicação após uma mesclagem forçada?

Sintoma

O mecanismo 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 mecanismo 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 mecanismo 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 os novos dados, deixando os dados existentes não deduplicados.

Sintoma

O mecanismo 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 mecanismo 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 mecanismo 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 os novos dados, deixando os dados existentes não deduplicados.