RousselTMLEARNING

Observabilité

Pourquoi Grafana Mimir ? Architecture et modes de déploiement

Les limites de Prometheus seul, ce qu'apporte Mimir (stockage long terme, haute disponibilité, multi-tenant), ses composants et ses modes de déploiement.

1. Les limites de Prometheus seul #

Pourquoi un stockage de métriques distribué.

Un serveur, un disque #

Prometheus est excellent pour collecter et alerter, mais il a été conçu comme un serveur autonome : ses données vivent sur son disque local, sa capacité est bornée par une seule machine et chaque instance ne voit que ce qu'elle collecte.

BesoinPrometheus seulAvec Mimir
Rétention de plusieurs annéesDisque local coûteux, pas de downsamplingStockage objet bon marché, rétention par tenant
Haute disponibilitéDeux réplicas aux données légèrement différentesDéduplication HA à l'ingestion, réplication ×3
Vue globaleUne instance = un périmètreToutes les sources dans une seule API PromQL
Plusieurs équipesUne instance par équipeMulti-tenant natif avec limites par tenant
Centaines de millions de sériesImpossible sur un nœudScalabilité horizontale de chaque composant

Mimir en une phrase #

Grafana Mimir est une base de données de séries temporelles distribuée, compatible Prometheus : elle reçoit les métriques par remote_write (ou OTLP), les stocke en blocs TSDB dans un stockage objet et les sert via l'API HTTP de Prometheus. Grafana l'interroge comme une source de données Prometheus classique.

À savoir : Mimir est né en 2022 d'un fork de Cortex par Grafana Labs, sous licence AGPLv3. Il en reprend l'architecture (hash ring, ingesters, store-gateway) avec de nombreuses optimisations : compacteur partitionné, moteur de requêtes plus rapide, chemin d'ingestion découplé par Kafka dans les versions récentes.

2. Les composants #

Chaque composant a un rôle unique et se met à l'échelle séparément.

Vue d'ensemble #

Architecture de Grafana Mimir
Les ingesters gardent les 2 dernières heures en mémoire puis téléversent des blocs ; les anciennes données sont lues par le store-gateway.
ComposantCheminRôle
distributorécritureValide les échantillons, applique les limites, déduplique les paires HA et répartit les séries vers les ingesters
ingesterécriture / lectureGarde les données récentes en mémoire (WAL sur disque), produit des blocs de 2 h et les téléverse
query-frontendlectureDécoupe les requêtes longues, met en cache les résultats, met en file d'attente
query-schedulerlectureFile d'attente partagée entre query-frontends et queriers (facultatif)
querierlectureÉvalue PromQL en interrogeant ingesters (récent) et store-gateways (historique)
store-gatewaylectureExpose les blocs du stockage objet, avec index-headers et caches
compactorfondFusionne et déduplique les blocs, applique la rétention, maintient le bucket index
rulerfondÉvalue les règles d'enregistrement et d'alerte par tenant
alertmanagerfondAlertmanager multi-tenant, configuré par API

Le hash ring #

Les composants qui partagent une charge (distributors, ingesters, store-gateways, compactors, rulers) se coordonnent via un hash ring. Chaque instance y possède des jetons ; le hachage d'une série (tenant + labels) désigne les ingesters responsables. Le ring est stocké dans memberlist (gossip, par défaut), Consul ou etcd.

Bonne Pratique : Gardez memberlist : il ne demande aucune dépendance externe. Ouvrez simplement le port de gossip (7946 par défaut) entre les pods Mimir.

3. Modes de déploiement #

Un seul binaire, plusieurs façons de le lancer.

Monolithique ou microservices #

Tous les composants sont dans le même binaire. Le paramètre -target choisit ce que lance un processus.

ModeLancementPour qui
Monolithique-target=all (défaut)Tests, petites installations, TP ; on peut lancer plusieurs réplicas identiques
Microservices-target=distributor, -target=ingester...Production : chaque composant se met à l'échelle selon sa charge (chart Helm mimir-distributed)
# Monolithique : tous les composants dans un processus
mimir -config.file=/etc/mimir.yaml -target=all

# Un seul composant
mimir -config.file=/etc/mimir.yaml -target=ingester
À savoir : Les versions récentes de Mimir proposent l'architecture « ingest storage » : les distributors écrivent dans Kafka (ou un équivalent compatible) et les ingesters consomment ce journal. Lecture et écriture sont ainsi découplées : une rafale de requêtes ne ralentit plus l'ingestion. Le principe du stockage en blocs reste identique, c'est celui que décrit cette formation.

Les ports et points d'entrée à connaître #

Point d'entréeUsage
/api/v1/pushRéception remote_write Prometheus
/otlp/v1/metricsRéception OTLP (OpenTelemetry)
/prometheus/api/v1/queryAPI de requête compatible Prometheus (URL de la datasource Grafana : http://mimir:8080/prometheus)
/prometheus/config/v1/rulesAPI du ruler
/alertmanagerInterface et API de l'Alertmanager
/ready, /metrics, /configSanté, métriques internes, configuration effective
/ingester/ring, /distributor/ha_trackerPages d'état du ring et du suivi HA

Articles liés

La stack LGTM (Loki, Grafana, Tempo, Mimir) : architecture et mise en place

Comprendre la stack LGTM de Grafana Labs : Loki pour les logs, Grafana pour la visualisation, Tempo pour les …

Mimir : le chemin d'écriture (distributor, ingesters, réplication et déduplication HA)

Comment Mimir ingère les métriques : remote_write, validation et limites du distributor, hash ring, réplicati…

Mimir : le chemin de lecture (query-frontend, querier, store-gateway et caches)

Comment Mimir répond à une requête PromQL : découpage et cache du query-frontend, file d'attente, queriers, s…

Pour aller plus loin