Cette rubrique traite des questions fréquemment posées sur ApsaraDB for ClickHouse, notamment la sélection d'instances, la mise à l'échelle, les connexions, la migration des données, les requêtes et le stockage.
-
Sélection et achat
-
Mise à l'échelle
-
Connexions
Pourquoi est-il impossible de se connecter à des tables externes telles que MySQL, HDFS et Kafka ?
Pourquoi mon application ne parvient-elle pas à se connecter à ClickHouse ?
Comment résoudre les problèmes de délai d'expiration dans ClickHouse ?
Pourquoi Alibaba Cloud ClickHouse ne peut-il pas accéder au port Prometheus ?
-
Migration et synchronisation
Comment résoudre l'erreur « too many parts » qui survient lors de l'importation de données ?
Pourquoi le nombre de lignes diffère-t-il entre Hive et ClickHouse après l'importation des données ?
Comment importer des données d'un cluster ClickHouse existant vers Alibaba Cloud ClickHouse ?
Comment résoudre l'erreur « Too many partitions for single INSERT block (more than 100) » ?
-
Écritures et requêtes de données
Comment gérer l'erreur de dépassement de limite de mémoire qui survient lors d'une requête ?
Comment gérer l'erreur « concurrency limit exceeded » qui survient lors des requêtes ?
Comment résoudre les décalages d'horodatage entre les données interrogées et les données écrites ?
Comment gérer l'erreur « table does not exist » qui survient après la création d'une table ?
Pourquoi aucune nouvelle donnée n'est-elle ingérée après la création d'une table externe Kafka ?
Pourquoi l'heure retournée par une requête ne correspond-elle pas au fuseau horaire du client ?
Pourquoi les données ne sont-elles pas visibles après leur écriture ?
Pourquoi le paramètre TTL ne prend-il pas effet après l'achèvement d'une tâche OPTIMIZE ?
Comment utiliser des instructions DDL pour ajouter, supprimer ou modifier des colonnes ?
Pourquoi les instructions DDL s'exécutent-elles lentement ou se bloquent-elles fréquemment ?
Comment gérer l'erreur de syntaxe « set global on cluster default » ?
Alibaba Cloud ClickHouse prend-il en charge la recherche vectorielle ?
-
Stockage des données
-
Surveillance, mises à niveau et paramètres système
-
Autres
ApsaraDB for ClickHouse par rapport à la version communautaire
ApsaraDB for ClickHouse corrige les bugs de stabilité de la version communautaire et fournit des files d'attente de ressources permettant de définir des priorités d'utilisation des ressources par rôle utilisateur.
Versions recommandées pour ApsaraDB for ClickHouse
ApsaraDB for ClickHouse utilise des versions LTS stables du noyau issues de la communauté open source. Les nouvelles versions sont généralement disponibles après une période de stabilisation de trois mois. Nous recommandons la version 21.8 ou ultérieure. Consultez la Comparaison des fonctionnalités par version.
Instances à réplica unique et instances maître-réplica
Une instance à réplica unique ne dispose pas de nœud réplica pour chaque nœud shard et n'offre donc aucune haute disponibilité. La sécurité de ses données repose sur le stockage multi-réplica du disque cloud sous-jacent, ce qui en fait une option très économique.
Une instance maître-réplica fournit un nœud réplica pour chaque nœud shard. En cas de défaillance d'un nœud principal, le nœud réplica correspondant assure la reprise après sinistre.
Erreur de ressources insuffisantes
Essayez d'acheter des ressources dans une zone différente au sein de la même région. Les zones d'une même région sont interconnectées via VPC avec une latence négligeable.
Facteurs influençant la durée de la mise à l'échelle horizontale
La mise à l'échelle horizontale implique une migration des données ; le processus est donc plus long pour les instances contenant un volume important de données.
Impact de la mise à l'échelle
Pour garantir la cohérence des données lors de la migration, l'instance passe en état lecture seule pendant la mise à l'échelle.
Recommandations pour la mise à l'échelle horizontale
La mise à l'échelle horizontale est lente. Si votre cluster manque de performances, privilégiez la mise à l'échelle verticale. Consultez la rubrique Mise à l'échelle verticale et horizontale pour les clusters Community Edition.
Description des ports
|
Protocole |
Numéro de port |
Description |
|
TCP |
3306 |
Utilisez ce port pour vous connecter à ApsaraDB for ClickHouse à l'aide de l'outil clickhouse-client. Consultez la rubrique Se connecter à ClickHouse via une interface de ligne de commande. |
|
HTTP |
8123 |
Utilisez ce port pour vous connecter à ApsaraDB for ClickHouse via JDBC pour le développement d'applications. Consultez la rubrique Se connecter à ClickHouse via JDBC. |
|
HTTPS |
8443 |
Utilisez ce port pour accéder à ApsaraDB for ClickHouse via HTTPS. Consultez la rubrique Se connecter à ClickHouse via le protocole HTTPS. |
Ports de connexion SDK pour Alibaba Cloud ClickHouse
|
Langage |
HTTP |
TCP |
|
Java |
8123 |
3306 |
|
Python |
||
|
Go |
SDK pour Go et Python
Les SDK recommandés sont répertoriés dans la documentation Bibliothèques clientes tierces.
Résolution de l'erreur « connect timed out »
Essayez les solutions suivantes :
Vérifiez la connectivité réseau. Utilisez
pingpour tester l'accessibilité réseau ettelnetpour confirmer que les ports de base de données 3306 et 8123 sont ouverts.Vérifiez la configuration de la liste d'autorisation ClickHouse. Consultez la rubrique Configurer une liste d'autorisation.
Confirmez l'adresse IP publique de votre machine cliente. Sur un réseau d'entreprise, cette adresse peut changer fréquemment ; utilisez donc un service de vérification d'IP tel que whatsmyip.
Impossible de se connecter aux tables externes
Dans les versions 20.3 et 20.8, le système valide automatiquement la connexion lors de la création d'une table externe. Une création de table réussie confirme la connectivité réseau. Si la création de la table échoue, les causes fréquentes incluent :
L'endpoint cible et ClickHouse ne se trouvent pas dans le même VPC, ce qui empêche la connectivité réseau.
Le serveur MySQL utilise une liste d'autorisation. Vous devez ajouter ClickHouse à la liste d'autorisation MySQL.
Pour les tables externes Kafka, si une table est créée avec succès mais que les requêtes ne renvoient aucune donnée, la cause est souvent un échec d'analyse des données dans Kafka selon le schéma de la table. Le message d'erreur indiquera l'emplacement exact de l'échec d'analyse.
Dépannage des problèmes de connexion
Causes fréquentes des échecs de connexion et leurs solutions :
-
Cause : L'environnement réseau est mal configuré. Vous pouvez vous connecter via un réseau interne uniquement si votre application et l'instance se trouvent dans le même VPC. Si elles se trouvent dans des VPC différents, vous devez activer un endpoint public et vous connecter via le réseau public.
Solution : Activez l'accès au réseau public. Consultez la rubrique Demander et libérer des adresses IP publiques.
-
Cause : L'adresse IP du client ne figure pas dans la liste d'autorisation de l'instance.
Solution : Ajoutez l'IP du client à la liste d'autorisation. Consultez la rubrique Configurer une liste d'autorisation.
-
Cause : Le groupe de sécurité de votre instance ECS bloque le trafic sur le port requis.
Solution : Mettez à jour les règles du groupe de sécurité ECS. Consultez la rubrique Guide d'utilisation des groupes de sécurité.
-
Cause : Un pare-feu d'entreprise bloque la connexion.
Solution : Modifiez les règles de votre pare-feu pour autoriser le trafic sortant vers l'instance.
-
Cause : Le nom d'utilisateur ou le mot de passe dans la chaîne de connexion contient des caractères spéciaux, tels que !@#$%^&*()_+=. Le client peut ne pas interpréter correctement ces caractères, ce qui provoque un échec de connexion.
Solution : Vous devez encoder en URL tous les caractères spéciaux présents dans la chaîne de connexion. Les règles d'encodage sont les suivantes :
! : %21 @ : %40 # : %23 $ : %24 % : %25 ^ : %5e & : %26 * : %2a ( : %28 ) : %29 _ : %5f + : %2b = : %3dPar exemple, si votre mot de passe est ab@#c, le mot de passe encodé dans la chaîne de connexion doit être ab%40%23c.
-
Cause : ApsaraDB for ClickHouse provisionne automatiquement une instance Server Load Balancer (SLB) en paiement à l'utilisation pour votre cluster. Si votre compte Alibaba Cloud présente des paiements en retard, l'instance SLB peut être suspendue, rendant votre instance ApsaraDB for ClickHouse inaccessible.
Solution : Vérifiez si votre compte Alibaba Cloud présente des paiements en retard et réglez tout solde impayé pour rétablir le service.
Gestion des problèmes de délai d'expiration dans ClickHouse
ApsaraDB for ClickHouse fournit divers paramètres liés aux délais d'expiration pour les protocoles HTTP et TCP.
Protocole HTTP
Le protocole HTTP est la méthode la plus courante pour interagir avec ApsaraDB for ClickHouse dans les environnements de production. Des clients tels que le pilote JDBC officiel, Alibaba Cloud DMS et DataGrip utilisent tous le protocole HTTP en arrière-plan. Le port par défaut pour le protocole HTTP est 8123.
-
Gestion des problèmes liés à distributed_ddl_task_timeout
-
Ce paramètre spécifie le temps d'attente pour l'exécution des requêtes DDL distribuées (avec une clause ON CLUSTER). La valeur par défaut est de 180 secondes. Vous pouvez exécuter la commande suivante dans Alibaba Cloud DMS pour le définir comme paramètre global. Le nouveau paramètre prend effet après le redémarrage du cluster.
set global on cluster default distributed_ddl_task_timeout = 1800;ZooKeeper gérant et exécutant les tâches DDL distribuées de manière asynchrone dans une file d'attente, un délai d'expiration indique que la tâche est toujours en attente d'exécution, et non qu'elle a échoué. Ne soumettez pas la tâche à nouveau.
-
-
Gestion des problèmes de délai d'expiration max_execution_time
-
Ce paramètre spécifie le temps d'exécution maximal d'une requête. La valeur par défaut est de 7200 secondes sur la plateforme Alibaba Cloud DMS et de 30 secondes pour les clients tels que le pilote JDBC et DataGrip. Lorsque cette limite de temps est atteinte, ClickHouse annule automatiquement la requête. Vous pouvez remplacer ce paramètre au niveau de la requête. Par exemple :
select * from system.numbers settings max_execution_time = 3600. Vous pouvez également exécuter la commande suivante dans Alibaba Cloud DMS pour le définir comme paramètre global.set global on cluster default max_execution_time = 3600;
-
-
Gestion des problèmes liés à socket_timeout
Ce paramètre spécifie le temps d'attente pour qu'un socket d'écoute retourne un résultat via le protocole HTTP. La valeur par défaut est de 7200 s sur la plateforme DMS et de 30 s pour le pilote JDBC et DataGrip. Ce paramètre n'est pas un paramètre système ClickHouse, mais un paramètre JDBC pour le protocole HTTP. Cependant, il affecte l'efficacité du paramètre max_execution_time car il détermine la limite de temps côté client pour l'attente d'un résultat. Par conséquent, lorsque vous ajustez le paramètre max_execution_time, vous devez également ajuster le paramètre socket_timeout à une valeur légèrement supérieure à max_execution_time. Pour définir ce paramètre, ajoutez la propriété socket_timeout à la chaîne de connexion JDBC. La valeur est spécifiée en millisecondes. Par exemple : 'jdbc:clickhouse://127.0.0.1:8123/default?socket_timeout=3600000'.
-
Le client se bloque lors d'une connexion directe à l'adresse IP du serveur ClickHouse
-
Lorsqu'une instance ECS se connecte à un serveur ClickHouse à travers des groupes de sécurité, une défaillance de connexion silencieuse peut survenir. Cet échec peut se produire si l'adresse IP du serveur ClickHouse ne figure pas dans la liste d'autorisation du groupe de sécurité de l'instance ECS exécutant le client JDBC. Si une requête de longue durée est exécutée, des problèmes de routage peuvent empêcher la livraison des paquets de réponse au client, ce qui provoque le blocage du client.
Tout comme pour la résolution des problèmes de connexion transitoires avec une instance SLB, l'activation de send_progress_in_http_headers peut résoudre la plupart de ces problèmes. Dans les rares cas où ce paramètre ne fonctionne pas, ajoutez l'adresse IP du serveur ClickHouse à la liste d'autorisation du groupe de sécurité de l'instance ECS où le client s'exécute.
-
Protocole TCP
Le protocole TCP est principalement utilisé pour l'analyse interactive avec l'outil natif en ligne de commande de ClickHouse. Le port courant pour les clusters Community Edition est 3306. Comme le protocole TCP inclut des paquets keep-alive, il ne subit pas de délais d'expiration au niveau du socket. Vous devez uniquement gérer les paramètres distributed_ddl_task_timeout et max_execution_time. Vous pouvez les définir en utilisant la même méthode que pour le protocole HTTP.
Résolution de l'erreur « Connection refused (localhost:9000) »
Problème : Après avoir créé un dictionnaire dans une instance Alibaba Cloud ClickHouse, l'exécution d'une requête renvoie l'erreur suivante : « Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR) (version 23.8.16.1) ».
Cause : Alibaba Cloud ClickHouse utilise le mappage de ports. Le port affiché dans la console (par exemple, 9000) est le port de l'équilibreur de charge, et non le port réel du nœud. Pour accéder à l'instance avec localhost, utilisez le port réel du nœud, et non le port de l'équilibreur de charge.
-
Solution : Accédez au port réel du nœud. Par exemple, remplacez localhost:9000 par localhost:3003. Le tableau ci-dessous présente les mappages de ports courants pour la Community Edition.
Port de l'équilibreur de charge
Port réel du nœud
3306
3003
9000
3003
8123
3002
9004
3005
8443
3006
Port Prometheus inaccessible sur ApsaraDB for ClickHouse
Problème : Vous avez configuré les paramètres Prometheus pour votre cluster ApsaraDB for ClickHouse, mais le port Prometheus spécifié reste inaccessible. Par exemple, la commande
telnet cc-xxxx.clickhouse.ads.aliyuncs.com:port-numberéchoue.Cause : L'adresse de connexion fournie dans la console pointe vers un équilibreur de charge, alors que le service Prometheus s'exécute directement sur les nœuds ApsaraDB for ClickHouse sous-jacents. L'équilibreur de charge n'est pas configuré pour transférer le trafic des ports personnalisés vers ces nœuds.
-
Solution : Connectez-vous directement aux adresses IP des nœuds sous-jacents pour accéder à Prometheus. Exécutez la commande suivante pour récupérer ces adresses IP, puis utilisez l'une d'elles pour vous connecter au port Prometheus.
SELECT * FROM system.clusters;
Erreurs OOM lors de l'importation de données depuis OSS
Cause fréquente : utilisation excessive de la mémoire.
Pour résoudre ce problème, appliquez l'une des mesures suivantes :
Découpez les fichiers volumineux dans OSS en fichiers plus petits avant de les importer.
Effectuez une mise à l'échelle verticale de votre cluster pour augmenter sa mémoire. Mise à l'échelle verticale et horizontale pour les clusters Community Edition.
Résolution de l'erreur « too many parts »
ClickHouse génère une partie de données pour chaque opération d'écriture. Écrire une seule ligne ou de petits volumes de données à la fois crée un nombre excessif de parties, ce qui alourdit considérablement les opérations de fusion et les requêtes. L'erreur « too many parts » survient car ClickHouse impose des limites internes pour éviter cette situation. Si cette erreur se produit, augmentez la taille de vos lots d'écriture. Si vous ne pouvez pas ajuster cette taille, augmentez la valeur du paramètre merge_tree.parts_to_throw_insert dans la console.
Pourquoi les importations DataX sont-elles lentes ?
Causes fréquentes et solutions associées :
-
Cause 1 : configuration sous-optimale des paramètres. ClickHouse offre ses meilleures performances avec une taille de
batchélevée et un nombre réduit d'concurrent operations. Un seulbatchpeut souvent contenir des dizaines, voire des centaines de milliers de lignes, selon la taille moyenne de vos lignes. À titre indicatif, vous pouvez estimer cette taille sur la base de 100 octets par ligne, mais il convient d'ajuster cette valeur en fonction des caractéristiques réelles de vos données.Solution : Définissez le nombre d'
concurrent operationsà 10 ou moins. Testez différentes valeurs de paramètres pour trouver la configuration optimale adaptée à votre charge de travail. -
Cause 2 : ressources insuffisantes dans le
exclusive resource groupDataWorks. Les instancesECSduexclusive resource grouppeuvent être sous-dimensionnées. Un manque de CPU ou de mémoire peut limiter le nombre d'concurrent operationsainsi que lanetwork egress bandwidthdisponible. De même, définir une taille debatchimportante sur une machine disposant de peu de mémoire peut déclencher des ramasse-miettes Java (GC) fréquents dans le processus DataWorks, ce qui ralentit les performances.Solution : Consultez les journaux de sortie DataWorks pour vérifier les spécifications des instances
ECS. -
Cause 3 : le goulot d'étranglement se situe au niveau de la
data source.Solution : Dans les journaux de sortie DataWorks, recherchez les métriques
totalWaitReaderTimeettotalWaitWriterTime. SitotalWaitReaderTimeest nettement supérieur àtotalWaitWriterTime, le goulot d'étranglement se trouve côté lecture (ladata source), et non côté écriture. -
Cause 4 : utilisation d'un
public network endpoint. Unpublic network endpointdispose d'une bande passante limitée et ne convient pas aux opérations d'importation ou d'exportation de données hautes performances.Solution : Passez à un endpoint de type
VPC network. -
Cause 5 : présence de
dirty data. Normalement, les données sont écrites parbatch. Cependant, si desdirty datasont rencontrées, l'écriture dubatchen cours échoue. DataX bascule alors en mode d'insertion ligne par ligne. Ce repli génère un nombre excessif dedata partset réduit drastiquement les performances d'écriture.Vous pouvez utiliser les deux méthodes suivantes pour détecter la présence de
dirty data.-
Vérifiez les messages d'erreur. Si le journal contient une erreur
Cannot parse, cela indique la présence dedirty data.Utilisez la requête SQL suivante pour identifier les exceptions.
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; -
Surveillez le nombre de lignes par
batch. Si ce nombre chute à 1, cela indique fortement que DataX a rencontré desdirty dataet est passé en mode ligne par ligne.Utilisez la requête SQL suivante pour vérifier le nombre de lignes.
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;
Solution : Identifiez et corrigez ou supprimez les
dirty datade ladata source. -
Écart du nombre de lignes après une importation Hive
Effectuez les vérifications suivantes :
Consultez la table système
query_logpour repérer d'éventuelles erreurs survenues pendant l'importation. La présence d'erreurs suggère probablement une perte de données.Vérifiez si le moteur de votre table prend en charge la déduplication. Par exemple, avec le moteur de table
ReplacingMergeTree, le nombre de lignes dans ClickHouse peut être inférieur à celui de Hive, car ce moteur élimine les doublons.Validez l'exactitude du nombre de lignes dans la source Hive, car le décompte initial de la source peut être imprécis.
Écart du nombre de lignes entre ClickHouse et Kafka
Procédez aux vérifications suivantes :
Examinez la table système
query_logpour détecter les erreurs survenues lors de l'importation. Des erreurs indiquent qu'une perte de données a pu se produire.Vérifiez si le moteur de votre table effectue une déduplication des données. Le moteur
ReplacingMergeTree, par exemple, supprime les entrées en double, ce qui réduit le nombre de lignes dans ClickHouse par rapport à Kafka.Contrôlez si le paramètre
kafka_skip_broken_messagesest activé dans la configuration de votre table externe Kafka. S'il est activé, ClickHouse ignore les messages dont l'analyse échoue, réduisant ainsi le nombre de lignes dans ClickHouse par rapport à Kafka.
Importation de données avec Spark et Flink
Importer des données depuis une instance ClickHouse existante
Utilisez l'une des méthodes suivantes :
Exportez les fichiers à l'aide du client ClickHouse. Migration de données d'une instance ClickHouse auto-gérée vers ApsaraDB for ClickHouse Community Edition.
-
Utilisez la fonction remote.
INSERT INTO <destination_table> SELECT * FROM remote('<connection_string>', '<database>', '<table>', '<username>', '<password>');
Erreur de synchronisation 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
Cette erreur indique que le moteur MaterializeMySQL a cessé de se synchroniser pendant une période prolongée, entraînant l'expiration et la purge des journaux binaires MySQL.
Pour résoudre ce problème, supprimez la base de données concernée, puis recréez-la dans ApsaraDB for ClickHouse.
Pourquoi les tables cessent-elles de se synchroniser et pourquoi le champ sync_failed_tables de la table système system.materialize_mysql n'est-il pas vide lors de l'utilisation du moteur MaterializeMySQL pour synchroniser des données MySQL ?
Cause fréquente : vous avez exécuté une instruction MySQL DDL (Data Definition Language) que ApsaraDB for ClickHouse ne prend pas en charge pendant la synchronisation.
Solution : Suivez ces étapes pour resynchroniser les données MySQL.
-
Supprimez la table qui a cessé de se synchroniser.
DROP TABLE <table_name> ON cluster default;RemarqueDans cette commande,
table_namecorrespond au nom de la table dont la synchronisation s'est arrêtée. S'il s'agit d'une table distribuée, vous devez supprimer à la fois la table distribuée et sa table locale. -
Redémarrez le processus de synchronisation.
ALTER database <database_name> ON cluster default MODIFY SETTING skip_unsupported_tables = 1;RemarqueDans cette commande,
<database_name>désigne le nom de la base de données synchronisée dans ApsaraDB for ClickHouse.
Résolution de l'erreur « Too many partitions for single INSERT block (more than 100) »
Cette erreur survient lorsqu'une seule opération INSERT tente d'écrire dans un nombre de partitions supérieur à la limite définie par le paramètre max_partitions_per_insert_block, dont la valeur par défaut est 100. Dans ClickHouse, chaque opération d'écriture crée une partie de données. Une partition peut contenir une ou plusieurs parties de données. Si une instruction INSERT écrit des données dans trop de partitions distinctes simultanément, elle génère un nombre excessif de parties, ce qui peut saturer les opérations de fusion et de requête. ClickHouse impose cette limite pour éviter toute dégradation des performances.
Pour résoudre ce problème, ajustez votre stratégie de partitionnement ou modifiez le paramètre max_partitions_per_insert_block.
Adaptez le schéma de la table, modifiez la méthode de partitionnement ou assurez-vous qu'une seule opération d'insertion ne dépasse pas la limite de partitions.
-
Si votre cas d'usage nécessite l'écriture simultanée dans de nombreuses partitions, augmentez la limite
max_partitions_per_insert_blocken fonction du volume de vos données. Utilisez la syntaxe suivante pour modifier ce paramètre :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;RemarqueLa communauté ClickHouse recommande la valeur par défaut de 100. Définir cette valeur trop haut peut dégrader les performances. Une fois votre importation massive de données terminée, vous pouvez rétablir la valeur par défaut du paramètre.
Erreur de dépassement de limite mémoire pour insert into select
-
Cause : utilisation élevée de la mémoire.
Solution : Ajustez le paramètre
max_insert_threadspour réduire la consommation mémoire. -
Cause : utilisation d'une instruction
insert into selectpour importer des données entre clusters ClickHouse.Solution : Migrez les données en les important depuis des fichiers. Migration de données d'une instance ClickHouse auto-gérée vers ApsaraDB for ClickHouse Community Edition.
Interrogation de l'utilisation du CPU et de la mémoire
La table système system.query_log fournit des statistiques sur l'utilisation du CPU et de la mémoire pour chaque requête.
Dépannage des erreurs de limite mémoire
Le serveur ClickHouse suit l'utilisation de la mémoire à plusieurs niveaux. Pour une requête unique, un traceur mémoire agrège la consommation mémoire de tous ses threads d'exécution. Ce traceur transmet ensuite ses informations à un traceur mémoire global. La solution dépend de l'erreur spécifique que vous rencontrez.
Une erreur contenant
Memory limit (for query)signifie que la requête a échoué car elle a consommé trop de mémoire, dépassant sa limite fixée à 70 % de la capacité mémoire totale de l'instance. Pour y remédier, effectuez une mise à niveau verticale afin d'augmenter la capacité mémoire de l'instance.Une erreur contenant
Memory limit (for total)indique que l'utilisation globale de la mémoire sur l'instance a dépassé la limite système de 90 % de la capacité mémoire totale. Cette erreur peut résulter d'une forte concurrence des requêtes ou de tâches asynchrones en arrière-plan gourmandes en ressources, telles que les fusions de clés primaires exécutées après les écritures de données. Commencez par réduire la concurrence des requêtes. Si l'erreur persiste, effectuez une mise à niveau verticale pour augmenter la capacité mémoire de l'instance.
**Erreur SQL memory limit dans l'édition Enterprise**
Cause : Chaque nœud d'un cluster Alibaba Cloud ApsaraDB for ClickHouse Enterprise Edition dispose de 32 unités de calcul ClickHouse (CCU) et de 128 Go de mémoire. Le système d'exploitation utilise une partie de cette mémoire, laissant environ 115 Go disponibles pour l'exécution des requêtes. Par défaut, une requête SQL unique s'exécute sur un seul nœud. Une erreur memory limit survient si une requête utilise plus de 115 Go de mémoire.
La limite maximale de CCU d'un cluster détermine son nombre de nœuds. Si cette limite dépasse 64, le nombre de nœuds d'un cluster Enterprise Edition correspond à : Maximum CCU limit / 32. Si la limite maximale de CCU est égale ou inférieure à 64, le cluster Enterprise Edition comporte deux nœuds.
Solution : Ajoutez la clause SETTINGS suivante à votre instruction SQL pour activer l'exécution parallèle sur plusieurs nœuds. Cette technique répartit la charge mémoire, ce qui permet d'éviter l'erreur memory limit.
SETTINGS
allow_experimental_analyzer = 1,
allow_experimental_parallel_reading_from_replicas = 1;
Consommation mémoire excessive dans GROUP BY
Définissez le paramètre max_bytes_before_external_group_by pour limiter la consommation mémoire des opérations GROUP BY. Notez que le paramètre allow_experimental_analyzer détermine si ce paramètre prend effet.
Gestion des erreurs de dépassement de la limite de concurrence
La concurrence maximale de requêtes par défaut pour un serveur est de 100. Modifiez cette valeur dans la console :
Connectez-vous à la console ApsaraDB for ClickHouse.
Sur la page Clusters, sélectionnez Clusters of Community-compatible Edition, puis cliquez sur l'ID du cluster cible.
Dans le volet de navigation de gauche, cliquez sur Parameter Configuration.
Sur la page Parameter Configuration, cliquez sur l'icône de modification dans la colonne Parameter Value correspondant au paramètre
max_concurrent_queries.Saisissez la nouvelle valeur dans la boîte de dialogue, puis cliquez sur OK.
Cliquez sur Submit Parameters.
Cliquez sur OK.
Résultats de requête incohérents alors que les écritures de données ont cessé
Description du problème : Lors d'une requête de données utilisant select count(*), seule la moitié environ des données totales est retournée, ou les résultats fluctuent.
Envisagez les solutions suivantes :
Vérifiez si vous utilisez un cluster multi-nœuds. Dans ce type de cluster, vous devez créer une table distribuée. Effectuez les écritures et les requêtes sur cette table pour obtenir des résultats cohérents. Sinon, chaque requête risque d'atteindre un shard différent. Créer une table distribuée.
Vérifiez si vous utilisez un cluster maître-réplica. Dans un tel cluster, utilisez des tables dotées d'un moteur de la série Replicated pour synchroniser les données entre les réplicas. Autrement, chaque requête peut atteindre un réplica différent, entraînant des résultats incohérents. Moteurs de table.
Tables invisibles et résultats de requête fluctuants
Causes fréquentes et solutions associées :
-
Cause 1 : processus de création de table incorrect. Un cluster distribué ClickHouse ne possède pas de sémantique DDL distribuée native. Si vous utilisez une instruction
create tabledans un cluster ClickHouse auto-géré, l'instruction peut retourner un message de succès, mais la table n'est créée que sur le serveur actuellement connecté. Lorsque vous vous connectez à un autre serveur, la table reste invisible.Solution :
-
Lors de la création d'une table, utilisez l'instruction
create table <table_name> on cluster default. La clauseon cluster defaultdiffuse l'instruction à tous les nœuds du cluster par défaut.CREATE TABLE test ON cluster default (a UInt64) Engine = MergeTree() ORDER BY tuple(); -
Créez une autre table utilisant le moteur de table distribuée au-dessus de la table test.
CREATE TABLE test_dis ON cluster default AS test Engine = Distributed(default, default, test, cityHash64(a));
-
-
Cause 2 : configuration incorrecte de la table ReplicatedMergeTree. Le moteur de table ReplicatedMergeTree est une version améliorée du moteur MergeTree offrant la synchronisation maître-réplica. Sur une instance à réplica unique, vous ne pouvez créer que des tables avec le moteur
MergeTree. Sur une instance maître-réplica, vous devez créer des tables avec le moteur ReplicatedMergeTree.Solution : Lors de la création d'une table sur une instance maître-réplica, utilisez
ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')ouReplicatedMergeTree()pour configurer le moteur de table ReplicatedMergeTree. Les arguments dansReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')font partie d'un modèle fixe et ne doivent pas être modifiés.
Discrepances dans les données d'horodatage
Exécutez SELECT timezone() pour vérifier si le fuseau horaire correspond au fuseau local. Si ce n'est pas le cas, définissez l'élément de configuration 'timezone' sur le fuseau horaire local. Consultez Modifier les valeurs des paramètres d'exécution pour les éléments de configuration pour obtenir les instructions détaillées.
Table introuvable après sa création
Ce problème survient généralement lorsqu'une instruction DDL n'est exécutée que sur un seul nœud.
Pour résoudre ce problème, assurez-vous que l'instruction DDL inclut la clause on cluster. Syntaxe de création de table.
Absence de nouvelles données dans les tables externes Kafka
Commencez par exécuter une requête select * from sur la table externe Kafka. Si la requête échoue, examinez le message d'erreur, souvent dû à un échec d'analyse des données. Si la requête retourne des résultats, vérifiez la correspondance entre les champs de la table de destination (la table de stockage sous-jacente à la table externe Kafka) et ceux de la table externe Kafka. Un échec d'écriture des données indique une incompatibilité des champs. Par exemple :
insert into <destination table> as select * from <Kafka external table>;
Inadéquation entre l'heure du client et le fuseau horaire
Ce problème survient lorsque le paramètre use_client_time_zone est configuré avec un fuseau horaire incorrect.
Données invisibles après une opération d'écriture ?
Symptôme : Après l'écriture de données dans une table, les requêtes suivantes ne parviennent pas à retrouver ces données.
Cause : Les causes possibles incluent les éléments suivants :
Les schémas de la table distribuée et des tables locales sont incohérents.
Après l'écriture de données dans une table distribuée, la distribution des fichiers temporaires est incomplète.
Après l'écriture de données sur un réplica dans un cluster maître-réplica, la synchronisation des réplicas est incomplète.
Analyse et solutions :
Inconsistent schemas
Interrogez la table système system.distribution_queue pour vérifier les erreurs survenues lors des écritures dans la table distribuée.
Incomplete file distribution
Analyse de la cause : Dans un cluster ApsaraDB for ClickHouse multi-nœuds, si votre application se connecte à la base de données via un nom de domaine et exécute une instruction INSERT sur une table distribuée, un Server Load Balancer (SLB) frontal route la requête vers un nœud aléatoire du cluster. Le nœud recevant la requête écrit une partie des données sur son disque local et stocke le reste sous forme de fichiers temporaires. Ces fichiers sont ensuite distribués de manière asynchrone aux autres nœuds. Si une requête est exécutée avant la fin de ce processus de distribution, elle risque de ne pas retourner les données non encore distribuées.
Solution : Si votre application exige une forte cohérence lecture-après-écriture, ajoutez la clause settings insert_distributed_sync = 1 à votre instruction INSERT. Ce paramètre fait basculer l'opération INSERT en mode synchrone. L'instruction ne retourne un message de succès qu'une fois les données distribuées à tous les nœuds.
L'activation de ce paramètre augmente le temps d'exécution des instructions INSERT, car l'opération doit attendre la fin de la distribution des données. Évaluez le compromis entre la cohérence des données et les performances d'écriture pour votre application.
Ce paramètre s'applique au niveau du cluster et doit être utilisé avec prudence. Testez-le d'abord sur une requête unique. Après avoir vérifié les résultats, appliquez-le au niveau du cluster uniquement si votre activité l'exige.
-
Pour appliquer ce paramètre à une requête unique, ajoutez-le à la fin de l'instruction. Par exemple :
INSERT INTO <table_name> values() settings insert_distributed_sync = 1; Pour appliquer ce paramètre au niveau du cluster, configurez-le dans le fichier user.xml. Configurer les paramètres user.xml.
Incomplete replica synchronization
Analyse de la cause : Dans un cluster ApsaraDB for ClickHouse maître-réplica, lorsque vous exécutez une instruction INSERT, le cluster effectue l'opération sur un réplica choisi aléatoirement. Les données sont ensuite synchronisées de manière asynchrone vers l'autre réplica. Si une requête SELECT ultérieure est routée vers le réplica n'ayant pas encore terminé la synchronisation, la requête risque de ne pas retourner les données attendues.
Solution : Si votre application exige une forte cohérence lecture-après-écriture, ajoutez la clause settings insert_quorum = 2 à votre instruction INSERT. Ce paramètre force la synchronisation des réplicas à s'exécuter en mode synchrone. L'instruction INSERT ne retourne un message de succès qu'une fois la synchronisation des données terminée sur les deux réplicas.
Prenez en compte les points suivants lors de l'utilisation de ce paramètre :
Ce paramètre augmente le temps d'exécution des instructions INSERT, car l'opération doit attendre la fin de la synchronisation des réplicas. Évaluez le compromis entre la cohérence des données et les performances d'écriture pour votre application.
Une fois ce paramètre défini, les opérations
INSERTdoivent attendre que la synchronisation entre les réplicas réussisse. Cela signifie que si un réplica est indisponible, toutes les opérations d'écriture configurées avecinsert_quorum = 2échoueront, ce qui contredit la garantie de fiabilité d'une configuration à double réplica.Ce paramètre s'applique au niveau du cluster et doit être utilisé avec prudence. Testez-le d'abord sur une requête unique. Après avoir vérifié les résultats, appliquez-le au niveau du cluster uniquement si votre activité l'exige.
-
Pour appliquer ce paramètre à une requête unique, ajoutez-le à la fin de l'instruction. Par exemple :
INSERT INTO <table_name> values() settings insert_quorum = 2; Pour appliquer ce paramètre au niveau du cluster, configurez-le dans le fichier user.xml. Configurer les paramètres user.xml.
Pourquoi le TTL ne supprime pas les données expirées
Symptôme
Un TTL a été correctement configuré pour une table, mais les données expirées qu'elle contient ne sont pas supprimées automatiquement. La configuration du TTL n'est donc pas effective.
Étapes de dépannage
-
Vérifiez si la configuration du TTL de la table est appropriée.
Définissez le TTL en fonction de vos besoins métier. Nous recommandons de configurer le TTL au niveau du jour et d'éviter les réglages à la seconde ou à la minute, tels que
TTL event_time + INTERVAL 30 SECOND. -
Vérifiez le paramètre
materialize_ttl_after_modify.Ce paramètre détermine si une nouvelle règle TTL s'applique aux données existantes après l'exécution d'une instruction ALTER MODIFY TTL. La valeur par défaut est 1 (activé). Une valeur de 0 signifie que la règle ne s'applique qu'aux nouvelles données ; les données existantes ne sont alors pas affectées par le TTL.
-
Consultez la valeur du paramètre
SELECT * FROM system.settings WHERE name like 'materialize_ttl_after_modify'; -
Modifiez la valeur du paramètre
ImportantCette commande analyse toutes les données existantes et peut entraîner une charge importante sur les ressources. Utilisez-la avec prudence.
ALTER TABLE $table_name MATERIALIZE TTL;
-
-
Analysez la stratégie de nettoyage des partitions.
Lorsque le paramètre
ttl_only_drop_partsest défini sur 1, ClickHouse ne supprime une partie de données que si toutes les lignes qu'elle contient ont expiré.-
Vérifiez la valeur du paramètre
ttl_only_drop_partsSELECT * FROM system.merge_tree_settings WHERE name LIKE 'ttl_only_drop'; -
Examinez l'état d'expiration des partitions
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 : valeur minimale de la clé datetime utilisée pour la règle TTL DELETE dans cette partie.
delete_ttl_info_max : valeur maximale de la clé datetime utilisée pour la règle TTL DELETE dans cette partie.
-
Si les règles de partitionnement et de TTL ne sont pas alignées, certaines données risquent de ne pas être nettoyées rapidement. Les points suivants expliquent l'interaction entre ces deux types de règles.
Lorsque les règles sont alignées (par exemple, un partitionnement par jour associé à un TTL journalier), ClickHouse peut déterminer l'expiration à partir de l'ID de partition et supprimer une partition entière en une seule fois. Il s'agit de la stratégie la plus efficace. Pour des performances optimales, nous recommandons de combiner une stratégie de partitionnement (par jour, par exemple) avec ttl_only_drop_parts=1 afin de supprimer efficacement les données expirées.
Si les règles ne sont pas alignées et que
ttl_only_drop_parts = 1, ClickHouse vérifie les informations TTL de chaque partie. Une partie n'est supprimée que lorsque toutes ses données ont dépassé l'horodatagedelete_ttl_info_max.Si les règles ne sont pas alignées et que
ttl_only_drop_parts = 0, ClickHouse doit analyser les données de chaque partie pour identifier et supprimer individuellement les lignes expirées. Cette stratégie consomme le plus de ressources.
-
-
Contrôlez la fréquence de déclenchement des fusions.
La suppression des données expirées s'effectue de manière asynchrone lors des fusions, et non en temps réel. Vous pouvez contrôler la fréquence des fusions à l'aide du paramètre merge_with_ttl_timeout ou forcer la matérialisation du TTL en utilisant l'instruction ALTER TABLE ... MATERIALIZE TTL.
-
Vérifiez le paramètre
SELECT * FROM system.merge_tree_settings WHERE name = 'merge_with_ttl_timeout';RemarqueL'unité est la seconde. Pour une instance en ligne, la valeur par défaut est de 7 200 secondes (2 heures).
-
Modifiez le paramètre
Si la valeur de merge_with_ttl_timeout est trop élevée, la fréquence de déclenchement des fusions TTL diminue, ce qui retarde le nettoyage des données expirées. Réduisez cette valeur pour augmenter la fréquence de nettoyage. Pour plus de détails, consultez Description du paramètre.
-
-
Vérifiez les paramètres du pool de threads.
La suppression des données TTL intervient durant la phase de fusion des parties. Elle est limitée par les paramètres
max_number_of_merges_with_ttl_in_pool(valeur par défaut : 2 pour les instances en ligne) etbackground_pool_size(valeur par défaut : 16 pour les instances en ligne).-
Interrogez l'activité actuelle des threads d'arrière-plan
SELECT * FROM system.metrics WHERE metric LIKE 'Background%';La métrique
BackgroundPoolTaskindique le nombre de tâches actuellement actives dans le pool d'arrière-plan. -
Modifiez les paramètres
Si vos autres paramètres sont corrects et que l'utilisation du CPU est faible, envisagez d'augmenter le paramètre
max_number_of_merges_with_ttl_in_poolselon vos besoins métier (par exemple, de 2 à 4, ou de 4 à 8). Si cela ne résout pas le problème, augmentez le paramètrebackground_pool_size.ImportantVous devez redémarrer le cluster si vous ajustez le paramètre
max_number_of_merges_with_ttl_in_pool. En revanche, augmenter le paramètrebackground_pool_sizene nécessite pas de redémarrage, mais le diminuer exige un redémarrage du cluster.
-
-
Vérifiez si le schéma de la table et la conception des partitions sont adaptés.
Si une table n'est pas partitionnée efficacement ou si la granularité des partitions est trop grossière, l'efficacité du nettoyage TTL diminue. Pour un nettoyage optimal, nous recommandons d'aligner la granularité des partitions sur celle du TTL (par exemple, en définissant les deux sur un intervalle journalier). Pour plus de détails, consultez les Bonnes pratiques.
-
Vérifiez si le cluster dispose d'un espace disque suffisant.
Les opérations de fusion en arrière-plan déclenchent le nettoyage TTL et nécessitent de l'espace disque disponible. Des parties de données volumineuses ou un espace disque insuffisant (par exemple, une utilisation supérieure à 90 %) peuvent empêcher les opérations de fusion et les suppressions TTL qui en découlent.
-
Examinez les autres paramètres système dans
system.merge_tree_settings.merge_with_recompression_ttl_timeout : délai minimum avant qu'une fusion avec recompression TTL puisse se répéter. Par défaut, les règles TTL sont appliquées à une table au moins toutes les 4 heures. Réduisez cette valeur si vous devez appliquer les règles TTL plus fréquemment.
max_number_of_merges_with_ttl_in_pool : ce paramètre contrôle le nombre maximal de threads disponibles pour les tâches TTL. Si le nombre de tâches de fusion avec TTL en cours dans le pool de threads d'arrière-plan dépasse cette valeur, ClickHouse ne planifie plus de nouvelles tâches de fusion avec TTL.
Lenteur des tâches optimize
Une tâche optimize sollicite intensivement le CPU et le disque. Elle entre en concurrence pour les ressources avec les requêtes simultanées, ce qui peut ralentir son exécution en cas de charge importante.
Échec de la fusion des clés primaires après optimize
Le bon fonctionnement d'une primary key merge requiert les deux conditions préalables suivantes.
La clé
ORDER BYdoit inclure lapartition keyde lastorage table. Uneprimary key mergene s'effectue pas entre différentes partitions.Pour une
distributed table, la cléORDER BYdoit inclure la clé de sharding, déterminée par l'hash algorithm. Uneprimary key mergene s'effectue pas entre différents nœuds.
Le tableau suivant décrit les commandes optimize courantes et leur comportement.
|
Commande |
Description |
|
|
Cette commande tente de sélectionner et de fusionner des |
|
|
Cette commande cible une Remarque
Pour les tables sans |
|
|
Cette commande force la fusion de toutes les partitions de la table. Elle refusionne les partitions même si elles sont déjà constituées d'un seul |
Pour chacune de ces commandes optimize, vous pouvez définir le paramètre optimize_throw_if_noop. Si ce paramètre est activé, la commande lève une exception lorsqu'aucune fusion n'est effectuée, ce qui permet de vérifier si la tâche a réellement été exécutée.
Inefficacité du TTL des données après optimize
Voici les causes fréquentes et leurs solutions.
-
Cause 1 : L'éviction des données TTL se produit lors de la phase de fusion des clés primaires. Si une partie de données n'est pas fusionnée pendant une période prolongée, le système ne peut pas évacuer les données expirées qu'elle contient.
Solution :
Déclenchez manuellement une tâche de fusion en exécutant
optimize finalouoptimize a specific partition.Lors de la création d'une table, définissez des paramètres tels que merge_with_ttl_timeout et ttl_only_drop_parts pour fusionner plus fréquemment les parties de données contenant des données expirées.
-
Cause 2 : Si le TTL d'une table est modifié ou ajouté, les parties de données existantes peuvent présenter des informations TTL manquantes ou incorrectes. Cela peut également empêcher l'éviction des données expirées.
Solution :
Régénérez les informations TTL en exécutant
alter table materialize ttl.Mettez à jour les informations TTL en exécutant
optimize partition.
Mises à jour et suppressions sans effet après OPTIMIZE
ApsaraDB for ClickHouse exécute les opérations de mise à jour et de suppression de manière asynchrone. Suivez la progression en interrogeant la table système system.mutations.
Ajout, suppression ou modification de colonnes via DDL
Pour modifier une table locale, exécutez une instruction DDL. Pour une table distribuée, la procédure dépend de l'écriture en cours de données dans celle-ci.
Si aucune donnée n'est écrite dans la table, modifiez d'abord la table locale, puis la table distribuée.
-
Si des données sont en cours d'écriture, la procédure varie selon le type de modification.
Type
Actions
Ajout d'une colonne nullable
-
Modifiez la table locale.
-
Modifiez la table distribuée.
Modification du type de données d'une colonne (vers un type convertible)
Suppression d'une colonne nullable
-
Modifiez la table distribuée.
-
Modifiez la table locale.
Ajout d'une colonne non nullable
-
Arrêtez l'écriture des données.
-
Exécutez
SYSTEM FLUSH DISTRIBUTEDsur la table distribuée. -
Modifiez la table locale.
-
Modifiez la table distribuée.
-
Reprenez l'écriture des données.
Suppression d'une colonne non nullable
Renommage d'une colonne
-
Opérations DDL lentes ou bloquées
L'exécution des DDL globales est séquentielle, et les requêtes complexes peuvent provoquer des interblocages.
Essayez les solutions suivantes :
Attendez la fin de l'opération.
Tentez d'interrompre la requête depuis la console.
Erreur de délai d'attente des tâches DDL distribuées
Modifiez le délai d'attente par défaut en exécutant set global on cluster default distributed_ddl_task_timeout=xxx, où xxx correspond au délai en secondes. Modifier les paramètres du cluster.
Erreur de syntaxe : « set global on cluster default »
-
Cause 1 : Le client ClickHouse analyse la syntaxe. Or,
set global on cluster defaultest une syntaxe côté serveur. Si la version du client est incompatible avec celle du serveur, le client bloque cette instruction.Solution :
Utilisez un outil n'effectuant pas d'analyse syntaxique côté client, comme les outils basés sur JDBC (DataGrip, DBeaver).
Écrivez un programme JDBC pour exécuter l'instruction.
-
Cause 2 : Dans l'instruction
set global on cluster default key = value;, lavalueest une chaîne de caractères non encadrée par des guillemets.Solution : Placez la valeur de la chaîne entre guillemets.
Outil BI recommandé
Nous recommandons Quick BI.
IDE de requête de données recommandés
DataGrip, DBeaver.
Prise en charge de la recherche vectorielle
Oui. ApsaraDB for ClickHouse prend en charge la recherche vectorielle. Ressources associées :
Résoudre l'erreur ON CLUSTER is not allowed for Replicated database
Si votre cluster est une édition Enterprise et que l'instruction de création de table inclut ON CLUSTER default, vous pouvez rencontrer l'erreur ON CLUSTER is not allowed for Replicated database. Ce problème survient dans certaines versions mineures. Mettez à jour votre instance vers la dernière version. Mettre à jour les versions mineures du moteur.
Résoudre l'erreur Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny')
Problème : Sur un cluster Community Edition multi-nœuds, vous pouvez rencontrer l'erreur Exception: Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny'). lorsqu'une requête utilise JOIN ou IN pour joindre plusieurs tables distribuées.
Cause : La jointure de plusieurs tables distribuées dans une même requête peut provoquer une amplification des requêtes. Par exemple, dans un cluster à trois nœuds, une requête de jointure entre deux tables distribuées se transforme en 3 x 3 sous-requêtes sur les tables locales sous-jacentes. Cela consomme des ressources importantes et augmente la latence. Pour éviter cela, le système bloque ces requêtes par défaut.
Fonctionnement : En remplaçant l'opérateur IN ou JOIN par GLOBAL IN ou GLOBAL JOIN, vous indiquez au moteur d'exécuter la sous-requête de droite sur un seul nœud. Le résultat est stocké dans une table temporaire, puis diffusé à tous les autres nœuds pour compléter la jointure localement.
Impact de l'utilisation de GLOBAL IN ou GLOBAL JOIN :
La table temporaire est envoyée à tous les serveurs distants. Évitez cette stratégie pour les jeux de données volumineux.
-
L'utilisation de
GLOBAL INouGLOBAL JOINavec la fonctionremote()peut produire des résultats incorrects. En effet, la sous-requête, qui devrait s'exécuter sur l'instance externe, s'exécute à la place sur l'instance actuelle.Par exemple, vous exécutez l'instruction suivante sur
instance_apour interroger des données depuis l'instance externecc-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);Dans ce cas,
instance_aexécute la sous-requêteSELECT id FROM test_tbl_distributed1pour générer une table temporaire, appelons-latemp_table_A. Les données detemp_table_Asont ensuite envoyées à l'instance externecc-bp1wc089c****pour la requête finale. L'instance externecc-bp1wc089c****exécute finalement l'instructionSELECT * FROM default.test_tbl_distributed1 WHERE id IN (temp_table_A);.Le problème provient de la source des données de la table temporaire.
Selon la description ci-dessus, l'instruction finale exécutée par l'instance
cc-bp1wc089c****estSELECT * FROM default.test_tbl_distributed1 WHERE id IN (temporary table A);. Cependant, l'ensemble de conditions défini dans la table temporaire A est généré sur l'instance a. Dans cet exemple, l'instancecc-bp1wc089c****aurait dû exécuterSELECT * FROM default.test_tbl_distributed1 WHERE id IN (SELECT id FROM test_tbl_distributed1 );, et l'ensemble de conditions aurait dû provenir de l'instancecc-bp1wc089c****. Par conséquent, l'utilisation de GLOBAL IN ou GLOBAL JOIN amène la sous-requête à récupérer l'ensemble de conditions depuis une source incorrecte, ce qui conduit à un résultat erroné.
Solutions :
Solution 1 : Modifiez le code SQL de votre application pour remplacer manuellement IN ou JOIN par GLOBAL IN ou GLOBAL JOIN.
Par exemple, changez cette instruction :
SELECT * FROM test_tbl_distributed WHERE id IN (SELECT id FROM test_tbl_distributed1);
en :
SELECT * FROM test_tbl_distributed WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);
Solution 2 : Modifiez le paramètre système distributed_product_mode ou prefer_global_in_and_join afin que le système convertisse automatiquement IN ou JOIN en GLOBAL IN ou GLOBAL JOIN.
distributed_product_mode
Exécutez l'instruction suivante pour définir distributed_product_mode sur global. Ce paramètre convertit automatiquement les opérations IN ou JOIN standard en GLOBAL IN ou GLOBAL JOIN lorsque cela est nécessaire.
SET GLOBAL ON cluster default distributed_product_mode='global';
Utilisation
Objectif : Contrôle la manière dont ClickHouse gère les sous-requêtes distribuées.
-
Valeurs :
deny(par défaut) : Interdit les sous-requêtes distribuéesINetJOINet lève l'exception"Double-distributed IN/JOIN subqueries is denied".local: Réécrit la sous-requête pour utiliser la table locale sur le shard cible, en conservant un opérateurINouJOINstandard.global: Convertit les requêtesINouJOINen requêtesGLOBAL INouGLOBAL JOIN.allow: Autorise les sous-requêtesINetJOINstandard, ce qui peut provoquer une amplification des requêtes.
Scénarios applicables : S'applique uniquement aux requêtes utilisant
INouJOINpour joindre plusieurs tables distribuées.
prefer_global_in_and_join
prefer_global_in_and_join
Exécutez l'instruction suivante pour définir le paramètre prefer_global_in_and_join sur 1. Ce paramètre convertit automatiquement les opérations IN ou JOIN standard en GLOBAL IN ou GLOBAL JOIN.
SET GLOBAL ON cluster default prefer_global_in_and_join = 1;
Utilisation
Objectif : Contrôle le comportement des opérateurs
INetJOIN.-
Valeurs :
0(par défaut) : Interdit les sous-requêtes distribuéesINetJOINet lève l'exception"Double-distributed IN/JOIN subqueries is denied".1: Active les sous-requêtes distribuéesINetJOINen les convertissant automatiquement en requêtesGLOBAL INouGLOBAL JOIN.
Scénarios applicables : S'applique uniquement aux requêtes utilisant
INouJOINpour joindre plusieurs tables distribuées.
Consulter l'espace disque des tables
Pour consulter l'espace disque utilisé par chaque table, exécutez la requête suivante.
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;
Consulter la taille des données froides
Voici un exemple de requête :
SELECT * FROM system.disks;
Interroger les données en stockage froid
Utilisez la requête suivante :
SELECT * FROM system.parts WHERE disk_name = 'cold_disk';
Déplacer des données de partition vers le stockage froid
Pour déplacer une partition de données vers le stockage froid, exécutez l'instruction suivante :
ALTER TABLE table_name MOVE PARTITION partition_expr TO DISK 'cold_disk';
Lacunes dans les données de surveillance
Les causes fréquentes incluent :
Une requête déclenchant une erreur OOM.
Un redémarrage d'instance provoqué par un changement de configuration.
Un redémarrage d'instance suite à une mise à niveau ou à une rétrogradation.
Mise à niveau fluide sans migration de données
La prise en charge d'une mise à niveau fluide par un cluster ClickHouse dépend de sa date de création. Les clusters achetés après le 1er décembre 2021 prennent en charge une mise à niveau sur place sans migration de données. Les clusters achetés avant cette date nécessitent une migration des données. Mettre à niveau la version majeure du moteur.
Tables système courantes
Le tableau suivant décrit les tables système courantes et leurs fonctions.
|
Paramètre |
Description |
|
system.processes |
Contient des informations sur les instructions SQL en cours d'exécution. |
|
system.query_log |
Contient un journal des instructions SQL exécutées. |
|
system.merges |
Contient des informations sur les opérations de fusion du cluster. |
|
system.mutations |
Contient des informations sur les opérations de mutation du cluster. |
Modifier les paramètres au niveau système
Les paramètres au niveau système correspondent aux paramètres du fichier config.xml. Pour les modifier :
Connectez-vous à la console ApsaraDB for ClickHouse.
Sur la page Clusters, sélectionnez Clusters of Community-compatible Edition, puis cliquez sur l'ID du cluster cible.
Dans le volet de navigation de gauche, cliquez sur Parameter Configuration.
Sur la page Parameter Configuration, cliquez sur l'icône de modification dans la colonne Parameter Value correspondant au paramètre
max_concurrent_queries.Saisissez la nouvelle valeur dans la boîte de dialogue et cliquez sur OK.
Cliquez sur Submit Parameters.
Cliquez sur OK.
Après avoir cliqué sur OK, le processus clickhouse-server redémarre automatiquement, ce qui entraîne une déconnexion transitoire d'environ 1 minute.
Modifier les paramètres au niveau utilisateur
Les paramètres au niveau utilisateur correspondent aux éléments de configuration du fichier users.xml. Pour modifier un paramètre, exécutez l'instruction suivante.
SET global ON cluster default ${key}=${value};
Sauf indication contraire, la modification prend effet immédiatement.
Modifier un quota
Spécifiez le paramètre de quota dans les settings d'une instruction d'exécution :
settings max_memory_usage = XXX;
Variation de l'utilisation du CPU et de la mémoire entre les nœuds
Dans un cluster multi-node à dual-replica ou à single-replica, le write node présente une CPU usage et une memory usage plus élevées que les autres node s lors d'write operation s intensives. L'utilisation s'équilibre entre les node s une fois les données synchronisées.
Consulter les journaux système détaillés
-
Description du problème :
Comment consulter les journaux système détaillés pour résoudre des erreurs ou identifier des problèmes potentiels.
-
Solution :
-
Vérifiez le paramètre
text_log.levelde votre cluster et effectuez l'une des actions suivantes :Si
text_log.levelest vide, la journalisation texte est désactivée. Pour l'activer, définissez une valeur pour ce paramètre.Si
text_log.levelpossède une valeur, vérifiez que le niveau de journalisation répond à vos besoins. Sinon, modifiez le paramètre pour atteindre le niveau souhaité.
Connectez-vous à la base de données cible. Se connecter à une base de données.
-
Exécutez l'instruction suivante pour consulter et analyser les journaux.
SELECT * FROM system.text_log;
-
Résolution des problèmes de connectivité réseau
Si le cluster de destination et la source de données se trouvent dans le même VPC et la même région, vérifiez que l'adresse IP de chacun figure dans la liste d'autorisation de l'autre.
Pour configurer la liste d'autorisation ClickHouse, consultez Set a Whitelist.
Pour les autres sources de données, reportez-vous à la documentation produit correspondante.
Si ces conditions ne sont pas remplies, établissez d'abord la connectivité au moyen d'une solution réseau adaptée. Ajoutez ensuite l'adresse IP de chaque entité dans la liste d'autorisation de l'autre.
|
Scénario |
Solution |
|
Connectivité cloud hybride |
|
|
Connectivité VPC interrégionale et intercompte |
|
|
Connectivité VPC dans la même région |
Use Cloud Enterprise Network to Achieve Same-region VPC Connectivity (Basic Edition) |
|
Connectivité VPC interrégionale et intercompte |
|
|
Connectivité réseau public |
|
|
Conflit d'adresses |
Migration de l'édition Community vers l'édition Enterprise
Oui, vous pouvez migrer un cluster ClickHouse édition Community vers un cluster édition Enterprise.
La migration des données entre les clusters édition Enterprise et édition Community s'effectue via la fonction remote ou par exportation et importation de fichiers de données. Migrate data from a self-managed ClickHouse cluster to Alibaba Cloud ClickHouse Community-Compatible Edition.
Schémas incohérents lors de la migration des données
Description du problème
La migration des données exige des schémas de base de données et de tables identiques sur tous les shards. À défaut, certaines bases de données ou tables peuvent échouer lors de la migration.
Solutions
-
Le schéma d'une table MergeTree (hors table interne d'une vue matérialisée) présente des incohérences entre les shards.
Vérifiez si votre logique métier est à l'origine de ces écarts de schéma entre les shards :
Si les schémas de table doivent être identiques sur tous les shards, recréez les tables pour garantir leur cohérence.
Si votre logique métier requiert intentionnellement des schémas différents selon les shards, Submit a ticket afin de contacter le support technique.
-
La table interne d'une vue matérialisée est incohérente entre les shards.
-
Solution 1 : renommez les tables internes et faites pointer explicitement la vue matérialisée ainsi que la table distribuée vers la table MergeTree cible. La procédure suivante prend comme exemple la vue matérialisée d'origine
up_down_votes_per_day_mv.-
Listez les tables absentes sur certains nœuds.
NODE_NUM= Nombre de shards × Nombre 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>; -
Identifiez les vues matérialisées dont le nombre de tables internes est incorrect.
SELECT substring(hostName(),38,8) AS host,* FROM cluster(default, system.tables) WHERE uuid IN (<UUID1>, <UUID2>, ...); -
Désactivez le comportement de synchronisation par défaut du cluster. Cette étape est obligatoire pour les clusters ApsaraDB for ClickHouse, mais pas pour les clusters ClickHouse auto-gérés. Renommez ensuite la table interne pour assurer la cohérence sur tous les nœuds. Afin de limiter les risques opérationnels, obtenez l'adresse IP de chaque nœud, connectez-vous au port 3005, puis exécutez les instructions suivantes individuellement sur chaque nœud.
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`; -
Supprimez la vue matérialisée. Exécutez les instructions suivantes individuellement sur chaque nœud.
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; -
Créez une nouvelle vue matérialisée pointant explicitement vers la table interne renommée. Exécutez les instructions suivantes individuellement sur chaque nœud.
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;Remarque : Vous devez définir explicitement les colonnes de la table cible dans la définition de la vue matérialisée. Ne vous fiez pas à l'inférence de type basée sur l'instruction SELECT, car cela peut provoquer des erreurs inattendues. Par exemple, si une colonne nommée
tcp_cnest calculée à l'aide d'une fonction d'état d'agrégation telle quesumIfStatedans l'instructionSELECT, vous devez déclarer son type dans la table cible en tant qu'AggregateFunction, par exempleAggregateFunction(sum, Float64).Utilisation correcte
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 ...Utilisation incorrecte
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 ...
-
Solution 2 : renommez les tables internes, reconstruisez les vues matérialisées sur tous les nœuds, puis migrez les données depuis les anciennes tables internes.
Solution 3 : mettez en place une stratégie de double écriture pour les vues matérialisées et prévoyez 7 jours pour la synchronisation des données.
-
Échec d'instructions SQL dans l'édition Enterprise 24.5 ou ultérieure
Par défaut, les instances de l'édition Enterprise 24.5 ou ultérieure utilisent le nouvel analyseur de requêtes. Bien que plus performant, cet analyseur peut ne pas être rétrocompatible avec certaines instructions SQL héritées. En cas d'erreur d'analyse syntaxique, revenez à l'ancien analyseur. Learn more about the new analyzer.
SET allow_experimental_analyzer = 0;
Suspendre un cluster
La fonctionnalité de suspension est exclusivement disponible pour les clusters édition Enterprise. Les clusters ClickHouse édition Community ne peuvent pas être suspendus. Pour suspendre un cluster édition Enterprise, accédez à la page des clusters édition Enterprise. Sélectionnez la région cible dans le coin supérieur gauche. Dans la liste des clusters, localisez le cluster concerné, puis cliquez sur
> Suspend dans la colonne Actions.
Convertir une table MergeTree en ReplicatedMergeTree
Description du problème
Les utilisateurs peu familiers avec ClickHouse créent parfois par erreur des tables utilisant le moteur MergeTree dans un cluster multi-réplicas. Cela empêche la synchronisation des données entre les nœuds réplicas de chaque shard. Par conséquent, les requêtes sur la table distribuée correspondante peuvent retourner des résultats incohérents. Pour résoudre ce problème, convertissez la table MergeTree en table ReplicatedMergeTree.
Solution
ClickHouse ne fournit aucune instruction DDL permettant de modifier directement le moteur de stockage d'une table. Pour convertir une table MergeTree en ReplicatedMergeTree, créez une nouvelle table avec le moteur ReplicatedMergeTree, puis importez-y les données de la table d'origine.
Prenons l'exemple d'une table MergeTree nommée table_src et de sa table distribuée associée table_dst_d dans un cluster multi-réplicas. Pour convertir cette table MergeTree en ReplicatedMergeTree, procédez comme suit :
Créez la table ReplicatedMergeTree cible,
table_dst, ainsi que sa table distribuée correspondante,table_dst_d. CREATE TABLE.Importez les données de la table MergeTree
table_srcverstable_dst_d. Deux méthodes s'offrent à vous.
Ces deux méthodes interrogent les données sources depuis la table MergeTree locale.
Pour un volume de données réduit, insérez directement les données dans la table distribuée
table_dst_dafin d'assurer une répartition uniforme.Si les données de la table MergeTree d'origine
table_srcsont déjà équilibrées entre les nœuds et que le volume est important, insérez les données directement dans la table ReplicatedMergeTree localetable_dstsur chaque nœud.L'importation d'un jeu de données volumineux peut prendre beaucoup de temps. Lors de l'utilisation de la fonction
remote(), assurez-vous de configurer une valeur de délai d'expiration appropriée.
Utiliser la fonction remote
-
Obtenez l'adresse IP de chaque nœud.
SELECT cluster, shard_num, replica_num, is_local, host_address FROM system.clusters WHERE cluster = 'default'; -
Importez les données à l'aide de la fonction remote.
Transmettez séquentiellement les adresses IP obtenues à l'étape précédente à la fonction
remote()et exécutez l'instruction pour chacune d'elles.INSERT INTO table_dst_d SELECT * FROM remote('node1', db.table_src) ;Par exemple, si les adresses IP de deux nœuds sont
10.10.0.165et10.10.0.167, exécutez séparément les instructionsINSERTsuivantes :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) ;L'exécution des instructions pour toutes les adresses IP des nœuds convertit la table MergeTree en table ReplicatedMergeTree.
Utiliser les tables locales
Si une instance ECS dotée du client ClickHouse est déployée dans votre VPC, connectez-vous séparément à chaque nœud pour effectuer les opérations suivantes.
-
Obtenez l'adresse IP de chaque nœud.
SELECT cluster, shard_num, replica_num, is_local, host_address FROM system.clusters WHERE cluster = 'default'; -
Importez les données.
Connectez-vous successivement à chaque nœud via son adresse IP, puis exécutez l'instruction suivante.
INSERT INTO table_dst_d SELECT * FROM db.table_src ;L'exécution de cette instruction sur l'ensemble des nœuds convertit la table MergeTree en table ReplicatedMergeTree.
Exécuter plusieurs instructions SQL dans la même session
Définir un session_id unique garantit que le serveur ClickHouse maintient un contexte cohérent pour les requêtes partageant le même session ID. Cela permet d'exécuter plusieurs instructions SQL au sein d'une seule session. L'exemple ci-dessous illustre cette approche avec le ClickHouse Java Client (V2).
-
Ajoutez la dépendance au fichier pom.xml de votre projet Maven.
<dependency> <groupId>com.clickhouse</groupId> <artifactId>client-v2</artifactId> <version>0.8.2</version> </dependency> -
Définissez un
session IDpersonnalisé dans 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(); } } }
Dans cet exemple, les deux instructions SELECT s'exécutent dans la même session avec un max_block_size fixé à 65409. ClickHouse Java Client : Java Client | ClickHouse Docs.
Pourquoi la déduplication avec FINAL échoue-t-elle lors d'un JOIN ?
Symptôme
Lorsque vous utilisez le mot-clé FINAL pour dédupliquer les résultats d'une requête, la déduplication échoue si l'instruction SQL contient une clause JOIN. Des données dupliquées subsistent alors dans le résultat. Voici un exemple d'instruction SQL concernée :
SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;
Cause
Il s'agit d'un bug connu et non corrigé dans ClickHouse. L'échec de la déduplication résulte d'un conflit entre la logique d'exécution de FINAL et celle de JOIN. ClickHouse issue #8655.
Solution
-
Solution 1 (Recommandée) : Activez l'optimiseur expérimental. Activez
FINALau niveau de la requête en ajoutant un paramètre à votre requête. Cette méthode ne nécessite aucune déclaration au niveau de la table. Exemple :Si l'instruction SQL d'origine est :
SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;Retirez le mot-clé
FINALdu nom de la table et ajoutez les paramètres allow_experimental_analyzer = 1,FINAL = 1 à l'instruction. L'instruction modifiée devient :SELECT * FROM t1 JOIN t2 WHERE xxx SETTINGS allow_experimental_analyzer = 1, FINAL = 1;ImportantLe paramètre
allow_experimental_analyzerest pris en charge uniquement à partir de la version 23.8. Si vous utilisez une version antérieure, effectuez une mise à niveau avant de modifier l'instruction SQL. Upgrade a major engine version. -
Solution 2 (À utiliser avec prudence) :
Forcez une fusion pour la déduplication en exécutant périodiquement
OPTIMIZE TABLE local_table_name FINAL. Cela fusionne les données en amont, mais doit être utilisé avec précaution sur les tables volumineuses en raison de la charge E/S élevée engendrée.Modifiez la requête SQL : supprimez le mot-clé
FINAL. La déduplication des données repose alors sur l'interrogation des données déjà fusionnées.
ImportantUtilisez cette approche avec précaution, car cette opération consomme des ressources E/S importantes et peut affecter les performances des tables volumineuses.
Pourquoi les opérations DELETE ou UPDATE restent-elles incomplètes ?
Symptôme
Lors de l'exécution d'opérations de suppression (DELETE) ou de mise à jour (UPDATE) dans un cluster ApsaraDB for ClickHouse édition compatible Community, les tâches restent incomplètes pendant une durée prolongée.
Cause
Contrairement aux opérations synchrones de MySQL, les opérations DELETE et UPDATE dans un cluster ApsaraDB for ClickHouse édition compatible Community sont asynchrones et reposent sur le mécanisme de Mutation. Les modifications ne prennent donc pas effet en temps réel. Le processus central d'une Mutation se déroule comme suit :
Soumission de la tâche : l'utilisateur exécute la commande
ALTER TABLE ... UPDATE/DELETEpour générer une tâche asynchrone.Marquage des données : le système crée en arrière-plan un fichier
mutation_*.txtqui enregistre la plage de données à modifier. Les changements ne sont pas appliqués immédiatement.Réécriture en arrière-plan : ClickHouse réécrit progressivement les
data partconcernés et applique les modifications lors du processus de fusion.Nettoyage des anciennes données : une fois la fusion terminée, les anciens blocs de données sont marqués pour suppression.
Par conséquent, lancer un trop grand nombre d'opérations de Mutation sur une courte période peut bloquer les tâches et laisser les opérations DELETE et UPDATE incomplètes. Pour éviter toute accumulation, exécutez l'instruction SQL suivante afin de vérifier les Mutations en cours avant d'en lancer une nouvelle.
SELECT * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;
Solution
-
Vérifiez si un nombre excessif de tâches de Mutation est en cours d'exécution sur le cluster.
Exécutez l'instruction SQL suivante pour consulter l'état actuel des Mutations dans le cluster :
SELECT * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0; -
Si de nombreuses tâches de Mutation sont en cours, utilisez un compte privilégié pour en annuler une partie ou la totalité.
-
Annulez toutes les tâches de Mutation sur une table donnée.
KILL MUTATION WHERE database = 'default' AND table = '<table_name>' -
Annulez une tâche de Mutation spécifique.
KILL MUTATION WHERE database = 'default' AND table = '<table_name>' AND mutation_id = '<mutation_id>'Pour obtenir le mutation_id, exécutez l'instruction SQL suivante :
SELECT mutation_id, * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;
-
Comment résoudre l'erreur « Code: 241. DB::Exception: Memory limit (total) exceeded » dans ApsaraDB for ClickHouse édition Enterprise ?
-
Symptôme : Lors de l'exécution d'une instruction SQL, vous rencontrez le message d'erreur suivant, alors même que la mémoire totale de votre cluster dépasse la limite indiquée :
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)) -
Cause : Dans ApsaraDB for ClickHouse édition Enterprise, chaque nœud dispose d'une limite CCU (maximum 32 CCU, 1 CCU équivalant approximativement à 1 vCore et 4 Gio de mémoire). Si une requête SQL consomme plus de mémoire que le seuil du nœud, MemoryTracker intercepte la requête. Le seuil par défaut correspond à 0,9 fois la mémoire totale du nœud. Exécutez l'instruction SQL suivante pour consulter ce seuil :
SELECT * FROM system.server_settings WHERE name = 'max_server_memory_usage_to_ram_ratio'; Solution : Définissez le paramètre allow_experimental_parallel_reading_from_replicas sur 1. Cela répartit la phase de lecture des données sur plusieurs nœuds, diluant ainsi la consommation mémoire. Enterprise Edition.
Pourquoi les résultats de requête sont-ils incohérents ?
Symptôme
Dans un cluster ApsaraDB for ClickHouse édition compatible Community, l'exécution répétée d'une même instruction SQL retourne des résultats incohérents.
Cause
Deux raisons principales expliquent l'incohérence des résultats pour une même requête dans un cluster ApsaraDB for ClickHouse édition compatible Community :
-
Les requêtes ciblent une table locale dans un cluster multi-shards.
Dans un cluster multi-shards ApsaraDB for ClickHouse édition compatible Community, vous devez créer une table distribuée en plus des tables locales. Le processus d'écriture des données fonctionne alors comme suit :
Les données sont d'abord écrites dans la table distribuée, qui les répartit ensuite vers les tables locales des différents shards pour stockage.
Lors de l'interrogation des données, la source varie selon le type de table consulté :
Interrogation d'une table distribuée : la table distribuée agrège et retourne les données provenant des tables locales de tous les shards.
Interrogation d'une table locale : chaque requête retourne les données de la table locale d'un shard sélectionné aléatoirement, ce qui provoque des résultats incohérents.
-
Une table d'un cluster à deux réplicas n'a pas été créée avec un moteur de la série Replicated*.
Dans un cluster à deux réplicas ApsaraDB for ClickHouse édition compatible Community, les tables doivent être créées avec un moteur de la série Replicated*, tel que ReplicatedMergeTree, afin de permettre la synchronisation des données entre les réplicas.
Si une table d'un cluster à deux réplicas est créée sans moteur de la série Replicated*, les données ne sont pas synchronisées entre les réplicas, ce qui peut entraîner des résultats de requête incohérents.
Solution
-
Déterminez le type de cluster.
Consultez les informations du cluster pour déterminer s'il s'agit d'un cluster multi-shards, d'un cluster à deux réplicas ou d'un cluster combinant les deux. Procédez comme suit :
Connectez-vous à la console ApsaraDB for ClickHouse.
Dans le coin supérieur gauche de la page, sélectionnez Clusters of Community-compatible Edition.
-
Dans la liste des clusters, cliquez sur l'ID du cluster cible pour ouvrir sa page d'informations.
Consultez le champ Edition dans la section Cluster Properties ainsi que les Node Groups dans la section Configuration Information. Déterminez le type de cluster selon les critères suivants :
Si le nombre de groupes de nœuds est supérieur à 1, il s'agit d'un cluster multi-shards.
Si la série est High-availability Edition, il s'agit d'un cluster à deux réplicas.
Si les deux conditions sont réunies, il s'agit d'un cluster multi-shards à deux réplicas.
-
Choisissez une solution adaptée au type de cluster.
Cluster multi-shards
Vérifiez le type de la table interrogée. S'il s'agit d'une table locale, interrogez plutôt la table distribuée.
Si aucune table distribuée n'existe, créez-en une. Create a table.
Cluster à deux réplicas
Vérifiez l'instruction
CREATE TABLEde la table cible. Si son moteur n'appartient pas à la sérieReplicated*, recréez la table. Create a table.Cluster multi-shards à deux réplicas
Vérifiez le type de la table interrogée.
S'il s'agit d'une table locale, interrogez la table distribuée. Si aucune table distribuée n'existe, créez-en une.
Si vous interrogez une table distribuée, vérifiez si le moteur de la table locale correspondante appartient à la série
Replicated*. Dans le cas contraire, recréez la table locale avec un moteur de la sérieReplicated*. Create a table.
Pourquoi ReplacingMergeTree échoue-t-il à dédupliquer après une fusion forcée ?
Symptôme
Le moteur ReplacingMergeTree de ClickHouse déduplique les données partageant la même clé primaire lors du processus de fusion. Cependant, après avoir forcé une fusion de données à l'aide de la commande suivante, des doublons avec la même clé primaire peuvent subsister :
optimize TABLE <table_name> FINAL ON cluster default;
Cause
Le moteur ReplacingMergeTree ne déduplique les données que sur un seul nœud. Si des données partageant la même clé primaire sont réparties sur différents nœuds parce que l'expression sharding_key n'a pas été explicitement spécifiée (par défaut, les données sont allouées aléatoirement via la fonction rand()), le moteur ne peut pas effectuer la déduplication à l'échelle du cluster.
Solution
Recréez la table locale et la table distribuée. Lors de la création de la table distribuée, définissez l'expression sharding_key sur la clé primaire de la table locale. CREATE TABLE.
Vous devez recréer à la fois la table distribuée et la table locale. Recréer uniquement la table distribuée n'affecte que les nouvelles données, laissant les données existantes non dédupliquées.