Este tópico aborda as perguntas mais frequentes sobre o ApsaraDB for ClickHouse, incluindo seleção de instâncias, dimensionamento, conexões, migração de dados, consultas e armazenamento.
-
Seleção e compra
-
Dimensionamento
-
Conexões
-
Migração e sincronização
How do I resolve the "too many parts" error that occurs during data import?
Why do row counts differ between Hive and ClickHouse after data import?
Why do row counts differ between Kafka and ClickHouse after data import?
How do I import data from an existing ClickHouse cluster to Alibaba Cloud ClickHouse?
How do I resolve the "Too many partitions for single INSERT block (more than 100)" error?
How do I resolve network connectivity issues between the destination cluster and a data source?
Can I migrate a Community-Compatible Edition cluster to an Enterprise Edition cluster?
-
Gravação e consulta de dados
How do I handle the memory limit exceeded error that occurs during a query?
Why does an Enterprise Edition cluster report a memory limit error when I run an SQL statement?
How do I handle the "concurrency limit exceeded" error that occurs during queries?
How do I resolve inconsistent results for the same query after data writes have stopped?
Why are created tables sometimes not visible and why do query results fluctuate?
How do I resolve timestamp mismatches between queried and written data?
How do I handle the "table does not exist" error that occurs after I create a table?
Why is no new data ingested after a Kafka external table is created?
Why does the time returned by a query not match the time zone of the client?
Why isn't data merged by primary key after an OPTIMIZE task completes?
Why doesn't the TTL setting take effect after an OPTIMIZE task completes?
Why don't UPDATE and DELETE operations take effect after an OPTIMIZE task completes?
How do I use DDL statements to add, delete, or modify columns?
How do I handle the "set global on cluster default" syntax error?
Why does deduplication by using the FINAL keyword in ClickHouse fail due to a JOIN operation?
Why are results inconsistent across consecutive queries in a Community-Compatible Edition cluster?
Why do DELETE/UPDATE operations in a Community-Compatible Edition cluster not complete?
-
Armazenamento de dados
-
Monitoramento, atualizações e parâmetros do sistema
-
Outros
ApsaraDB for ClickHouse versus versão da comunidade
O ApsaraDB for ClickHouse corrige bugs de estabilidade presentes na versão da comunidade e oferece resource queues para definir prioridades de uso de recursos por função de usuário.
Versões recomendadas para o ApsaraDB for ClickHouse
O ApsaraDB for ClickHouse utiliza versões 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
pingpara testar o alcance da rede etelnetpara confirmar se as portas de banco de dados 3306 e 8123 estão abertas.Valide a configuração da lista de permissões do ClickHouse. Configure a whitelist.
Confirme o endereço IP público da sua máquina cliente. Em redes corporativas, esse endereço pode mudar com frequência; utilize um serviço de consulta de IP como o whatsmyip.
Impossível conectar a tabelas externas
Nas versões 20.3 e 20.8, o sistema valida automaticamente a conexão ao criar uma tabela externa. A criação bem-sucedida da tabela confirma a conectividade de rede. Se a criação falhar, os motivos mais comuns incluem:
O endpoint de destino e o ClickHouse não estão na mesma VPC, o que impede a conectividade de rede.
O servidor MySQL utiliza uma lista de permissões. É necessário adicionar o ClickHouse à lista de permissões do MySQL.
Para tabelas externas do Kafka, 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 = : %3dPor exemplo, se sua senha for ab@#c, a senha codificada na string de conexão deve ser ab%40%23c.
-
Causa: O ApsaraDB for ClickHouse provisiona automaticamente uma instância Server Load Balancer (SLB) no modelo pagamento conforme o uso para seu cluster. Se houver pagamentos 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-numberfalha.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:
Divida arquivos grandes no OSS em arquivos menores antes de importá-los.
Faça o dimensionamento vertical do seu cluster para aumentar a memória. Vertical and horizontal scaling for Community Edition clusters.
Como resolver o erro "too many parts"
O ClickHouse gera uma parte de dados para cada operação de escrita. Escrever uma única linha ou pequenos volumes de dados por vez cria um número excessivo de partes, o que sobrecarrega as operações de mesclagem e as consultas. O erro "too many parts" ocorre porque o ClickHouse 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
batchgrande e um número reduzido deconcurrent operations. Um únicobatchpode conter dezenas ou até centenas de milhares de linhas, dependendo do tamanho médio da linha. Como diretriz geral, estime 100 bytes por linha, mas ajuste esse valor com base nas características reais dos seus dados.Solução: Defina o número de
concurrent operationscomo 10 ou menos. Teste diferentes valores de parâmetros para encontrar a configuração ideal para sua carga de trabalho. -
Causa 2: Recursos insuficientes no
exclusive resource groupdo DataWorks. As instânciasECSnoexclusive resource grouppodem estar subdimensionadas. CPU ou memória insuficientes limitam o número deconcurrent operationse anetwork egress bandwidthdisponível. Da mesma forma, definir um tamanho debatchgrande em uma máquina com memória limitada pode acionar coletas de lixo (GC) frequentes do Java no processo do DataWorks, reduzindo o desempenho.Solução: Verifique as especificações da instância
ECSnos logs de saída do DataWorks. -
Causa 3: O gargalo está na
data source.Solução: Nos logs de saída do DataWorks, procure pelas métricas
totalWaitReaderTimeetotalWaitWriterTime. SetotalWaitReaderTimefor significativamente maior quetotalWaitWriterTime, o gargalo está na leitura (nadata source), e não na escrita. -
Causa 4: Uso de um
public network endpoint. Umpublic network endpointpossui largura de banda limitada e não é adequado para operações de importação ou exportação de dados de alto desempenho.Solução: Mude para um endpoint de rede
VPC network. -
Causa 5: Presença de
dirty data. Normalmente, os dados são escritos em umbatch. No entanto, se houverdirty data, a escrita dobatchatual falha. O DataX então reverte para um modo de inserção linha a linha. Essa reversão gera um excesso dedata partse reduz drasticamente o desempenho de escrita.Use os dois métodos a seguir para verificar a existência de
dirty data.-
Verifique mensagens de erro. Se o log contiver um erro
Cannot parse, isso indicadirty data.Execute a consulta SQL a seguir para 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 porbatchcair para 1, isso indica fortemente que o DataX encontroudirty datae 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 datadadata source. -
Discrepância na contagem de linhas após importação do Hive
Realize as seguintes verificações:
Verifique erros durante a importação na tabela de sistema
query_log. Se houver erros, provavelmente ocorreu perda de dados.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.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:
Consulte a tabela de sistema
query_logem busca de erros ocorridos durante a importação. A presença de erros pode indicar perda de dados.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.Confira se o parâmetro
kafka_skip_broken_messagesestá 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:
Exporte arquivos usando o ClickHouse Client. Migrate data from a self-managed ClickHouse instance to ApsaraDB for ClickHouse Community Edition.
-
Use a função remote.
INSERT INTO <destination_table> SELECT * FROM remote('<connection_string>', '<database>', '<table>', '<username>', '<password>');
Erro de sincronização do MaterializeMySQL: The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires
Esse erro indica que o mecanismo MaterializeMySQL 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.
-
Exclua a tabela que parou de sincronizar.
DROP TABLE <table_name> ON cluster default;NotaNeste comando,
table_nameé o nome da tabela que parou de sincronizar. Se a tabela for distribuída, você deve excluir tanto a tabela distribuída quanto sua tabela local. -
Reinicie o processo de sincronização.
ALTER database <database_name> ON cluster default MODIFY SETTING skip_unsupported_tables = 1;NotaNeste comando,
<database_name>é o nome do banco de dados sincronizado no ApsaraDB for ClickHouse.
Resolvendo o erro "Too many partitions for single INSERT block (more than 100)"
Esse erro ocorre quando uma única operação INSERT tenta escrever em mais partições do que o permitido pelo parâmetro max_partitions_per_insert_block, cujo 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_blockcom 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;NotaA comunidade ClickHouse recomenda o valor padrão de 100. Definir esse valor muito alto pode degradar o desempenho. Após concluir a importação de dados em massa, reverta o parâmetro para seu valor padrão.
Erro de limite de memória excedido para insert into select
-
Causa: Alto uso de memória.
Solução: Ajuste o parâmetro
max_insert_threadspara reduzir o uso de memória. -
Causa: Uso de uma instrução
insert into selectpara importar dados entre clusters ClickHouse.Solução: Migre os dados importando-os a partir de arquivos. Migrate data from a self-managed ClickHouse instance to ApsaraDB for ClickHouse Community Edition.
Consultando 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.
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:
Faça login no console do ApsaraDB for ClickHouse.
Na página Clusters, selecione Clusters of Community-compatible Edition e clique no ID do cluster desejado.
No painel de navegação à esquerda, clique em Parameter Configuration.
Na página Parameter Configuration, clique no ícone de edição na coluna Parameter Value referente ao parâmetro
max_concurrent_queries.Insira o novo valor na caixa de diálogo e clique em OK.
Clique em Submit Parameters.
Clique em OK.
Resultados de consulta inconsistentes 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 tableem 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:
-
Ao criar uma tabela, use a instrução
create table <table_name> on cluster default. A cláusulaon cluster defaulttransmite a instrução para todos os nós no cluster padrão.CREATE TABLE test ON cluster default (a UInt64) Engine = MergeTree() ORDER BY tuple(); -
Crie outra tabela 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}')ouReplicatedMergeTree()para configurar o mecanismo de tabela ReplicatedMergeTree. Os argumentos emReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')fazem parte de um modelo fixo e não devem ser modificados.
Discrepâncias em dados de timestamp
Execute SELECT timezone() para verificar se o fuso horário corresponde ao 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.
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.
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
INSERTdevem aguardar o sucesso da sincronização entre réplicas. Isso significa que, se uma réplica estiver indisponível, todas as operações de escrita configuradas cominsert_quorum = 2falharão, o que 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
-
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. -
Verifique o parâmetro
materialize_ttl_after_modify.Esse parâmetro controla se uma nova regra de TTL se aplica aos dados existentes após a execução de uma instrução ALTER MODIFY TTL. O valor padrão é 1 (ativado). Um valor igual a 0 significa que a regra se aplica apenas a novos dados, e os dados existentes não são afetados pelo TTL.
-
Consulte a configuração do parâmetro
SELECT * FROM system.settings WHERE name like 'materialize_ttl_after_modify'; -
Modifique a configuração do parâmetro
ImportanteEste comando verifica todos os dados existentes e pode gerar uma alta carga de recursos. Use-o com cautela.
ALTER TABLE $table_name MATERIALIZE TTL;
-
-
Analise a estratégia de limpeza de partições.
Quando o parâmetro
ttl_only_drop_partsestá definido como 1, o ClickHouse exclui uma parte de dados somente quando todas as linhas dentro dessa parte expiram.-
Consulte a configuração do parâmetro
ttl_only_drop_partsSELECT * FROM system.merge_tree_settings WHERE name LIKE 'ttl_only_drop'; -
Verifique o status de expiração da partição
SELECT partition, name, active, bytes_on_disk, modification_time, min_time, max_time, delete_ttl_info_min, delete_ttl_info_max FROM system.parts c WHERE database = 'your_dbname' AND TABLE = 'your_tablename' LIMIT 100;delete_ttl_info_min: Valor mínimo da chave datetime usado para a regra TTL DELETE nesta parte.
delete_ttl_info_max: Valor máximo da chave datetime usado para a regra TTL DELETE nesta parte.
-
Caso as regras de partição e 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 timestampdelete_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.
-
-
Controle a frequência de acionamento de merges.
A exclusão de dados expirados ocorre de forma assíncrona durante os merges, não em tempo real. É possível controlar a frequência de merges com o parâmetro merge_with_ttl_timeout ou forçar a materialização do TTL usando a instrução ALTER TABLE ... MATERIALIZE TTL.
-
Consulte o parâmetro
SELECT * FROM system.merge_tree_settings WHERE name = 'merge_with_ttl_timeout';NotaA unidade é segundos. O valor padrão para uma instância online é 7200 segundos (2 horas).
-
Modifique o parâmetro
Se merge_with_ttl_timeout estiver definido com um valor muito alto, a frequência de acionamento do merge de TTL diminui, atrasando a limpeza de dados expirados. Reduza esse parâmetro para aumentar a frequência de limpeza. Para mais detalhes, consulte Descrição do parâmetro.
-
-
Verifique as configurações dos parâmetros do pool de threads.
A remoção de dados por TTL ocorre durante a fase de merge de partes e é limitada pelos parâmetros
max_number_of_merges_with_ttl_in_pool(padrão: 2 para instâncias online) ebackground_pool_size(padrão: 16 para instâncias online).-
Consulte a atividade atual das threads em background
SELECT * FROM system.metrics WHERE metric LIKE 'Background%';A métrica
BackgroundPoolTaskindica 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_poolconforme as necessidades do seu negócio, por exemplo, de 2 para 4 ou de 4 para 8. Se isso não resolver o problema, considere aumentar o parâmetrobackground_pool_size.ImportanteÉ necessário reiniciar o cluster se você ajustar o parâmetro
max_number_of_merges_with_ttl_in_pool. Não é preciso reiniciar o cluster ao aumentar o parâmetrobackground_pool_size, mas é obrigatório reiniciá-lo ao diminuir o parâmetrobackground_pool_size.
-
-
Verifique se o 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.
-
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.
-
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 BYdeve incluir apartition keydastorage table. Umprimary key mergenão ocorre entre partições diferentes.Para uma
distributed table, a chaveORDER BYdeve incluir a chave de sharding, determinada pelohash algorithm. Umprimary key mergenão ocorre entre nós diferentes.
A tabela a seguir descreve comandos comuns de optimize e seus comportamentos.
|
Comando |
Descrição |
|
|
Este comando tenta selecionar e mesclar |
|
|
Este comando visa uma Nota
Para tabelas sem uma |
|
|
Este comando força um merge de todas as partições na tabela. Ele remescla partições mesmo que elas já consistam em um único |
Para qualquer um desses comandos de optimize, 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 finalouoptimize a specific partition.Ao criar uma tabela, defina parâmetros como merge_with_ttl_timeout e ttl_only_drop_parts para mesclar partes de dados que 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
-
Modifique a tabela local.
-
Modifique a tabela distribuída.
Modificar o tipo de dados de uma coluna (para um tipo conversível)
Remover uma coluna anulável
-
Modifique a tabela distribuída.
-
Modifique a tabela local.
Adicionar uma coluna não anulável
-
Interrompa a gravação de dados.
-
Execute
SYSTEM FLUSH DISTRIBUTEDna tabela distribuída. -
Modifique a tabela local.
-
Modifique a tabela distribuída.
-
Retome a gravação de dados.
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;, ovalueé uma string, mas não está entre aspas.Solução: Coloque o valor da string entre aspas.
Ferramenta de BI recomendada
Recomendamos o Quick BI.
IDEs recomendadas para consulta de dados
DataGrip, DBeaver.
Suporte 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 INouGLOBAL JOINcom a funçãoremote()pode produzir resultados incorretos. Isso acontece porque a subconsulta, que deveria ser executada na instância externa, é executada na instância atual.Por exemplo, você executa a seguinte instrução em
instance_apara consultar dados da instância externacc-bp1wc089c****.SELECT * FROM remote('cc-bp1wc089c****.clickhouse.ads.aliyuncs.com:3306', `default`, test_tbl_distributed1, '<your_Account>', '<YOUR_PASSWORD>') WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);Neste caso,
instance_aexecuta a subconsultaSELECT id FROM test_tbl_distributed1para gerar uma tabela temporária, vamos chamá-la detemp_table_A. Os dados detemp_table_Asão então enviados para a instância externacc-bp1wc089c****para a consulta final. A instância externacc-bp1wc089c****acaba executando a instruçãoSELECT * FROM default.test_tbl_distributed1 WHERE id IN (temp_table_A);.O problema surge da origem dos dados na tabela temporária.
Com base na descrição acima, a instrução final executada pela instância
cc-bp1wc089c****éSELECT * FROM default.test_tbl_distributed1 WHERE id IN (temporary table A);. No entanto, o conjunto de condições definido na tabela temporária A foi gerado na instância a. Neste exemplo, a instânciacc-bp1wc089c****deveria ter executadoSELECT * FROM default.test_tbl_distributed1 WHERE id IN (SELECT id FROM test_tbl_distributed1 );, e o conjunto de condições deveria ter se originado da instânciacc-bp1wc089c****. Portanto, o uso de GLOBAL IN ou GLOBAL JOIN faz com que a subconsulta recupere o conjunto de condições de uma fonte incorreta, o que leva a um resultado incorreto.
Soluções:
Solução 1: Modifique o código SQL da sua aplicação para substituir manualmente IN ou JOIN por GLOBAL IN ou GLOBAL JOIN.
Por exemplo, altere esta instrução:
SELECT * FROM test_tbl_distributed WHERE id IN (SELECT id FROM test_tbl_distributed1);
para:
SELECT * FROM test_tbl_distributed WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);
Solução 2: Modifique o parâmetro de sistema distributed_product_mode ou prefer_global_in_and_join para que o sistema converta automaticamente IN ou JOIN em GLOBAL IN ou GLOBAL JOIN.
distributed_product_mode
Execute a seguinte instrução para definir distributed_product_mode como global. Essa configuração converte automaticamente operações padrão de IN ou JOIN em GLOBAL IN ou GLOBAL JOIN quando necessário.
SET GLOBAL ON cluster default distributed_product_mode='global';
Uso
Finalidade: Controla como o ClickHouse lida com subconsultas distribuídas.
-
Valores:
deny(padrão): Proíbe subconsultas distribuídas deINeJOINe lança a exceção"Double-distributed IN/JOIN subqueries is denied".local: Reescreve a subconsulta para usar a tabela local no shard de destino, preservando um operador padrão deINouJOIN.global: Converte consultas deINouJOINem consultas deGLOBAL INouGLOBAL JOIN.allow: Permite subconsultas padrão deINeJOIN, o que pode causar amplificação de consulta.
Cenários aplicáveis: Aplica-se apenas a consultas que usam
INouJOINpara unir 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
INeJOIN.-
Valores:
0(padrão): Proíbe subconsultas distribuídas deINeJOINe lança a exceção"Double-distributed IN/JOIN subqueries is denied".1: Habilita subconsultas distribuídas deINeJOINconvertendo-as automaticamente em consultas deGLOBAL INouGLOBAL JOIN.
Cenários aplicáveis: Aplica-se apenas a consultas que usam
INouJOINpara unir 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:
Faça login no console do ApsaraDB for ClickHouse.
Na página Clusters, selecione Clusters of Community-compatible Edition e clique no ID do cluster alvo.
No painel de navegação à esquerda, clique em Parameter Configuration.
Na página Parameter Configuration, clique no ícone de edição na coluna Parameter Value referente ao parâmetro
max_concurrent_queries.Insira o novo valor na caixa de diálogo e clique em OK.
Clique em Submit Parameters.
Clique em OK.
Após clicar em OK, o processo clickhouse-server 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:
-
Verifique o parâmetro
text_log.leveldo seu cluster e siga um destes procedimentos:Se
text_log.levelestiver vazio, o registro de texto em log está desativado. Para ativá-lo, defina um valor para este parâmetro.Se
text_log.leveltiver 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.
Conecte-se ao banco de dados alvo. Connect to a database.
-
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 |
|
|
Conectividade VPC entre regiões e contas diferentes |
|
|
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 |
|
|
Conectividade via rede pública |
|
|
Conflito de endereços |
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_mvcomo exemplo.-
Liste as tabelas que não estão presentes em todos os nós.
NODE_NUM= Número de shards × Número de réplicas.SELECT database,table,any(create_table_query) AS sql,count() AS cnt FROM cluster(default, system.tables) WHERE database NOT IN ('system', 'information_schema', 'INFORMATION_SCHEMA') GROUP BY database, table HAVING cnt != <NODE_NUM>; -
Identifique as materialized views que possuem um número incorreto de tabelas internas.
SELECT substring(hostName(),38,8) AS host,* FROM cluster(default, system.tables) WHERE uuid IN (<UUID1>, <UUID2>, ...); -
Desative o comportamento padrão de sincronização do cluster. Esta etapa é obrigatória para clusters ApsaraDB for ClickHouse, mas não é necessária para clusters ClickHouse autogerenciados. Em seguida, renomeie a tabela interna para 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`; -
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; -
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_cnfor calculada usando uma função de estado de agregação comosumIfStatena instruçãoSELECT, defina seu tipo na tabela de destino como AggregateFunction, por exemploAggregateFunction(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
> 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:
Crie a tabela ReplicatedMergeTree de destino,
table_dst, e sua tabela distribuída correspondente,table_dst_d. CREATE TABLE.Importe os dados da tabela MergeTree
table_srcparatable_dst_d. Utilize um dos dois métodos a seguir.
Ambos os métodos consultam os dados de origem na tabela MergeTree local.
Para volumes pequenos de dados, insira os dados diretamente na tabela distribuída
table_dst_dpara distribuí-los uniformemente.Se os dados da tabela MergeTree original
table_srcjá estiverem balanceados entre todos os nós e o volume for grande, insira os dados diretamente na tabela ReplicatedMergeTree localtable_dstem 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
-
Obtenha o endereço IP de cada nó.
SELECT cluster, shard_num, replica_num, is_local, host_address FROM system.clusters WHERE cluster = 'default'; -
Importe os dados utilizando a função remote.
Passe sequencialmente os endereços IP obtidos na etapa anterior para a função
remote()e execute a instrução para cada um deles.INSERT INTO table_dst_d SELECT * FROM remote('node1', db.table_src) ;Por exemplo, se os endereços IP de dois nós forem
10.10.0.165e10.10.0.167, execute as seguintes instruçõesINSERTseparadamente:INSERT INTO table_dst_d SELECT * FROM remote('10.10.0.167', default.table_src) ; INSERT INTO table_dst_d SELECT * FROM remote('10.10.0.165', default.table_src) ;Executar as instruções para todos os endereços IP dos nós converte a tabela MergeTree em uma tabela ReplicatedMergeTree.
Usar tabelas locais
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.
-
Obtenha o endereço IP de cada nó.
SELECT cluster, shard_num, replica_num, is_local, host_address FROM system.clusters WHERE cluster = 'default'; -
Importe os dados.
Faça login em cada nó sequencialmente usando seu endereço IP e execute a 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).
-
Adicione a dependência ao arquivo pom.xml do seu projeto Maven.
<dependency> <groupId>com.clickhouse</groupId> <artifactId>client-v2</artifactId> <version>0.8.2</version> </dependency> -
Defina um
session IDpersonalizado em CommandSettings.package org.example; import com.clickhouse.client.api.Client; import com.clickhouse.client.api.command.CommandSettings; public class Main { public static void main(String[] args) { Client client = new Client.Builder() .addEndpoint("endpoint") // Instance endpoint .setUsername("username") // Username .setPassword("password") // Password .build(); try { client.ping(10); CommandSettings commandSettings = new CommandSettings(); // Set the session_id commandSettings.serverSetting("session_id","examplesessionid"); // Set the max_block_size parameter for the session client.execute("SET max_block_size=65409 ",commandSettings); // Execute the queries client.execute("SELECT 1 ",commandSettings); client.execute("SELECT 2 ",commandSettings); } catch (Exception e) { throw new RuntimeException(e); } finally { client.close(); } } }
Neste exemplo, ambas as instruções SELECT são executadas na mesma sessão com max_block_size definido como 65409. ClickHouse Java Client: Java Client | ClickHouse Docs.
Por que a deduplicação com FINAL falha ao usar JOIN
Sintoma
Ao 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
FINALno 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
FINALdo nome da tabela e anexe as configurações allow_experimental_analyzer = 1,FINAL = 1 à instrução. A instrução revisada fica assim:SELECT * FROM t1 JOIN t2 WHERE xxx SETTINGS allow_experimental_analyzer = 1, FINAL = 1;ImportanteO parâmetro
allow_experimental_analyzeré suportado apenas nas versões 23.8 e posteriores. 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):
Force uma mesclagem para deduplicação executando periodicamente
OPTIMIZE TABLE local_table_name FINAL. Isso mescla os dados antecipadamente, mas deve ser usado com cautela em tabelas grandes, pois gera alta sobrecarga de I/O.Modifique a consulta SQL: Remova a palavra-chave
FINAL. A deduplicação de dados passará então a depender da consulta aos dados já mesclados.
ImportanteUtilize esta abordagem com cautela, pois a operação consome recursos significativos de I/O e pode afetar o desempenho de tabelas grandes.
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
FINALno 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
FINALdo nome da tabela e anexe as configurações allow_experimental_analyzer = 1,FINAL = 1 à instrução. A instrução revisada fica assim:SELECT * FROM t1 JOIN t2 WHERE xxx SETTINGS allow_experimental_analyzer = 1, FINAL = 1;ImportanteO parâmetro
allow_experimental_analyzeré suportado apenas nas versões 23.8 e posteriores. 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):
Force uma mesclagem para deduplicação executando periodicamente
OPTIMIZE TABLE local_table_name FINAL. Isso mescla os dados antecipadamente, mas deve ser usado com cautela em tabelas grandes, pois gera alta sobrecarga de I/O.Modifique a consulta SQL: Remova a palavra-chave
FINAL. A deduplicação de dados passará então a depender da consulta aos dados já mesclados.
ImportanteUtilize esta abordagem com cautela, pois a operação consome recursos significativos de I/O e pode afetar o desempenho de tabelas grandes.
Por que as operações DELETE ou UPDATE ficam incompletas?
Sintoma
Ao 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:
Envio da tarefa: O usuário executa o comando
ALTER TABLE ... UPDATE/DELETEpara gerar uma tarefa assíncrona.Marcação dos dados: O sistema cria um arquivo
mutation_*.txtem segundo plano para registrar o intervalo de dados a ser modificado. As alterações não são aplicadas imediatamente.Reescrita em segundo plano: O ClickHouse reescreve gradualmente as
data partafetadas e aplica as alterações durante o processo de mesclagem.Limpeza de dados antigos: Após a conclusão da mesclagem, os blocos de dados antigos são marcados para exclusão.
Portanto, emitir muitas operações de Mutation em um curto período pode bloquear tarefas e deixar 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
-
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; -
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:
Envio da tarefa: O usuário executa o comando
ALTER TABLE ... UPDATE/DELETEpara gerar uma tarefa assíncrona.Marcação dos dados: O sistema cria um arquivo
mutation_*.txtem segundo plano para registrar o intervalo de dados a ser modificado. As alterações não são aplicadas imediatamente.Reescrita em segundo plano: O ClickHouse reescreve gradualmente as
data partafetadas e aplica as alterações durante o processo de mesclagem.Limpeza de dados antigos: Após a conclusão da mesclagem, os blocos de dados antigos são marcados para exclusão.
Portanto, emitir muitas operações de Mutation em um curto período pode bloquear tarefas e deixar 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
-
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; -
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
-
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:
Faça logon no console do ApsaraDB for ClickHouse.
No canto superior esquerdo da página, selecione Clusters of Community-compatible Edition.
-
Na lista de clusters, clique no ID do cluster desejado para abrir a página de informações do cluster.
Visualize a Edition na seção Cluster Properties e os Node Groups na seção Configuration Information. Determine o tipo de cluster com base nas seguintes propriedades:
Se o número de grupos de nós for maior que 1, o cluster 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.
-
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 TABLEda tabela desejada. Se o mecanismo não for da sérieReplicated*, 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érieReplicated*. 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
-
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:
Faça logon no console do ApsaraDB for ClickHouse.
No canto superior esquerdo da página, selecione Clusters of Community-compatible Edition.
-
Na lista de clusters, clique no ID do cluster desejado para abrir a página de informações do cluster.
Visualize a Edition na seção Cluster Properties e os Node Groups na seção Configuration Information. Determine o tipo de cluster com base nas seguintes propriedades:
Se o número de grupos de nós for maior que 1, o cluster 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.
-
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 TABLEda tabela desejada. Se o mecanismo não for da sérieReplicated*, 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érieReplicated*. 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.
É 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.
É 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.