Stratégie de fonctionnement en parallèle
- Risque minimal : en faisant fonctionner les deux systèmes en parallèle, vous conservez l’accès aux données et aux tableaux de bord existants tout en validant ClickStack et en familiarisant vos utilisateurs avec le nouveau système.
- Expiration naturelle des données : la plupart des données d’observabilité ont une durée de rétention limitée (généralement 30 jours ou moins), ce qui permet une transition naturelle à mesure que les données expirent dans Elastic.
- Migration simplifiée : pas besoin d’outils ni de processus complexes pour transférer les données historiques d’un système à l’autre.
Migration des donnéesNous présentons, dans la section “Migration des données”, une approche pour migrer les données essentielles d’Elasticsearch vers ClickHouse. Cette approche ne doit pas être utilisée pour des jeux de données plus volumineux, car elle est rarement performante : elle est limitée par la capacité d’Elasticsearch à exporter efficacement, et seul le format JSON est pris en charge.
Étapes de mise en œuvre
Configurer la double ingestion
Configurez votre pipeline de collecte de données pour envoyer simultanément les données vers Elastic et ClickStack.La façon de procéder dépend de vos agents de collecte actuels ; consultez “Migrating Agents”.Valider et comparer
- Exécutez des requêtes sur les deux systèmes pour garantir la cohérence des données
- Comparez les performances des requêtes et les résultats
- Migrez les tableaux de bord et les alertes vers ClickStack. Il s’agit actuellement d’un processus manuel.
- Vérifiez que tous les tableaux de bord et alertes critiques fonctionnent comme prévu dans ClickStack
Transition progressive
- À mesure que les données expirent naturellement dans Elastic, vous vous appuierez de plus en plus sur ClickStack
- Une fois que vous avez confiance dans ClickStack, vous pouvez commencer à rediriger les requêtes et les tableaux de bord
Rétention à long terme
- Continuez à faire fonctionner les deux systèmes en parallèle jusqu’à ce que toutes les données d’Elastic aient expiré
- Les fonctionnalités de stockage hiérarchisé de ClickStack peuvent vous aider à gérer efficacement les données sur le long terme.
- Envisagez d’utiliser des vues matérialisées pour conserver des données historiques agrégées ou filtrées, tout en laissant expirer les données brutes.
Calendrier de la migration
- Rétention de 30 jours : la migration peut être achevée en un mois.
- Rétention plus longue : continuez à faire fonctionner les deux systèmes en parallèle jusqu’à ce que les données expirent dans Elastic.
- Données historiques : si cela est absolument nécessaire, envisagez d’utiliser Migration des données pour importer des données historiques ciblées.
Migration des paramètres
Paramètres recommandés
- ClickHouse Cloud : utilise par défaut une architecture à shard unique avec plusieurs répliques. Le stockage et le compute évoluent indépendamment, ce qui en fait une solution idéale pour les cas d’usage d’observabilité avec des profils d’ingestion imprévisibles et des charges de travail à forte lecture.
- ClickHouse OSS : dans les déploiements autogérés, nous recommandons :
- de commencer avec un seul shard
- de privilégier une mise à l’échelle verticale avec davantage de CPU et de RAM
- d’utiliser le stockage hiérarchisé pour étendre le disque local avec un stockage d’objets compatible S3
- d’utiliser
ReplicatedMergeTreesi une haute disponibilité est requise - pour la tolérance aux pannes, 1 réplique de votre shard est généralement suffisante pour les charges de travail d’observabilité.
Quand recourir au sharding
- Votre taux d’ingestion dépasse la capacité d’un seul nœud (généralement >500K lignes/s)
- Vous avez besoin d’une isolation des tenants ou d’une séparation des données par région
- Votre jeu de données total est trop volumineux pour un seul serveur, même avec le stockage objet
Rétention et TTL
- Supprimer automatiquement les données expirées
- Déplacer les données plus anciennes vers un stockage objet à froid
- Conserver uniquement les logs récents, fréquemment consultés, sur un disque rapide
Migration des données
- De petites tables de correspondance utilisées pour l’enrichissement des données (par ex., des correspondances utilisateur, des catalogues de services)
- Des données métier stockées dans Elasticsearch qui doivent être corrélées avec les données d’observabilité, car les capacités SQL de ClickHouse et ses intégrations de business intelligence facilitent davantage la maintenance et l’interrogation des données que les options de requête plus limitées d’Elasticsearch.
- Des données de configuration qui doivent être conservées pendant la migration
Migrer le schéma
Créez une table dans ClickHouse pour l’index en cours de migration depuis Elasticsearch. Vous pouvez associer les types Elasticsearch à leur équivalent ClickHouse. Vous pouvez également vous appuyer sur le type de données JSON dans ClickHouse, qui créera dynamiquement des colonnes du type approprié au fur et à mesure de l’insertion des données.Prenez le mapping Elasticsearch suivant pour un index contenant des donnéessyslog :Mapping Elasticsearch
Mapping Elasticsearch
Schéma ClickHouse
Schéma ClickHouse
- Les tuples sont utilisés pour représenter des structures imbriquées plutôt que par notation pointée
- Utilisez les types ClickHouse appropriés selon le mapping :
keyword→Stringdate→DateTimeboolean→UInt8long→Int64ip→Array(Variant(IPv4, IPv6)). Nous utilisons ici unVariant(IPv4, IPv6), car ce champ contient à la fois des adressesIPv4etIPv6.object→JSONpour l’objet syslog, dont la structure est imprévisible.
- Les colonnes
host.ipethost.macsont explicitement de typeArray, contrairement à Elasticsearch où tous les types sont des tableaux. - Une clause
ORDER BYest ajoutée à partir du timestamp et du nom d’hôte pour optimiser les requêtes basées sur le temps MergeTree, particulièrement adapté aux données de logs, est utilisé comme moteur
- Validation des données – l’application d’un schéma strict évite le risque d’explosion du nombre de colonnes, en dehors de structures spécifiques.
- Évite le risque d’explosion du nombre de colonnes : bien que le type JSON puisse évoluer jusqu’à potentiellement des milliers de colonnes, les sous-colonnes étant stockées comme des colonnes dédiées, cela peut entraîner une explosion du nombre de fichiers de colonnes, avec la création d’un nombre excessif de fichiers, ce qui affecte les performances. Pour atténuer ce problème, le type Dynamic sous-jacent utilisé par JSON propose un paramètre
max_dynamic_paths, qui limite le nombre de chemins uniques stockés dans des fichiers de colonnes distincts. Une fois ce seuil atteint, les chemins supplémentaires sont stockés dans un fichier de colonnes partagé à l’aide d’un format compact encodé, ce qui préserve les performances et l’efficacité du stockage tout en prenant en charge une ingestion flexible des données. L’accès à ce fichier de colonnes partagé est toutefois moins performant. Notez cependant que la colonne JSON peut être utilisée avec des indices de type. Les colonnes « annotées » offriront les mêmes performances que les colonnes dédiées. - Introspection plus simple des chemins et des types : bien que le type JSON prenne en charge des fonctions d’introspection pour déterminer les types et les chemins qui ont été inférés, les structures statiques peuvent être plus simples à explorer, par exemple avec
DESCRIBE.
Vous pouvez également créer simplement une table avec une seule colonne
JSON.Nous fournissons une indication de type pour les colonnes
host.name et timestamp dans la définition JSON, car nous les utilisons dans la clé de tri/la clé primaire. Cela permet à ClickHouse de savoir que ces colonnes ne seront pas nulles et de déterminer quelles sous-colonnes utiliser (il peut y en avoir plusieurs pour chaque type, ce qui serait sinon ambigu).JSON aux sous-structures dynamiques lorsque cela s’avère nécessaire.Pour plus de détails sur l’utilisation du type JSON dans les schémas et sur la façon de l’appliquer efficacement, nous vous recommandons le guide “Designing your schema”.Installer elasticdump
Nous recommandons elasticdump pour exporter des données depuis Elasticsearch. Cet outil nécessite node et doit être installé sur une machine bénéficiant d’une bonne connectivité réseau avec Elasticsearch et ClickHouse. Nous recommandons un serveur dédié avec au moins 4 cœurs et 16 Go de RAM pour la plupart des exportations.elasticdump présente plusieurs avantages pour la migration des données :- Il interagit directement avec l’API REST d’Elasticsearch, ce qui garantit une exportation correcte des données.
- Il préserve la cohérence des données pendant le processus d’exportation grâce à l’API Point-in-Time (PIT) ; cela crée un instantané cohérent des données à un moment précis.
- Il exporte directement les données au format JSON, qui peut être transmis en flux au ClickHouse client pour l’insertion.
elastic dump dans la même zone de disponibilité ou le même centre de données afin de minimiser le trafic réseau sortant et de maximiser le débit.Installer ClickHouse client
Assurez-vous que ClickHouse est installé sur le serveur où se trouveelasticdump. Ne démarrez pas de serveur ClickHouse - ces étapes ne nécessitent que le client.Transférer les données en flux continu
Pour transférer des données en flux continu entre Elasticsearch et ClickHouse, utilisez la commandeelasticdump en envoyant directement sa sortie vers le clickhouse client. La commande suivante insère les données dans notre table bien structurée logs_system_syslog.elasticdump :type=data- limite la réponse au seul contenu du document dans Elasticsearch.input-index- notre index d’entrée Elasticsearch.output=$- redirige tous les résultats vers stdout.- l’option
sourceOnly, qui garantit l’omission des champs de métadonnées dans la réponse. - l’option
searchAfter, pour utiliser l’API searchAfterafin de paginer efficacement les résultats. pit=truepour garantir des résultats cohérents entre les requêtes à l’aide de la Point in Time API.
Voici les paramètres du client ClickHouse utilisés ici (hormis les informations d’authentification) :
max_insert_block_size=1000- le client ClickHouse enverra les données dès que ce nombre de lignes sera atteint. L’augmenter améliore le débit, au prix d’un temps de constitution du bloc plus long, ce qui allonge donc le délai avant que les données n’apparaissent dans ClickHouse.min_insert_block_size_bytes=0- désactive le squashing des blocks côté server en fonction du nombre d’octets.min_insert_block_size_rows=1000- regroupe les blocks provenant des clients côté server. Dans ce cas, nous le définissons surmax_insert_block_sizeafin que les lignes apparaissent immédiatement. Augmentez cette valeur pour améliorer le débit.query="INSERT INTO logs_system_syslog FORMAT JSONAsRow"- insère les données au format JSONEachRow. Cela convient à un schéma bien défini tel quelogs_system_syslog.
Vous pouvez vous attendre à un débit de l’ordre de plusieurs milliers de lignes par seconde.
Insertion dans une seule ligne JSONSi vous insérez dans une seule colonne JSON (voir le schéma Voir “Lire du JSON comme un objet” pour en savoir plus.
syslog_json ci-dessus), la même commande d’insertion peut être utilisée. Cependant, vous devez spécifier JSONAsObject comme format au lieu de JSONEachRow, par ex.Transformer les données (facultatif)
Les commandes ci-dessus supposent une correspondance 1:1 entre les champs Elasticsearch et les colonnes ClickHouse. Il est souvent nécessaire de filtrer et de transformer les données Elasticsearch avant de les insérer dans ClickHouse.Pour cela, on peut utiliser la fonction de tableinput, qui permet d’exécuter n’importe quelle requête SELECT sur stdout.Supposons que nous souhaitions stocker uniquement les champs timestamp et hostname de nos données précédentes. Le schéma ClickHouse :elasticdump dans cette table, nous pouvons simplement utiliser la fonction de table input pour que le type JSON détecte et sélectionne dynamiquement les colonnes requises. Notez que cette requête SELECT pourrait facilement inclure un filtre.@timestamp et utiliser le format d’entrée JSONAsObject.