Data Engineering

ClickHouse pour les données de séries temporelles : Optimisation de la conception du schéma et de la compression pour la télémétrie IoT

La gestion de volumes massifs de télémétrie IoT nécessite un moteur de base de données capable de traiter une ingestion à haut débit tout en maintenant des lectures à faible latence. ClickHouse s'est imposé comme une base de données colonnelle de premier plan à cet effet, mais ses performances dépendent fortement de la conception du schéma et des stratégies de compression. Dans cet article, nous explorons comment structurer vos tables ClickHouse pour maximiser l'efficacité des données de séries temporelles.

Choisir le bon moteur de table et l'ordonnancement

Le fondement d'une charge de travail efficace pour les séries temporelles dans ClickHouse est la famille de moteurs de tables MergeTree. Pour la plupart des scénarios IoT, ReplicatedMergeTree ou ReplicatedCollapsingMergeTree (si vous avez besoin de données mutables via la versioning) sont les choix privilégiés. L'élément critique ici est la clause ORDER BY. Contrairement aux bases de données traditionnelles, ClickHouse trie physiquement les données sur le disque en fonction de la clé primaire. Pour la télémétrie, vous souhaitez ordonner par l'identifiant de l'appareil et l'horodatage. Cela garantit que les données pour un appareil spécifique sont contiguës, permettant ainsi des analyses d'intervalle efficaces.

CREATE TABLE iot_telemetry (
    device_id UUID,
    event_time DateTime,
    sensor_type String,
    temperature Float64,
    humidity Float64,
    battery_level UInt8
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/iot_telemetry', '{replica}')
ORDER BY (device_id, event_time);

Remarquez l'utilisation de device_id et event_time dans la clé d'ordre. Si vous interrogez toutes les lectures de device_123 entre 14h et 15h, ClickHouse peut ignorer la plupart des blocs de données sur le disque, réduisant considérablement l'E/S.

Exploiter la compression et la granularité

Le stockage colonnel permet à ClickHouse d'appliquer différents codecs de compression à différentes colonnes. Les colonnes à haute cardinalité comme sensor_type ou les identifiants de type chaîne bénéficient de la compression LZ4 ou ZSTD, tandis que les colonnes à faible cardinalité comme battery_level (qui répètent probablement des valeurs) pourraient bénéficier du codage par dictionnaire ou de codecs plus simples. De plus, l'ajustement de la granularité est crucial. La taille de granule par défaut est de 8192 lignes. Pour la télémétrie à haute fréquence où vous interrogez souvent de petites fenêtres temporelles, une taille de granule plus petite (par exemple, 4096) peut améliorer les performances de lecture au prix d'un léger surcoût en métadonnées.

Pour définir explicitement la compression pour des colonnes spécifiques, vous pouvez utiliser le paramètre CODEC dans la définition de la colonne :

ALTER TABLE iot_telemetry
MODIFY COLUMN sensor_type CODEC(LZ4);

ALTER TABLE iot_telemetry
MODIFY COLUMN temperature CODEC(ZSTD);

ZSTD offre généralement de meilleurs taux de compression que LZ4 pour les données numériques, mais est plus lent. Pour les tableaux de bord en temps réel où la vitesse est primordiale, LZ4 est souvent préféré pour les colonnes fréquemment accédées.

Partitionnement pour la gestion du cycle de vie des données

Le partitionnement par le temps est essentiel pour les données IoT afin de faciliter les politiques TTL (Time-To-Live) et un élagage efficace des données. En partitionnant sur event_time, vous pouvez facilement supprimer les anciennes données ou les déplacer vers un stockage froid sans balayer l'ensemble de la table. Un schéma courant consiste à partitionner par mois ou par jour, selon le volume de données.

ALTER TABLE iot_telemetry
PARTITION BY toMonth(event_time);

ALTER TABLE iot_telemetry
MODIFY TTL event_time + INTERVAL 90 DAY;

Cette configuration garantit que les données ayant plus de 90 jours sont automatiquement supprimées, maintenant ainsi vos coûts de stockage chaud à un niveau gérable. Combiner cela avec la clé ORDER BY crée une disposition physique très efficace où les données sont à la fois triées pour des recherches rapides et partitionnées pour une gestion facile.

Conclusion

L'optimisation de ClickHouse pour la télémétrie IoT ne consiste pas seulement à choisir la bonne base de données ; il s'agit d'aligner votre conception de schéma avec vos modèles de requêtes. En sélectionnant soigneusement la clé ORDER BY, en ajustant les codecs de compression et en mettant en œuvre un partitionnement stratégique, vous pouvez construire un système robuste capable de traiter des millions de points de données par seconde avec des temps de requête inférieurs à la seconde. Commencez par ces principes fondamentaux et surveillez vos journaux de requêtes pour identifier d'autres opportunités d'optimisation.

Share: