Cette rubrique répond aux questions fréquemment posées sur ApsaraDB for ClickHouse, notamment la sélection d'instance, la mise à l'échelle, les connexions, la migration de données, les requêtes et le stockage.
-
Sélection et achat
-
Mise à l'échelle
-
Connexions
-
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) » ?
Puis-je migrer un cluster Community-Compatible Edition vers un cluster Enterprise Edition ?
-
Écriture de données et requêtes
Comment gérer l'erreur de dépassement de la limite de mémoire lors d'une requête ?
Erreur de limite de mémoire pour les requêtes SQL dans Enterprise Edition
Comment gérer l'erreur « concurrency limit exceeded » qui survient lors des requêtes ?
Comment résoudre les incompatibilités d'horodatage entre les données interrogées et écrites ?
Comment résoudre 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 renvoyé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 les 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 de 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 pour définir les 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 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. Comparaison des fonctionnalités par version.
Instances à réplica unique par rapport aux 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 pas de haute disponibilité. La sécurité de ses données repose sur le stockage multi-réplicas du disque cloud sous-jacent, ce qui en fait une option très rentable.
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 autre zone de la même région. Les zones d'une même région sont connectées via un 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 de données ; le processus prend donc plus de temps pour les instances contenant davantage de données.
Impact de la mise à l'échelle
Pour garantir la cohérence des données pendant la migration, l'instance passe en état de lecture seule durant 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. 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. Connexion à ClickHouse via une interface en ligne de commande. |
|
HTTP |
8123 |
Utilisez ce port pour vous connecter à ApsaraDB for ClickHouse via JDBC pour le développement d'applications. Connexion à ClickHouse via JDBC. |
|
HTTPS |
8443 |
Utilisez ce port pour accéder à ApsaraDB for ClickHouse via HTTPS. Connexion à 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 section Bibliothèques clientes tierces.
Résolution de l'erreur « connect timed out »
Essayez les solutions suivantes :
Vérifiez la connectivité réseau. Utilisez
pingpour vérifier l'accessibilité du réseau ettelnetpour vous assurer que les ports de base de données 3306 et 8123 sont ouverts.Vérifiez la configuration de la liste d'autorisation de votre instance ClickHouse. Configuration d'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 un service de recherche 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. La réussite de la création de la table confirme la connectivité réseau. Si la création de la table échoue, les causes courantes sont les suivantes :
Le point de terminaison 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 liée à l'impossibilité d'analyser les données de Kafka selon le schéma de la table. Le message d'erreur indiquera l'emplacement exact de l'échec de l'analyse.
Dépannage des problèmes de connexion
Causes courantes des échecs de connexion et leurs solutions :
-
Cause : L'environnement réseau est mal configuré. Vous ne pouvez vous connecter via un réseau interne que 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. Demande et libération d'adresses IP publiques.
-
Cause : L'adresse IP du client ne figure pas dans la liste d'autorisation de l'instance.
Solution : Ajoutez l'adresse IP du client à la liste d'autorisation. Configuration d'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. 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 risque de ne pas interpréter correctement ces caractères, ce qui entraîne un échec de la 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 impayés, l'instance SLB peut être suspendue, rendant votre instance ApsaraDB for ClickHouse inaccessible.
Solution : Vérifiez si votre compte Alibaba Cloud présente des impayés et réglez tout solde dû pour restaurer 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.
-
Comment résoudre les 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 définir ce paramètre global. Le nouveau paramètre prend effet après un redémarrage du cluster.
set global on cluster default distributed_ddl_task_timeout = 1800;Étant donné que ZooKeeper gère et exécute 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 file d'attente pour exécution, et non qu'elle a échoué. Ne resoumettez pas la tâche.
-
-
Comment résoudre les problèmes de délai d'expiration max_execution_time
-
Ce paramètre spécifie la durée maximale d'exécution d'une requête. La valeur par défaut est de 7 200 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;
-
-
Comment résoudre les problèmes de socket_timeout
Ce paramètre spécifie le temps d'attente pour qu'un socket d'écoute renvoie un résultat via le protocole HTTP. La valeur par défaut est de 7 200 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. Toutefois, 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 de la connexion directe à l'adresse IP du serveur ClickHouse
-
Lorsqu'une instance ECS se connecte à un serveur ClickHouse via des groupes de sécurité, un échec de connexion silencieux peut se produire. Cet échec peut survenir si l'adresse IP du serveur ClickHouse ne figure pas dans la liste d'autorisation du groupe de sécurité de l'instance ECS qui exécute 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.
De même que pour la résolution des problèmes de connexion transitoire 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 le plus couramment utilisé pour l'analyse interactive avec l'outil en ligne de commande natif de ClickHouse. Le port courant pour les clusters Edition Community est 3306. Étant donné que 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 l'Edition Community.
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 vous ne pouvez pas accéder au port Prometheus spécifié. 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, tandis que le service Prometheus s'exécute sur les nœuds sous-jacents ApsaraDB for ClickHouse. L'équilibreur de charge n'est pas configuré pour transférer le trafic sur les 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 les adresses IP des nœuds sous-jacents. Ensuite, utilisez l'une des adresses IP récupérées pour vous connecter au port Prometheus.
SELECT * FROM system.clusters;
Erreurs OOM lors de l'importation de données OSS
Cause courante : Utilisation élevée de la mémoire.
Pour résoudre ce problème, effectuez l'une des opérations suivantes :
Divisez 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 des clusters Edition Community.
Comment résoudre l'erreur « too many parts »
ClickHouse génère une partie de données pour chaque opération d'écriture. L'écriture d'une seule ligne ou de petites quantités de données à la fois crée un nombre excessif de parties de données, ce qui alourdit considérablement les opérations de fusion et les requêtes. L'erreur « too many parts » se produit car ClickHouse applique des limites internes pour éviter cela. Si cette erreur se produit, augmentez la taille de vos lots d'écriture. Si vous ne pouvez pas ajuster la taille du lot, augmentez la valeur du paramètre merge_tree.parts_to_throw_insert dans la console.
Pourquoi les importations DataX sont-elles lentes ?
Causes courantes et solutions :
-
Cause 1 : Configuration des paramètres sous-optimale. ClickHouse offre de 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 valeur sur la base de 100 octets par ligne, mais il convient de l'ajuster 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. Une capacité CPU ou mémoire insuffisante peut limiter le nombre d'concurrent operationset lanetwork egress bandwidthdisponible. De même, la définition d'une taille debatchimportante sur une machine dotée d'une mémoire limitée peut déclencher un garbage collection (GC) Java fréquent dans le processus DataWorks, ce qui ralentit les performances.Solution : Vérifiez les spécifications de l'instance
ECSdans les journaux de sortie DataWorks. -
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. Si la valeur detotalWaitReaderTimeest significativement supérieure à celle detotalWaitWriterTime, 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 haute performance.Solution : Basculez vers un endpoint de
VPC network. -
Cause 5 : Présence de
dirty data. Normalement, les données sont écrites parbatch. Toutefois, si desdirty datasont rencontrées, l'écriture dubatchactuel échoue. DataX revient alors à un mode d'insertion ligne par ligne. Ce repli génère un nombre excessif dedata partset réduit considérablement les performances d'écriture.Vous pouvez utiliser les deux méthodes suivantes pour vérifier 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.Vous pouvez utiliser 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 le nombre de lignes parbatchtombe à 1, cela indique fortement que DataX a rencontré desdirty dataet est passé en mode ligne par ligne.Vous pouvez utiliser 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. -
Incohérence du nombre de lignes après une importation depuis Hive
Effectuez les vérifications suivantes :
Consultez la table système
query_logpour détecter d'éventuelles erreurs lors de l'importation. La présence d'erreurs suggère une perte de données.Vérifiez si le moteur de votre table prend en charge la déduplication. Par exemple, si vous utilisez le moteur de table
ReplacingMergeTree, le nombre de lignes dans ClickHouse peut être inférieur à celui de Hive, car ce moteur supprime les doublons.Vérifiez l'exactitude du nombre de lignes dans la source Hive, car le comptage initial de la source peut être imprécis.
Incohérence du nombre de lignes entre ClickHouse et Kafka
Vérifiez les points suivants :
Consultez la table système
query_logpour détecter d'éventuelles erreurs survenues lors de l'importation. La présence d'erreurs peut indiquer une perte de données.Vérifiez si le moteur de votre table effectue une déduplication des données. Par exemple, le moteur
ReplacingMergeTreesupprime les entrées en double, ce qui réduit le nombre de lignes dans ClickHouse par rapport à Kafka.Vérifiez 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 qui ne peuvent pas être analysés, ce qui réduit le nombre de lignes dans ClickHouse par rapport à Kafka.
Importation de données avec Spark et Flink
Importation de 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 autogé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 interrompu la synchronisation 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 lorsque vous utilisez le moteur MaterializeMySQL pour synchroniser les données MySQL ?
Cause courante : Vous avez exécuté une instruction DDL (Data Definition Language) MySQL 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 dont la synchronisation s'est arrêtée.
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. Si la table est 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>correspond au 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 se produit lorsqu'une seule opération INSERT tente d'écrire dans plus de partitions que ne l'autorise 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 de données, ce qui peut peser sur les opérations de fusion et de requête. Pour éviter toute dégradation des performances, ClickHouse applique cette limite.
Pour résoudre ce problème, vous pouvez ajuster votre stratégie de partitionnement ou modifier le paramètre max_partitions_per_insert_block.
Ajustez le schéma de la table, modifiez la méthode de partitionnement ou veillez à ce qu'une seule opération d'insertion ne dépasse pas la limite de partitions.
-
Si votre cas d'utilisation nécessite l'écriture dans de nombreuses partitions simultanément, vous pouvez augmenter la limite
max_partitions_per_insert_blocken fonction du volume de vos données. Utilisez la syntaxe suivante pour modifier le paramètre :Instance à nœud unique
SET GLOBAL max_partitions_per_insert_block = XXX;Instance multi-nœuds
SET GLOBAL ON cluster DEFAULT max_partitions_per_insert_block = XXX;RemarqueLa communauté ClickHouse recommande la valeur par défaut de 100. Une valeur trop élevée peut dégrader les performances. Une fois l'importation massive de données terminée, vous pouvez rétablir la valeur par défaut du paramètre.
Erreur de dépassement de la limite de mémoire pour insert into select
-
Cause : Utilisation élevée de la mémoire.
Solution : Ajustez le paramètre
max_insert_threadspour réduire l'utilisation de la mémoire. -
Cause : Utilisation d'une instruction
insert into selectpour importer des données entre des clusters ClickHouse.Solution : Migrez les données en les important à partir de fichiers. Migration de données d'une instance ClickHouse autogé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 de mémoire
Le serveur ClickHouse suit l'utilisation de la mémoire à plusieurs niveaux. Pour une requête unique, un traqueur de mémoire agrège l'utilisation de la mémoire de tous ses threads de requête. Ce traqueur rapporte ensuite les informations à un traqueur de mémoire global. La solution dépend de l'erreur spécifique que vous rencontrez.
Une erreur avec
Memory limit (for query)signifie que la requête a échoué car elle a consommé trop de mémoire, dépassant sa limite de 70 % de la capacité totale de mémoire de l'instance. Pour résoudre ce problème, effectuez une mise à niveau verticale pour augmenter la capacité de mémoire de l'instance.Une erreur avec
Memory limit (for total)signifie que l'utilisation globale de la mémoire sur l'instance a dépassé la limite système de 90 % de la capacité totale de mémoire de l'instance. Cette erreur peut résulter d'une concurrence élevée des requêtes ou de tâches asynchrones en arrière-plan gourmandes en ressources, telles que les tâches de fusion de clés primaires qui s'exécutent 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é de mémoire de l'instance.
Erreur de limite de mémoire des requêtes SQL dans Enterprise Edition
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 pour l'exécution des requêtes. Par défaut, une seule requête SQL s'exécute sur un nœud. Une erreur de memory limit se produit 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 la limite maximale de CCU est supérieure à 64, le nombre de nœuds dans un cluster Enterprise Edition est : Maximum CCU limit / 32. Si la limite maximale de CCU est inférieure ou égale à 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 peut prévenir l'erreur de memory limit.
SETTINGS
allow_experimental_analyzer = 1,
allow_experimental_parallel_reading_from_replicas = 1;
Consommation excessive de mémoire dans GROUP BY
Définissez le paramètre max_bytes_before_external_group_by pour limiter la consommation de mémoire des opérations GROUP BY. Notez que le paramètre allow_experimental_analyzer affecte l'application de ce paramètre.
Gestion des erreurs de dépassement de la limite de concurrence
La concurrence maximale par défaut des requêtes 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 pour le 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.
Résultats de requête incohérents lorsque les écritures de données sont arrêtées
Description du problème : Lorsque vous interrogez les données à l'aide de select count(*), seule environ la moitié des données totales est renvoyée, ou les résultats fluctuent.
Envisagez les solutions suivantes :
Vérifiez si vous utilisez un cluster multi-nœuds. Dans un cluster multi-nœuds, vous devez créer une table distribuée. Écrivez dans cette table et interrogez-la pour obtenir des résultats cohérents. Sinon, chaque requête peut atteindre un shard différent. Création d'une table distribuée.
Vérifiez si vous utilisez un cluster maître-réplica. Dans un cluster maître-réplica, utilisez des tables avec un moteur de table de la série Replicated pour synchroniser les données entre les réplicas. Sinon, chaque requête peut atteindre un réplica différent, ce qui entraîne des résultats incohérents. Moteurs de table.
Tables invisibles et résultats de requête fluctuants
Causes courantes et solutions :
-
Cause 1 : Le processus de création de table est incorrect. Un cluster distribué ClickHouse ne dispose pas de sémantique DDL distribuée native. Si vous utilisez une instruction
create tabledans un cluster ClickHouse géré par vos soins, l'instruction peut renvoyer un message de succès, mais la table est créée uniquement sur le serveur actuellement connecté. Lorsque vous vous connectez à un autre serveur, la table n'est pas visible.Solution :
-
Lorsque vous créez une table, utilisez l'instruction
create table <table_name> on cluster default. La clauseon cluster defaultdiffuse l'instruction vers 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 qui utilise le moteur de table distribué au-dessus de la table de test.
CREATE TABLE test_dis ON cluster default AS test Engine = Distributed(default, default, test, cityHash64(a));
-
-
Cause 2 : La table ReplicatedMergeTree est mal configurée. Le moteur de table ReplicatedMergeTree est une version améliorée du moteur de table MergeTree qui fournit une synchronisation maître-réplica. Sur une instance à réplica unique, vous pouvez uniquement créer des tables avec le moteur
MergeTree. Sur une instance maître-réplica, vous devez créer des tables avec le moteur ReplicatedMergeTree.Solution : Lorsque vous créez une table dans 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.
Incohérences des données d'horodatage
Exécutez SELECT timezone() pour vérifier si le fuseau horaire correspond au fuseau horaire local. Sinon, définissez l'élément de configuration « timezone » sur le fuseau horaire local. Consultez la section Modifier les valeurs des paramètres d'exécution pour les éléments de configuration pour obtenir des instructions.
Table introuvable après la création
Ce problème survient généralement lorsqu'une instruction DDL est exécutée 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.
Aucune nouvelle donnée dans les tables externes Kafka
Commencez par exécuter une requête select * from sur la table externe Kafka. Si la requête échoue, vérifiez le message d'erreur. Cela est souvent dû à un échec d'analyse des données. Si la requête renvoie des résultats, vérifiez que les champs de la table de destination (la table de stockage sous-jacente pour la table externe Kafka) et de la table externe Kafka correspondent. Si l'écriture des données échoue, les champs ne correspondent pas. Par exemple :
insert into <destination table> as select * from <Kafka external table>;
Décalage entre l'heure du client et le fuseau horaire
Ce problème se produit lorsque le paramètre use_client_time_zone est configuré avec un fuseau horaire incorrect.
Données non visibles après une opération d'écriture ?
Symptôme : Après avoir écrit des données dans une table, les requêtes suivantes ne trouvent pas les 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 des données dans une table distribuée, la distribution des fichiers temporaires est incomplète.
Après l'écriture des données sur un réplica dans un cluster maître-réplica, la synchronisation des réplicas est incomplète.
Analyse et solutions :
Schémas incohérents
Interrogez la table système system.distribution_queue pour vérifier les erreurs survenues lors des écritures dans la table distribuée.
Distribution de fichiers incomplète
Analyse de la cause : Dans un cluster ApsaraDB for ClickHouse multinœud, si votre application se connecte à la base de données à l'aide d'un nom de domaine et exécute une instruction INSERT sur une table distribuée, un équilibreur de charge SLB frontal achemine la demande vers un nœud aléatoire du cluster. Le nœud qui reçoit la demande é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 peut ne pas renvoyer les données non distribuées.
Solution : Si votre application nécessite une forte cohérence lecture-après-écriture, ajoutez la clause settings insert_distributed_sync = 1 à votre instruction INSERT. Ce paramètre fait passer l'opération INSERT en mode synchrone. L'instruction renvoie un message de succès uniquement après la distribution des donné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 d'abord ce paramètre sur une seule requête. 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 seule requête, 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.
Synchronisation des réplicas incomplète
Analyse de la cause : Dans un cluster ApsaraDB for ClickHouse maître-réplica, lorsque vous exécutez une instruction INSERT, le cluster exécute 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 suivante est acheminée vers le réplica dont la synchronisation n'est pas encore terminée, la requête peut ne pas renvoyer les données attendues.
Solution : Si votre application nécessite 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 renvoie un message de succès uniquement après la fin de la synchronisation des données sur les deux réplicas.
Tenez compte des éléments suivants lorsque vous utilisez 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 aboutisse. Cela signifie que si un réplica n'est pas disponible, toutes les opérations d'écriture configurées avecinsert_quorum = 2échoueront, ce qui entre en conflit avec 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 d'abord ce paramètre sur une seule requête. 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 seule requête, 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 est correctement configuré pour une table, mais les données expirées ne sont pas supprimées automatiquement. Le paramètre TTL n'est donc pas appliqué.
Étapes de dépannage
-
Vérifiez si le paramètre TTL de la table est approprié.
Définissez le TTL en fonction de vos besoins métier. Nous vous recommandons de définir le TTL au niveau du jour et d'éviter les configurations à la seconde ou à la minute, telles que
TTL event_time + INTERVAL 30 SECOND. -
Vérifiez le paramètre
materialize_ttl_after_modify.Ce paramètre contrôle l'application d'une nouvelle règle TTL 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 s'applique uniquement aux nouvelles données ; les données existantes ne sont pas affectées par le TTL.
-
Vérifiez le paramètre
SELECT * FROM system.settings WHERE name like 'materialize_ttl_after_modify'; -
Modifiez le paramètre
ImportantCette commande analyse toutes les données existantes et peut générer une charge élevée sur les ressources. Utilisez-la avec précaution.
ALTER TABLE $table_name MATERIALIZE TTL;
-
-
Diagnostiquez la stratégie de nettoyage des partitions.
Lorsque le paramètre
ttl_only_drop_partsest défini sur 1, ClickHouse supprime une partie de données uniquement lorsque toutes les lignes qu'elle contient ont expiré.-
Vérifiez le paramètre
ttl_only_drop_partsSELECT * FROM system.merge_tree_settings WHERE name LIKE 'ttl_only_drop'; -
Vérifiez 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 partitions et les règles TTL ne sont pas alignées, certaines données peuvent ne pas être nettoyées rapidement. Les sections suivantes expliquent l'interaction entre les partitions et les règles TTL.
Si les partitions et les règles TTL sont alignées (par exemple, un partitionnement par jour avec un TTL quotidien), ClickHouse peut déterminer l'expiration en fonction 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 vous 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 est supprimée uniquement après que toutes ses données ont dépassé l'horodatage delete_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 trouver et supprimer individuellement les lignes expirées. Il s'agit de la stratégie la plus gourmande en ressources.
-
-
Contrôlez la fréquence de déclenchement des fusions.
Les données expirées sont supprimées de manière asynchrone lors des fusions, et non en temps réel. Vous pouvez contrôler la fréquence de fusion avec le 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. La valeur par défaut pour une instance en ligne est de 7 200 secondes (2 heures).
-
Modifiez le paramètre
Si merge_with_ttl_timeout est défini sur une valeur trop élevée, la fréquence de déclenchement de la fusion TTL diminue, ce qui retarde le nettoyage des données expirées. Vous pouvez réduire cette valeur pour augmenter la fréquence de nettoyage. Pour plus de détails, consultez la page Description des paramètres.
-
-
Vérifiez les paramètres du pool de threads.
La suppression des données TTL se produit pendant la phase de fusion des parties et est limitée par les paramètres
max_number_of_merges_with_ttl_in_pool(par défaut : 2 pour les instances en ligne) etbackground_pool_size(par défaut : 16 pour les instances en ligne).-
Interrogez l'activité actuelle des threads en 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 en 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_poolen fonction de vos besoins métier, par exemple de 2 à 4, ou de 4 à 8. Si cela ne résout pas le problème, envisagez d'augmenter 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. Vous n'avez pas besoin de redémarrer le cluster lorsque vous augmentez le paramètrebackground_pool_size, mais vous devez le redémarrer lorsque vous réduisez le paramètrebackground_pool_size.
-
-
Vérifiez si le schéma de la table et la conception des partitions sont approprié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 efficace, nous vous recommandons d'aligner la granularité des partitions sur celle du TTL (par exemple, en définissant les deux sur un intervalle quotidien). Pour plus de détails, consultez les pages Meilleures 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 un 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 associées.
-
Vérifiez les autres paramètres système dans
system.merge_tree_settings.merge_with_recompression_ttl_timeout : Délai minimum avant qu'une fusion avec un TTL de recompression puisse se répéter. Par défaut, cela signifie que les règles TTL sont appliquées à une table au moins toutes les 4 heures. Si vous devez appliquer les règles TTL plus fréquemment, réduisez cette valeur.
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 en cours avec TTL dans le pool de threads en arrière-plan dépasse cette valeur, ClickHouse ne planifie pas de nouvelles tâches de fusion avec TTL.
Tâches optimize lentes
Une tâche optimize est intensive en termes de CPU et d'E/S disque. Elle entre en concurrence avec les requêtes simultanées pour l'accès aux ressources, ce qui peut ralentir son exécution sous une charge élevée.
Échec de la fusion de la clé primaire après optimize
Une primary key merge doit respecter les deux conditions préalables suivantes pour fonctionner correctement.
La clé
ORDER BYdoit inclure lapartition keyde lastorage table. Uneprimary key mergene se produit pas entre différentes partitions.Pour une
distributed table, la cléORDER BYdoit inclure la clé de sharding, qui est déterminée par l'hash algorithm. Uneprimary key mergene se produit 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'une seule |
Pour l'une 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 si aucune fusion n'est effectuée, ce qui vous permet de déterminer si la tâche a bien été exécutée.
TTL des données inefficace après optimize
Voici les causes courantes et leurs solutions.
-
Cause 1 : L'éviction des données TTL se produit pendant la phase de fusion de la clé primaire. 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 :
Vous pouvez déclencher manuellement une tâche de fusion en exécutant
optimize finalouoptimize a specific partition.Lors de la création d'une table, vous pouvez définir 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 :
Vous pouvez régénérer les informations TTL en exécutant
alter table materialize ttl.Vous pouvez mettre à jour les informations TTL en exécutant
optimize partition.
Mises à jour et suppressions non prises en compte après OPTIMIZE
ApsaraDB for ClickHouse exécute les opérations de mise à jour et de suppression de manière asynchrone. Surveillez la progression en interrogeant la table système system.mutations.
Ajout, suppression ou modification de colonnes avec DDL
Pour modifier une table locale, exécutez une instruction DDL. Pour une table distribuée, la procédure dépend de l'écriture ou non de données dans la table.
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 écrites dans la table, la procédure dépend du 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 globale des DDL est séquentielle et les requêtes complexes peuvent provoquer des interblocages.
Essayez les solutions suivantes :
Attendez la fin de l'opération.
Essayez d'interrompre la requête dans la console.
Erreur de délai d'expiration de la tâche DDL distribuée
Modifiez le délai d'expiration par défaut en exécutant set global on cluster default distributed_ddl_task_timeout=xxx, où xxx représente le délai d'expiration en secondes. Modifier les paramètres du cluster.
Erreur de syntaxe : « set global on cluster default »
-
Cause 1 : Le client ClickHouse analyse la syntaxe. Cependant,
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 qui n'effectue pas d'analyse syntaxique côté client. Parmi les exemples figurent les outils basés sur JDBC, tels que DataGrip et 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, mais n'est pas entourée de guillemets.Solution : Entourez la valeur de chaîne de guillemets.
Outil BI recommandé
Nous vous 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 pertinentes :
Résolution de l'erreur ON CLUSTER is not allowed for Replicated database**
Si votre cluster est un cluster Enterprise Edition 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 à niveau votre instance vers la dernière version. Mettre à niveau les versions mineures du moteur.
Résolution de l'erreur Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny')
Problème : Si vous utilisez un cluster Community Edition multi-nœuds, vous risquez de 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 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. Cette opération consomme d'importantes ressources et augmente la latence. Pour prévenir ce problème, 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, qui est ensuite diffusée à tous les autres nœuds pour effectuer 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 grands ensembles de données.
-
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 plutôt sur l'instance actuelle.Par exemple, vous exécutez l'instruction suivante sur
instance_apour interroger les données de 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, que nous appelleronstemp_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 dans 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);. Toutefois, la condition définie dans la table temporaire A est générée 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 la condition définie 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 la condition définie depuis une source incorrecte, ce qui entraîne 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, remplacez cette instruction :
SELECT * FROM test_tbl_distributed WHERE id IN (SELECT id FROM test_tbl_distributed1);
par :
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 standard IN ou JOIN 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 génère 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érateur standardINouJOIN.global: Convertit les requêtesINouJOINen requêtesGLOBAL INouGLOBAL JOIN.allow: Autorise les sous-requêtes standardINetJOIN, ce qui peut entraîner 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 standard IN ou JOIN 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 génère 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.
Affichage de l'espace disque des tables
Pour afficher 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;
Affichage de la taille des données froides
Voici un exemple de requête :
SELECT * FROM system.disks;
Interrogation des données en stockage froid
Utilisez la requête suivante :
SELECT * FROM system.parts WHERE disk_name = 'cold_disk';
Déplacement 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 courantes incluent :
Une requête déclenchant une erreur OOM (Out Of Memory).
Un redémarrage de l'instance déclenché par une modification de configuration.
Un redémarrage de l'instance suite à une mise à niveau ou une rétrogradation.
Mise à niveau transparente sans migration de données
La prise en charge d'une mise à niveau transparente 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 de données. Mise à niveau de 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 sur le cluster. |
|
system.mutations |
Contient des informations sur les opérations de mutation sur le cluster. |
Modification des paramètres au niveau du système
Les paramètres au niveau du 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 pour le 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 provoque une déconnexion transitoire d'environ 1 minute.
Modification des paramètres au niveau de l'utilisateur
Les paramètres au niveau de l'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.
Modification du 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 avec 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'intenses write operation s. L'utilisation s'équilibre entre les node s une fois les données synchronisées.
Affichage des journaux système détaillés
-
Description du problème :
Comment afficher les journaux système détaillés pour résoudre les erreurs ou identifier les 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 textuelle 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. Connexion à une base de données.
-
Exécutez l'instruction suivante pour afficher 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 la section Définir une liste d'autorisation.
Pour les autres sources de données, reportez-vous à leur documentation produit respective.
Si les conditions précédentes ne sont pas remplies, établissez d'abord la connectivité à l'aide d'une solution réseau appropriée. Ajoutez ensuite l'adresse IP de chacun à la liste d'autorisation de l'autre.
|
Scénario |
Solution |
|
connectivité cloud hybride |
Interconnexion réseau entre infrastructures sur site et cloud |
|
connectivité VPC inter-régions et inter-comptes |
|
|
connectivité même région, VPC différents |
|
|
connectivité VPC inter-régions et inter-comptes |
|
|
connectivité réseau public |
Utilisation de la SNAT de la passerelle NAT Internet pour accéder à Internet |
|
conflit d'adresses |
Utilisation de la passerelle NAT VPC pour résoudre les conflits d'adresses |
Migration de l'édition Community vers l'édition Enterprise
Oui, il est possible de migrer un cluster ClickHouse Community Edition vers un cluster Enterprise Edition.
Vous pouvez migrer des données entre les clusters Enterprise Edition et Community Edition à l'aide de la fonction remote ou en exportant et en important des fichiers de données. Migration de données d'un cluster ClickHouse autogéré vers 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 que les schémas de base de données et de table soient cohérents sur tous les shards. Dans le cas contraire, certaines bases de données ou tables risquent de ne pas migrer correctement.
Solutions
-
Le schéma d'une table MergeTree (qui n'est pas une table interne d'une vue matérialisée) est incohérent entre les shards.
Vérifiez si votre logique métier est à l'origine des différences de schéma entre les shards :
Si vous attendez des schémas de table identiques sur tous les shards, recréez les tables pour garantir leur cohérence.
Si votre logique métier utilise intentionnellement des schémas de table différents selon les shards, Soumettez un ticket afin de contacter le support technique pour obtenir de l'aide.
-
La table interne d'une vue matérialisée est incohérente entre les shards.
-
Solution 1 : renommez les tables internes et pointez explicitement la vue matérialisée ainsi que la table distribuée vers la table MergeTree cible. La procédure suivante utilise la vue matérialisée d'origine
up_down_votes_per_day_mvà titre d'exemple.-
Répertoriez 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 requise pour les clusters ApsaraDB for ClickHouse mais pas pour les clusters ClickHouse gérés par vos soins. Ensuite, renommez la table interne pour assurer la cohérence sur tous les nœuds. Afin de réduire les risques opérationnels, obtenez l'adresse IP de chaque nœud, connectez-vous au port 3005 et 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 qui pointe 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 issue de 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éfinir 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 œuvre une stratégie de double écriture pour les vues matérialisées et laissez 7 jours aux données pour se synchroniser.
-
Échec d'une instruction 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. Cet analyseur offre de meilleures performances, mais peut ne pas être rétrocompatible avec certaines instructions SQL héritées. Si vous rencontrez une erreur d'analyse, revenez à l'ancien analyseur. En savoir plus sur le nouvel analyseur.
SET allow_experimental_analyzer = 0;
Suspendre un cluster
La fonctionnalité de suspension est uniquement disponible pour les clusters de l'édition Enterprise. Les clusters ClickHouse Community Edition ne peuvent pas être suspendus. Pour suspendre un cluster de l'édition Enterprise, accédez à la page Clusters de l'édition Enterprise. Sélectionnez la région cible dans le coin supérieur gauche. Dans la liste des clusters, repérez le cluster cible et cliquez sur
> Suspendre dans la colonne Actions.
Convertir une table MergeTree en ReplicatedMergeTree
Description du problème
Les utilisateurs peu familiarisés avec ClickHouse peuvent créer par erreur des tables utilisant le moteur MergeTree dans un cluster multi-réplica. Cela empêche la synchronisation des données entre les nœuds réplica de chaque shard. Par conséquent, les requêtes exécutées sur la table distribuée correspondante peuvent renvoyer des résultats incohérents. Pour résoudre ce problème, vous devez convertir la table MergeTree en table ReplicatedMergeTree.
Solution
ClickHouse ne propose pas d'instruction DDL permettant de modifier directement le moteur de stockage d'une table. Pour convertir une table MergeTree en table ReplicatedMergeTree, vous devez créer une nouvelle table avec le moteur ReplicatedMergeTree, puis importer les données depuis la table d'origine.
Par exemple, supposons que vous disposiez d'une table MergeTree nommée table_src et de sa table distribuée correspondante nommée table_src_d dans un cluster multi-réplica. Pour convertir cette table MergeTree en table 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. Vous pouvez utiliser l'une des deux méthodes suivantes.
Les deux méthodes interrogent les données source depuis la table locale MergeTree.
Si le volume de données est faible, insérez les données directement dans la table distribuée
table_dst_dafin de répartir les données de manière homogène.Si les données de la table MergeTree d'origine
table_srcsont déjà équilibrées sur tous les nœuds et que le volume de données est important, vous pouvez insérer les données directement dans la table locale ReplicatedMergeTreetable_dstsur chaque nœud.Si l'ensemble de données est volumineux, le processus d'importation peut prendre beaucoup de temps. Lorsque vous utilisez la fonction
remote(), veillez à 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 vous disposez d'une instance ECS avec le client ClickHouse installé dans votre VPC, vous pouvez vous connecter individuellement à chaque nœud pour effectuer les opérations suivantes.
Se connecter à ClickHouse via l'interface de ligne de commande.
-
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 en utilisant son adresse IP et exécutez l'instruction suivante.
INSERT INTO table_dst_d SELECT * FROM db.table_src ;L'exécution de l'instruction sur tous les nœuds convertit la table MergeTree en table ReplicatedMergeTree.
Exécuter plusieurs instructions SQL dans la même session
La définition d'un session_id unique garantit que le serveur ClickHouse conserve un contexte cohérent pour les requêtes partageant le même ID de session. Cela vous permet d'exécuter plusieurs instructions SQL au sein d'une seule session. Cet exemple illustre la procédure à suivre avec le client Java ClickHouse (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
ID de sessionpersonnalisé 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 paramètre max_block_size de 65409. ClickHouse Java Client : Java Client | ClickHouse Docs.
Pourquoi la déduplication FINAL échoue avec une clause 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. Par conséquent, des données en double subsistent dans la sortie. Voici un exemple d'instruction SQL :
SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;
Cause
Il s'agit d'un bogue connu et non corrigé dans ClickHouse. L'échec de la déduplication est dû à un conflit entre la logique d'exécution de FINAL et celle de JOIN. Voir l'issue ClickHouse n° 8655.
Solution
-
Solution 1 (Recommandée) : Activez l'optimiseur expérimental. Activez le mot-clé
FINALau niveau de la requête en ajoutant un paramètre à votre instruction. Cette méthode ne nécessite aucune déclaration au niveau de la table. Par exemple :Si l'instruction SQL d'origine est :
SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;Supprimez le mot-clé
FINALdu nom de la table et ajoutez les paramètresallow_experimental_analyzer = 1, FINAL = 1à la fin de l'instruction. L'instruction révisée se présente comme suit :SELECT * FROM t1 JOIN t2 WHERE xxx SETTINGS allow_experimental_analyzer = 1, FINAL = 1;ImportantLe paramètre
allow_experimental_analyzerest pris en charge uniquement dans les versions 23.8 et ultérieures. Si vous utilisez une version antérieure, effectuez une mise à niveau avant de modifier l'instruction SQL. Consultez la rubrique Mettre à niveau une version majeure du moteur. -
Solution 2 (À utiliser avec prudence) :
Forcez la fusion pour la déduplication en exécutant périodiquement la commande
OPTIMIZE TABLE local_table_name FINAL. Bien que cette opération fusionne les données à l'avance, elle doit être utilisée avec précaution sur les grandes tables, car elle engendre une surcharge d'E/S importante.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 prudence, car elle consomme d'importantes ressources d'E/S et peut affecter les performances des grandes tables.
Pourquoi les opérations DELETE ou UPDATE restent-elles incomplètes ?
Symptôme
Lorsque vous effectuez des opérations de suppression (DELETE) ou de mise à jour (UPDATE) des données dans un cluster ApsaraDB for ClickHouse compatible avec l'édition Community, les tâches restent incomplètes pendant une longue période.
Cause
Contrairement aux opérations synchrones de MySQL, les opérations DELETE et UPDATE dans un cluster ApsaraDB for ClickHouse compatible avec l'édition Community sont asynchrones et s'exécutent selon le mécanisme de Mutation. Par conséquent, les modifications ne sont pas appliquées en temps réel. Le processus principal d'une mutation est le suivant :
Soumission de la tâche : un 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_*.txtpour enregistrer la plage de données à modifier. Les modifications ne sont pas appliquées immédiatement.Réécriture en arrière-plan : ClickHouse réécrit progressivement la
data partconcernée 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, l'émission d'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 un engorgement, 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.
Vous pouvez exécuter l'instruction SQL suivante pour afficher 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 d'exécution, utilisez un compte privilégié pour annuler certaines ou toutes ces tâches.
-
Annulez toutes les tâches de mutation sur une seule table.
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 Enterprise Edition ?
-
Symptôme : Lors de l'exécution d'une instruction SQL, vous rencontrez le message d'erreur suivant, bien que la mémoire totale de votre cluster dépasse la limite indiquée dans le message :
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 Enterprise Edition, un nœud unique possède une limite CCU (maximum de 32 CCU, où 1 CCU équivaut approximativement à 1 vCore et 4 Go de mémoire). Si une seule requête SQL consomme plus de mémoire que le seuil du nœud, MemoryTracker intercepte la requête. Le seuil par défaut est égal à 0,9 fois la mémoire totale du nœud. Vous pouvez exécuter l'instruction SQL suivante pour interroger le 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_replicassur 1. Cela permet de distribuer la phase de lecture des données sur plusieurs nœuds, répartissant ainsi la consommation de mémoire. Consultez la rubrique Enterprise Edition.