L’ère numérique produit un flux d’informations d’une ampleur sans précédent. Chaque interaction humaine ou logicielle génère des traces numériques massives. Pour répondre à ce défi, des solutions analytiques comme ClickHouse sont devenues des références. Les entreprises cherchent à stocker ces données avec un temps de réponse très faible.
Les architectures traditionnelles montrent leurs limites face à de tels besoins. Le passage à une approche analytique transforme en profondeur le stockage de données. Traiter des requêtes très complexes sur de larges fenêtres devient un atout majeur. Ce document détaille toute la chaîne technique, de l’ingestion jusqu’à l’affichage.
Quand les bases de données traditionnelles calent face aux milliards de clics
Les bases OLTP garantissent la fiabilité des transactions grâce au stockage par lignes. Ce modèle excelle pour modifier des profils ou gérer des opérations financières unitaires. Il devient toutefois moins efficace lors de l’analyse décisionnelle de flux très massifs. Le calcul d’une simple métrique peut exiger de tout lire, saturant ainsi le disque.
Ces moteurs relationnels exploitent notamment des index B‑Tree pour retrouver rapidement des lignes précises. Ils peuvent parfaitement gérer de très gros volumes, mais leur architecture orientée lignes devient moins efficace lorsqu’il faut scanner et agréger en continu une large part de tables très volumineuses. ClickHouse ne remplace donc pas PostgreSQL ou MySQL pour le transactionnel : il vise un autre type de charge, centré sur les lectures analytiques massives.
L’émergence des moteurs OLAP spécialisés répond aux contraintes majeures du Big Data. Ces architectures privilégient la lecture de masse plutôt que les transactions unitaires. La réduction des verrous complexes au profit de l’ajout pur accélère l’ingestion de données. La base peut alors fonctionner comme un journal d’événements immuable à très grande échelle.
Structure d’un événement web et modélisation dans ClickHouse
La modélisation analytique privilégie la dénormalisation au détriment des jointures complexes. Les ingénieurs conçoivent des tables plates réunissant toutes les métriques de l’événement. Ces structures hébergent des dizaines de colonnes contextuelles décrivant l’action d’un utilisateur. L’emploi du type DateTime64 permet une précision pouvant aller jusqu’à la nanoseconde pour l’horodatage.
L’utilisation de types semi‑structurés comme Map ou JSON facilite l’ingestion d’attributs variables. Ce choix souple évite la modification fréquente du schéma physique de la base. Le traitement du JSON à la volée peut toutefois surcharger le processeur lors des requêtes. L’extraction des paramètres fréquents dans des colonnes statiques préserve la vitesse de calcul.
Le choix minutieux des types de données réduit fortement l’empreinte mémoire sur le disque. L’usage des types IPv4 ou IPv6 remplace la chaîne de caractères par des entiers binaires. Les identifiants à faible cardinalité exploitent des types dédiés pour accélérer le traitement analytique. Cette rigueur de modélisation initiale conditionne l’efficacité réelle du moteur orienté colonnes.
Ingestion en temps réel : alimenter le moteur via Apache Kafka
L’intégration des flux continus s’appuie souvent sur un bus de messages comme Apache Kafka. Le moteur Kafka de ClickHouse agit comme un consommateur du flux, mais il n’est pas destiné à conserver durablement les événements. En pratique, il est généralement associé à une vue matérialisée qui transforme les messages puis les écrit dans une table MergeTree. Cette intégration permet de construire un pipeline temps réel sans multiplier les briques ETL intermédiaires.
L’écriture par lots reste essentielle pour éviter de créer une multitude de petites parts. Pour les insertions synchrones, ClickHouse recommande au minimum environ 1 000 lignes par lot et, lorsque c’est possible, des lots de 10 000 à 100 000 lignes. Depuis ClickHouse 26.3 LTS, les insertions asynchrones sont activées par défaut : le serveur peut regrouper automatiquement les petits inserts en mémoire puis les écrire ensemble sur le stockage.
Le traitement analytique en temps réel repose donc souvent sur de très petits lots plutôt que sur une écriture physique ligne par ligne. La latence dépend fortement de la configuration, de Kafka, des seuils de flush, de la charge et du réseau : il n’existe pas de valeur universelle. Depuis ClickHouse 26.1, la déduplication des insertions asynchrones peut en outre être propagée de façon cohérente aux vues matérialisées dépendantes, ce qui sécurise les retries dans les pipelines d’ingestion.
Au cœur de la performance : l’organisation physique avec MergeTree
Le moteur MergeTree structure et organise l’indexation physique des données sur le disque. La clause ORDER BY trie les données ingérées sous forme de parties complètement immuables. Un processus asynchrone fusionne continuellement ces segments pour optimiser les lectures. Cette réorganisation permanente de l’information favorise une efficacité élevée dans le temps.
Le choix de la clé de tri constitue l’une des décisions architecturales les plus importantes. Aligner les données sur les filtres fréquents permet d’ignorer d’immenses blocs inutiles. ReplacingMergeTree peut éliminer progressivement des versions ou doublons lors des merges en arrière-plan, à condition que la clé ORDER BY et, le cas échéant, la colonne de version soient correctement définies. L’opérateur FINAL applique cette logique de remplacement au moment de la requête afin d’obtenir un résultat dédupliqué avant que tous les merges aient eu lieu, mais son coût peut être important sur de gros volumes.
La clause PARTITION BY découpe souvent la table selon une dimension temporelle, par exemple mensuelle. Ce mécanisme facilite le cycle de vie des données, les opérations de maintenance et certains déplacements vers du stockage objet. Supprimer ou détacher une partition complète peut être très rapide du point de vue des métadonnées, même si le nettoyage physique peut se poursuivre ensuite en arrière-plan. Un sur-partitionnement excessif multiplie en revanche les parts et dégrade les performances.
Pourquoi le stockage en colonnes et l’indexation dispersée changent la donne
Le stockage orienté colonnes regroupe physiquement les données d’un même attribut sur le disque. Une requête ciblant trois colonnes sur cent lit principalement les fichiers de ces trois colonnes. Cette sélectivité drastique réduit considérablement le volume d’octets transférés vers la mémoire. L’architecture réduit ainsi le principal goulot d’étranglement d’accès matériel des bases classiques.
L’accès aux données s’accélère grâce à un index primaire sparse, très différent d’un B‑Tree classique. Avec la granularité par défaut, les parts MergeTree sont découpées en granules d’environ 8 192 lignes et l’index conserve des marques correspondant à ces granules plutôt qu’une entrée par ligne. Cette granularité peut être configurée ou devenir adaptative selon les données. Le résultat est un index primaire beaucoup plus compact qu’un index contenant une entrée pour chaque enregistrement.
L’index primaire de plusieurs milliards de lignes tient souvent intégralement dans la mémoire vive. Lors d’une requête, le moteur consulte d’abord cette structure ultralégère hébergée en RAM. Le système identifie rapidement les seuls granules utiles à charger depuis le disque. Il écarte ainsi la majorité des données hors périmètre pour optimiser le traitement.
Optimisation matérielle : pousser le processeur dans ses derniers retranchements
Le moteur vectorisé exécute les calculs sur des lots de valeurs plutôt que ligne par ligne. Selon l’opérateur, les traitements vectorisés travaillent typiquement sur des lots de l’ordre de 1 024 à 4 096 valeurs par appel, tandis que la taille des blocs internes peut varier. Cette organisation réduit la surcharge d’interprétation et permet au compilateur d’exploiter les instructions SIMD disponibles, comme AVX2 ou AVX‑512, sur les boucles adaptées.
Chaque instruction SIMD applique la même opération à un ensemble complet de valeurs. Ce traitement parallèle optimise la mémoire cache L1 et L2 du processeur principal. Par ailleurs, la compression poussée des colonnes augmente le débit global du système. Lire un fichier compressé puis le décompresser est souvent plus rapide qu’un transfert brut.
LZ4 offre un débit de décompression très élevé et reste le codec par défaut des déploiements ClickHouse auto-hébergés. ClickHouse Cloud utilise en revanche ZSTD par défaut afin de privilégier un meilleur ratio de compression. Des codecs et encodages spécialisés comme Delta, DoubleDelta ou Gorilla peuvent également être combinés avec la compression générale selon le type de données. Ces réglages permettent d’arbitrer précisément entre espace disque, bande passante et coût processeur.
Calculer la rétention et les tunnels d’événements sans effondrer la mémoire
L’analyse de parcours web nécessite des calculs qui deviennent rapidement complexes avec du SQL générique. La fonction native windowFunnel permet de modéliser directement des tunnels de conversion à partir d’événements ordonnés dans le temps. Elle évite de reconstruire systématiquement ces séquences avec une succession de jointures. Les performances dépendent toutefois du volume, de la cardinalité, de l’ordre physique des données et des ressources disponibles.
La fonction de cohort retention mesure le réengagement des utilisateurs sur la durée. Ces algorithmes natifs s’appuient sur des états d’agrégation compacts et optimisés. Ils traitent directement les vecteurs de données tout en limitant l’allocation mémoire. Cette conception évite la saturation du système lors du croisement de longs historiques.
Le calcul exact des visiteurs uniques peut devenir coûteux lorsque la cardinalité explose. ClickHouse propose plusieurs fonctions approximatives, dont uniq et uniqCombined, qui utilisent des structures probabilistes adaptées au comptage de cardinalité. Leur précision, leur consommation mémoire et leur comportement diffèrent selon la fonction choisie et le volume traité : il vaut donc mieux parler d’un compromis contrôlé entre exactitude et vitesse plutôt que d’une marge d’erreur universelle.
Vues matérialisées : la pré-agrégation au fil de l’eau pour accélérer la lecture
L’interrogation répétée de pétaoctets de données brutes épuise inutilement les ressources matérielles. La création de vues matérialisées aide à résoudre ce problème en agissant comme un déclencheur d’insertion. Ce mécanisme intercepte chaque nouveau bloc de données dès son arrivée dans la table principale. Il applique les agrégations nécessaires puis écrit le résultat dans une table destination dédiée.
Ce principe gagne en efficacité lorsqu’il est associé au moteur AggregatingMergeTree. La vue peut conserver les états intermédiaires de fonctions d’agrégation au lieu de recalculer systématiquement les données brutes. La requête finale fusionne alors ces états précalculés lors de l’affichage. Selon les dimensions retenues, cette pré-agrégation peut réduire de plusieurs ordres de grandeur le volume réellement lu par les tableaux de bord.
Les vues matérialisées incrémentales exigent une attention particulière lors de leur création : elles traitent les nouveaux blocs insérés après leur mise en place et ne recalculent pas automatiquement tout l’historique. Les données passées doivent donc être backfillées explicitement, par exemple via des tables temporaires ou des insertions contrôlées. ClickHouse propose aussi des refreshable materialized views, qui réexécutent périodiquement une requête complète et répondent à un autre besoin. Multiplier les vues a par ailleurs un coût sur l’ingestion, puisqu’un même bloc peut alimenter plusieurs traitements.
Servir les tableaux de bord et piloter la rétention du stockage
Le système expose une interface HTTP ainsi qu’un protocole natif, ce qui facilite son intégration dans de nombreux outils. Grafana, Apache Superset ou Metabase disposent de connecteurs adaptés à ClickHouse. Avec un schéma, des clés de tri et des agrégations bien conçus, les tableaux de bord peuvent interroger des historiques très volumineux avec des latences compatibles avec une exploration interactive.
ClickHouse peut également servir des applications analytiques exposées à des milliers d’utilisateurs, mais la capacité réelle dépend du coût de chaque requête, du nombre de graphiques déclenchés par page, de la latence visée et du dimensionnement du cluster. Des requêtes sélectives peuvent soutenir un débit très élevé, tandis que de grosses agrégations concurrentes consomment rapidement CPU et mémoire. Pré-agrégation, cache, limites de ressources, workload scheduling et ajout de réplicas permettent d’absorber les pics de concurrence.
La gestion du cycle de vie s’appuie sur des règles TTL capables d’expirer, déplacer ou transformer automatiquement certaines données. Sur un déploiement auto-hébergé, le tiered storage peut par exemple conserver les données chaudes sur SSD puis déplacer les parties froides vers un stockage objet compatible S3. ClickHouse Cloud suit une architecture différente, déjà fondée sur le stockage objet et une couche de cache locale. Dans les deux cas, l’objectif reste le même : conserver les données utiles tout en maîtrisant le coût du stockage et des lectures.
- Partager l'article :

