Partitions
PARTITION BY. Cette clause peut contenir une expression SQL portant sur une ou plusieurs colonnes, dont le résultat détermine vers quelle partition une ligne est envoyée.
Les data parts sont logiquement associées (via un préfixe commun de nom de dossier) à chaque partition sur le disque et peuvent être interrogées séparément. Dans l’exemple ci-dessous, le schéma otel_logs par défaut effectue un partitionnement par jour à l’aide de l’expression toDate(Timestamp). À mesure que des lignes sont insérées dans ClickHouse, cette expression est évaluée pour chaque ligne, qui est ensuite dirigée vers la partition correspondante si elle existe (si la ligne est la première d’un jour donné, la partition sera créée).
otel_logs soit partitionnée par jour. Si elle est alimentée avec le jeu de données de logs structurés, elle contiendra plusieurs jours de données :
otel_logs_archive, utilisée pour stocker les données plus anciennes. Les données peuvent être déplacées efficacement vers cette table au niveau de la partition (il s’agit simplement d’une modification des métadonnées).
INSERT INTO SELECT ainsi qu’une réécriture des données dans la nouvelle table cible.
Déplacement de partitionsLe déplacement de partitions entre tables impose que plusieurs conditions soient remplies, notamment que les tables aient la même structure, la même clé de partition, la même clé primaire et les mêmes index/projections. Des notes détaillées sur la façon de spécifier les partitions dans le DDL
ALTER sont disponibles ici.Cette fonctionnalité est utilisée par TTL lorsque le paramètre
ttl_only_drop_parts=1 est activé. Voir Gestion des données avec TTL pour en savoir plus.Applications
- Architectures à niveaux - déplacement des données entre les niveaux de stockage (voir Niveaux de stockage), ce qui permet de mettre en place des architectures hot-cold.
- Suppression efficace - lorsque les données atteignent le TTL défini (voir Gestion des données avec TTL)
Performances des requêtes
Gestion des données avec TTL (Time-to-live)
TTL au niveau de la table
ttl, par exemple.
h et de veiller à ce que cette valeur corresponde à la période de partitionnement. Par exemple, si vous partitionnez par jour, assurez-vous qu’il s’agit d’un multiple de jours, p. ex. 24h, 48h, 72h. Cela garantit automatiquement l’ajout d’une clause TTL à la table, p. ex. avec ttl: 96h.
TTLs planifiésLes TTL ne sont pas appliqués immédiatement, mais selon une planification, comme indiqué ci-dessus. Le paramètre de table MergeTree
merge_with_ttl_timeout définit le délai minimal, en secondes, avant de relancer une fusion avec un TTL de suppression. La valeur par défaut est de 14 400 secondes (4 heures). Mais il ne s’agit que du délai minimal : il peut s’écouler plus de temps avant qu’une fusion TTL ne soit déclenchée. Si la valeur est trop basse, de nombreuses fusions hors cycle pourront être effectuées, ce qui peut consommer beaucoup de ressources. Il est possible de forcer l’expiration d’un TTL à l’aide de la commande ALTER TABLE my_table MATERIALIZE TTL.ttl_only_drop_parts=1 ** (appliqué par le schéma par défaut). Lorsque ce paramètre est activé, ClickHouse supprime une part entière lorsque toutes les lignes qu’elle contient ont expiré. Supprimer des parts entières au lieu de nettoyer partiellement les lignes expirées par le TTL (au moyen de mutations gourmandes en ressources lorsque ttl_only_drop_parts=0) permet d’utiliser des valeurs merge_with_ttl_timeout plus courtes et de réduire l’impact sur les performances du système. Si les données sont partitionnées selon la même unité que celle utilisée pour l’expiration TTL, par exemple le jour, les parts ne contiendront naturellement que des données de l’intervalle défini. Cela garantit que ttl_only_drop_parts=1 puisse être appliqué efficacement.
TTL au niveau de la colonne
Body au cas où de nouvelles métadonnées dynamiques seraient ajoutées sans avoir été extraites au moment de l’insertion, par exemple un nouveau label Kubernetes. Après un certain temps, par exemple 1 mois, il peut devenir évident que ces métadonnées supplémentaires ne sont pas utiles, ce qui réduit l’intérêt de conserver la colonne Body.
Ci-dessous, nous montrons comment supprimer la colonne Body après 30 jours.
Pour spécifier un TTL au niveau d’une colonne, les utilisateurs doivent définir leur propre schéma. Cela ne peut pas être configuré dans l’OTel collector.
Recompression des données
ZSTD(1) pour les jeux de données d’observability, vous pouvez tester différents algorithmes de compression ou des niveaux de compression plus élevés, par exemple ZSTD(3). Outre la possibilité de le spécifier lors de la création du schéma, la compression peut être configurée pour changer après une période définie. Cela peut être pertinent si un codec ou un algorithme de compression améliore la compression, mais dégrade les performances des requêtes. Ce compromis peut être acceptable pour des données plus anciennes, qui sont interrogées moins fréquemment, mais pas pour des données récentes, davantage utilisées lors des investigations.
Un exemple est présenté ci-dessous, où nous compressons les données avec ZSTD(3) après 4 jours au lieu de les supprimer.
Évaluer les performancesNous recommandons aux utilisateurs d’évaluer toujours l’impact des différents niveaux et algorithmes de compression sur les performances d’insertion et de requête. Par exemple, les codecs delta peuvent être utiles pour compresser les horodatages. Toutefois, si ces horodatages font partie de la clé primaire, les performances de filtrage peuvent en pâtir.
Niveaux de stockage
Ne s’applique pas à ClickHouse CloudClickHouse Cloud utilise une copie unique des données stockée sur S3, avec des caches de nœud sur SSD. Les niveaux de stockage ne sont donc pas nécessaires dans ClickHouse Cloud.
ALTER TABLE MOVE PARTITION, le déplacement des données entre les volumes peut également être contrôlé à l’aide des TTL. Un exemple complet est disponible ici.
Gérer les changements de schéma
Utiliser des valeurs par défaut
valeurs DEFAULT“. La valeur par défaut spécifiée sera utilisée si elle n’est pas fournie lors de l’INSERT.
Les modifications du schéma peuvent être effectuées avant de modifier la logique de transformation d’une vue matérialisée ou la configuration d’un OTel collector, afin que ces nouvelles colonnes soient envoyées.
Une fois le schéma modifié, vous pouvez reconfigurer les OTel collectors. En supposant que les utilisateurs suivent le processus recommandé décrit dans “Extraction de la structure avec SQL”, dans lequel les OTel collectors envoient leurs données vers un moteur de table Null, avec une vue matérialisée chargée d’extraire le schéma cible et d’envoyer les résultats vers une table cible pour le stockage, la vue peut être modifiée à l’aide de la syntaxe ALTER TABLE ... MODIFY QUERY syntax. Supposons que nous ayons la table cible ci-dessous avec la vue matérialisée correspondante (semblable à celle utilisée dans “Extraction de la structure avec SQL”) pour extraire le schéma cible à partir des logs structurés OTel :
Size à partir de LogAttributes. Nous pouvons l’ajouter à notre schéma avec un ALTER TABLE, en indiquant la valeur par défaut :
size dans LogAttributes (elle vaudra 0 si elle n’existe pas). Cela signifie que les requêtes qui accèdent à cette colonne pour les lignes où la valeur n’a pas été insérée doivent accéder à la Map et seront donc plus lentes. Nous pourrions tout aussi bien la définir comme une constante, par exemple 0, ce qui réduirait le coût des requêtes ultérieures sur les lignes qui n’ont pas cette valeur. En interrogeant cette table, on constate que la valeur est renseignée comme prévu à partir de la Map :
ALTER TABLE, comme indiqué ci-dessous :
Size renseignée lors de l’insertion.
Créer de nouvelles tables
ALTER TABLE MODIFY QUERY ci-dessus. Avec cette approche, vous pouvez versionner vos tables, par exemple otel_logs_v3.
Cette approche laisse toutefois aux utilisateurs plusieurs tables à interroger. Pour interroger plusieurs tables, vous pouvez utiliser la fonction merge, qui accepte des motifs génériques pour le nom de la table. Nous le montrons ci-dessous en interrogeant les versions v2 et v3 de la table otel_logs :
merge et exposer aux utilisateurs finaux une table combinant plusieurs tables, le moteur de table Merge peut être utilisé. Nous l’illustrons ci-dessous :
EXCHANGE. Par exemple, pour ajouter une table v4, nous pouvons créer une nouvelle table et l’échanger de façon atomique avec la version précédente.