Introduction
MinIO alimente le stockage d'objets compatible S3 dans Docker et Kubernetes. Pour le maintenir fiable et performant en production, vous avez besoin d'une visibilité claire sur la disponibilité, la capacité, la performance et la sécurité des données, ainsi que d'un petit ensemble d'alertes bien ajustées et de runbooks concis.
Ce guide se concentre sur les signaux qui comptent, montre des requêtes Prometheus concrètes et des règles d'alerte de départ, et ajoute un tableau signal-action, des conseils d'ajustement d'alertes, un runbook d'incident compact et une liste de vérification post-changement. Il se termine par un pilote local que vous pouvez valider avant de déployer en production.
Ce que vous obtiendrez :
- Une portée de surveillance priorisée et un tableau signal-action
- Des requêtes Prometheus et des règles d'alerte prêtes à copier avec guidage d'ajustement
- Des motifs pratiques de logs et traces pour alerte précoce
- Un runbook d'incident compact et une liste de vérification post-changement
- Un plan de pilote local sûr et mesurable
Quoi surveiller dans MinIO
Concentrez-vous d'abord sur l'impact utilisateur, puis sur les causes racines et les actions opérateur.
- Disponibilité et santé API :
up{job="minio"}, taux de requêtes S3 et ratio d'erreurs, percentiles de durée de requête (p50, p95, p99)- Capacité et croissance :
- Octets total/utilisés du cluster, marge libre, taux de consommation, buckets/prefixes chauds (utilisez
mc admin bucket toppour identifier les buckets chauds par nombre de requêtes) - Santé cluster et disques :
- Nœuds et disques hors ligne, activité/arrears de guérison, erreurs E/S disque
- Performance :
- Débit lecture/écriture, concurrence par opération, taux de cache hit (si activé)
- Sécurité et accès :
- Pics AccessDenied, opérations admin, erreurs handshake TLS
- Workflows de données :
- Lag et échecs de réplication, changements de débit batch/ETL
- Saturation hôte (via node exporter ou métriques plateforme) :
- CPU, pression mémoire, latence disque, saturation réseau
Tableau signal-action
Utilisez ce tableau pour transformer les signaux de premier niveau en premières vérifications et actions. Traitez les seuils comme points de départ ; établissez la ligne de base de votre environnement avant d'appliquer.
| Domaine | Symptômes primaires (ce que voient les utilisateurs) | Métriques/logs utiles | Premières vérifications | Actions immédiates |
|---|---|---|---|---|
| Disponibilité | 5xx intermittents, timeouts | up{job="minio"}, minio_s3_requests_total, minio_s3_requests_errors_total, logs : connection timeout | Des cibles sont-elles down ? Déploiement récent ? Redémarrages réseau/pod ? | Restaurer pods/nœuds down, annuler changements risqués, valider DNS/endpoints service |
| Capacité | Échecs upload, écritures lentes, tempêtes de guérison après redémarrages | minio_cluster_capacity_used_bytes, minio_cluster_capacity_total_bytes, croissance octets utilisés | Tendance usage vs marge, croissance gros bucket/prefixe, règles cycle de vie | Appliquer cycle de vie, nettoyer multipart échoués, ajouter/étendre disques ou nœuds |
| Latence | GET/PUT lents, retentatives client | minio_s3_request_duration_seconds_bucket (p95/p99), débit par nœud | Latence localisée aux ops ou nœuds ? Pics E/S hôte ? | Réduire concurrence, isoler E/S, mettre en cache prefixes chauds, scale out |
| Erreurs | Pics 4xx/5xx, échecs auth | minio_s3_requests_errors_total par code, logs : AccessDenied, SignatureDoesNotMatch | Changements récents clé/politique ? Changements côté client ? | Restaurer identifiants/politiques, rate-limiter clients abusifs, confirmer sync horloge |
| Réplication | Objets en retard entre sites | ex. minio_bucket_replication_pending_count ou minio_bucket_replication_lag_seconds (vérifiez noms exacts dans votre version), logs : échecs réplication | Taille et âge backlog, chemin réseau, santé site cible | Débloquer réplication, corriger identifiants/permissions, pauser jobs bruyants |
| Certificats | Échecs handshake TLS, clients ne connectent pas | Logs : erreurs handshake TLS, blackbox_exporter probe_ssl_earliest_cert_expiry | Date expiration, chaîne complète installée, horloges sync | Renouveler/déployer certs, recharger MinIO, vérifier chaîne complète et SANs |
| Saturation hôte | Toutes ops plus lentes, timeouts occasionnels | node_cpu_seconds_total, node_disk_io_time_seconds_total, node_load1, node_network* | CPU steal/waits, temps disque occupé, pertes paquets | Déplacer voisins bruyants, ajouter IOPS/CPU, ajuster files, rééquilibrer trafic |
Aperçu du flux de travail
- Exposer les métriques depuis MinIO
- MinIO expose les métriques Prometheus à
/minio/v2/metrics/cluster. - Vérification rapide :
curl http://MINIO_HOST:9000/minio/v2/metrics/cluster
- Collecter avec Prometheus
- Ajoutez un job de scrape ciblant vos endpoints MinIO.
# prometheus.yml
scrape_configs:
- job_name: minio
metrics_path: /minio/v2/metrics/cluster
static_configs:
- targets: ["minio:9000
labels:
cluster: demo
- Visualiser avec Grafana
- Construisez des panneaux de première rangée pour disponibilité, latence, ratio d'erreurs et capacité. Utilisez des panneaux répétitifs par nœud pour les clusters distribués.
- Alerter sur les risques
- Commencez par capacité, nœuds/cibles down, ratio d'erreurs élevé et latence élevée. Étendez à réplication, expiration cert et saturation hôte.
- Ajouter logs et traces
- Transférez les logs JSON vers votre plateforme de logs. Utilisez
mc admin tracepour échantillonnage live d'appels S3 pendant incidents.
- Répondre avec runbooks
- Pour chaque alerte, documentez vérifications, causes probables et mitigations sûres.
Requêtes Prometheus réutilisables
Les noms de métriques varient selon la version et le build MinIO. Dans Prometheus, tapez minio_ pour parcourir les métriques et ajustez les filtres (par ex. job="minio").
- Pourcentage capacité cluster utilisé
100 * minio_cluster_capacity_used_bytes / minio_cluster_capacity_total_bytes
- Taux requêtes S3 par méthode (5m)
sum by (method) (rate(minio_s3_requests_total[5m]))
- Ratio erreurs 5xx (5m)
sum(rate(minio_s3_requests_errors_total{code=~"5.."}[5m]))
/ ignoring(code)
sum(rate(minio_s3_requests_total[5m]))
- Latence P95 requêtes (secondes)
histogram_quantile(
0.95,
sum by (le) (rate(minio_s3_request_duration_seconds_bucket[5m]))
)
- Nœuds hors ligne (si disponible)
minio_cluster_nodes_offline_total
- Disques hors ligne (si disponible)
minio_disks_offline_total
- Backlog réplication (exemple ; vérifiez noms dans votre cluster)
sum(rate(minio_bucket_replication_pending_count[5m]))
*Note : Les noms de métriques varient selon la version MinIO ; si minio_bucket_replication_pending_count est absent, essayez minio_bucket_replication_pending_total.
- Expiration certificat (via blackbox exporter scrapant endpoint MinIO)
(probe_ssl_earliest_cert_expiry - time()) / 86400
- Saturation hôte (node exporter)
# Ratio CPU occupé
1 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))
# Temps disque occupé
avg by (instance, device) (rate(node_disk_io_time_seconds_total[5m]))
Règles d'alerte de départ
Commencez avec un ensemble minimal et actionnable. Ajustez les seuils à vos SLO et ligne de base, pas à des valeurs universelles.
# minio.alerts.yml
groups:
- name: minio.alerts
rules:
- alert: MinIOClusterCapacityHigh
expr: (minio_cluster_capacity_used_bytes / minio_cluster_capacity_total_bytes) > 0.85
for: 15m
labels:
severity: warning
annotations:
summary: Capacité MinIO élevée
description: La capacité dépasse la marge cible. Planifiez nettoyage ou expansion.
- alert: MinIOTargetsDown
expr: count(up{job="minio"} == 0) > 0
for: 5m
labels:
severity: critical
annotations:
summary: Une ou plusieurs cibles de scrape MinIO sont down
description: Enquêtez santé nœud/pod et restaurez redondance.
- alert: MinIOHigh5xxErrorRate
expr: (sum(rate(minio_s3_requests_errors_total{code=~"5.."}[5m])) / sum(rate(minio_s3_requests_total[5m]))) > 0.02
for: 10m
labels:
severity: critical
annotations:
summary: Ratio d'erreurs 5xx élevé
description: Erreurs serveur soutenues indiquent impact utilisateur.
- alert: MinIOHighLatencyP95
expr: histogram_quantile(0.95, sum by (le) (rate(minio_s3_request_duration_seconds_bucket[5m]))) > 0.5
for: 10m
labels:
severity: warning
annotations:
summary: Latence p95 S3 élevée
description : Les requêtes peuvent être lentes à cause de contention E/S ou réseau.
- alert: MinIOReplicationLag
expr: sum(rate(minio_bucket_replication_pending_count[5m])) > 0
for: 30m
labels:
severity: warning
annotations:
summary: Le backlog de réplication augmente
description: Vérifiez chemin réseau, identifiants, santé site cible.
- alert: MinIOTLSCertExpiringSoon
expr: (probe_ssl_earliest_cert_expiry - time()) / 86400 < 14
for: 0m
labels:
severity: warning
annotations:
summary: Certificat TLS MinIO expire bientôt
description: Renouvelez et déployez certificats avant expiration.
- alert: HostSaturationCPU
expr: (1 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))) > 0.9
for: 10m
labels:
severity: warning
annotations:
summary: Saturation CPU hôte
description: CPU élevé peut dégrader latence et débit MinIO.
Astuce : Si minio_cluster_nodes_offline_total n'est pas disponible, utilisez la métrique up et les compteurs de cibles connus pour détecter les cibles down.
Ajustement et validation des alertes
Évitez les seuils unique. Ajustez avec le trafic réel :
- Établissez la ligne de base d'abord : capturez latences p50/p95, marge et ratios d'erreurs normaux pendant au moins une semaine. Mettez l'avertissement au bord du normal, le critique au-delà de l'anormal soutenu.
- Choisissez des fenêtres stables : utilisez des taux 5-15 minutes pour métriques requêtes/erreurs et une durée
for:significative pour ignorer les pics brefs. - Ajoutez de l'hystérésis : avertissez à un seuil plus bas et effacez à un niveau légèrement meilleur (par ex. avertir à 80% capacité, effacer à 75%).
- Validez dans Prometheus : lancez chaque expression d'alerte dans l'UI graph et vérifiez qu'elle retourne des séries quand vos tests synthétiques la déclenchent.
- Groupez les alertes : regroupez par cluster ou instance pour réduire les pages dupliquées. Inhibez les symptômes en aval (par ex. supprimez alertes latence si cibles down).
- Révisez mensuellement : comparez alertes aux notes d'incident et ajustez seuils et durées.
Signaux de logs qui détectent les problèmes tôt
MinIO émet des logs JSON structurés. Centralisez-les et surveillez :
level:erroroulevel:panic- Champs
errcontenant erreurs E/S disque ou timeouts réseau - Messages contenant
healing,disk not found,permission denied - Pics de
AccessDenied,SignatureDoesNotMatch,InvalidAccessKeyId
Exemples locaux :
# Suivre erreurs dans logs container
docker logs -f minio | jq -r 'select(.level=="error\)) | .time + " " + .msg'
# Compter types d'erreur par .err
docker logs minio 2>&1 | jq -r 'select(.level=="error\)) | .err' | sort | uniq -c | sort -nr | head
# Trace live d'appels S3 (lents/échoués)
mc alias set local http://localhost:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD
mc admin trace --verbose local
Envisagez d'ajouter une alerte basée sur les logs pour échecs d'écriture disque fréquents ou redémarrages de guérison répétés dans une courte fenêtre.
Disposition pratique de dashboard
Organisez les panneaux par impact utilisateur d'abord, puis causes racines.
- Impact utilisateur
- Requêtes par seconde :
sum(rate(minio_s3_requests_total[5m])) - Ratio 4xx et 5xx sur total requêtes
- Latence p50, p95, p99 utilisant
histogram_quantile - Capacité et croissance
- Pourcentage utilisé :
100 * used_bytes / total_bytes - Croissance 7 jours :
increase(used_bytes[7d]) - Top buckets par taille (si disponible)
- Santé
- Nœuds et disques hors ligne, opérations de guérison en cours
- Fraîcheur scrape et
uppar cible - Performance
- Débit lecture et écriture, concurrence par opération
Runbook d'incident compact
Gardez les runbooks courts et actionnables. Distinguez symptômes (ce que vous voyez) de causes (pourquoi ça arrive).
- Capacité haute
- Symptômes : uploads échouent, PUT lents, guérison fréquente
- Vérifications : % utilisé, croissance 7 jours, top buckets/prefixes
- Causes probables : pics backup/analytics, cycle de vie mal configuré
- Actions : appliquer cycle de vie, nettoyer multipart échoués, ajouter/étendre stockage
- Commandes :
mc admin info local,mc ls --recursive --summarize local/bucket,mc ilm rule ls local/bucket
- Nœuds ou cibles down
- Symptômes : pics 5xx, timeouts
- Vérifications :
up{job="minio"}, statut plateforme/pod, accessibilité nœud - Causes probables : redémarrage hôte, détachement disque, partition réseau
- Actions : restaurer connectivité, redémarrer pods, vérifier et monter disques
- Commandes :
mc admin info local,kubectl get pods -l app=minio -A,systemctl status minio || docker ps
- Ratio d'erreurs 5xx élevé
- Symptômes : erreurs serveur visibles clients
- Vérifications : tendances ratio erreurs et latence, logs timeouts/erreurs internes
- Causes probables : disques/CPU saturés, problèmes réseau, panne partielle
- Actions : réduire charge ou scale out, corriger chemin réseau, retry avec backoff
- Commandes :
mc admin trace --errors local
- Latence p95 élevée
- Symptômes : opérations lentes, retentatives côté client
- Vérifications : histogramme latence par op et nœud, E/S/CPU hôte
- Causes probables : voisins bruyants, surcoût DNS/TLS, disques lents
- Actions : isoler E/S, mettre en cache prefixes chauds, ajuster concurrence et timeouts
- Lag réplication
- Symptômes : objets retardés site cible
- Vérifications : taille/âge backlog, statut workers réplication, chemin réseau
- Causes probables : site cible down, problème identifiants/politique, limites bande passante
- Actions : restaurer cible, corriger accès, débloquer temporairement ou resharder workers
- Certificat proche expiration ou invalide
- Symptômes : échecs handshake TLS
- Vérifications : jours avant expiration, chaîne complète, SANs correspondent hostnames
- Actions : renouveler et déployer certs, recharger MinIO, vérifier avec
openssl s_client
- Saturation hôte
- Symptômes : ralentissement général, timeouts sur toutes ops
- Vérifications : CPU occupé, temps disque occupé, pertes paquets
- Actions : ajouter CPU/IOPS, rééquilibrer trafic, corriger workloads bruyants sur hôtes partagés
Plan de pilote local
Rendez la première étape étroite, mesurable et facile à inspecter localement.
- Démarrer MinIO et stack observabilité
# docker-compose.yml
version: "3.8"
services:
minio:
image: minio/minio:latest
command: server --console-address \"\:9001\" /data
ports:
- "9000:9000"
- "9001:9001"
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin123
volumes:
- ./data:/data
prometheus:
image: prom/prometheus:latest
command: ["--config.file=/etc/prometheus/prometheus.yml\
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
ports:
- "9090:9090"
grafana:
image: grafana/grafana-oss:latest
ports:
- "3000:3000"
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: minio
metrics_path: /minio/v2/metrics/cluster
static_configs:
- targets: ["host.docker.internal:9000\) # utilisez "minio:9000" si même réseau
- Semer données et vérifier métriques
mc alias set local http://localhost:9000 minioadmin minioadmin123
mc mb local/demo
mc cp /etc/hosts local/demo/hosts-copy
curl -s http://localhost:9000/minio/v2/metrics/cluster | head
- Installer les alertes de départ
- Chargez les règles d'alerte ci-dessus. Pour test local, utilisez seuils plus bas (par ex. capacité à 5%, latence p95 à 200 ms, ratio erreur à 1%).
- Induire signaux de test sûrs
# Capacité : uploader fichier 50 MB (répéter si besoin)
base64 /dev/zero | head -c 52428800 > bigfile.bin
mc cp bigfile.bin local/demo/
# Cible down : arrêter container MinIO 2 minutes
docker stop minio && sleep 120 && docker start minio
# Ratio erreur : envoyer auth invalide pour produire 4xx (alerte temporaire sur 4xx)
curl -s -o /dev/null -w "%{http_code}\\n" http://localhost:9000/demo/hosts-copy
- Valider et enregistrer résultats
- Assurez-vous que les alertes se déclenchent avec descriptions actionnables et s'effacent auto après récupération.
- Notez différences de noms métriques et mettez à jour dashboards/alertes.
Critères de sortie :
- Trois alertes cœur testées bout en bout
- Dashboard montre tendances capacité, latence, erreurs
- Runbooks rédigés pour chaque alerte
Liste de vérification post-changement
Exécutez ceci après mises à niveau, changements config ou événements de scaling :
- Santé API : latence p50/p95 et ratio erreur revenus à la ligne de base
- Capacité : % utilisé, marge libre, tendance croissance normale
- Cibles saines :
up{job="minio"} == 1pour toutes ; latence scrape stable - Logs propres : pas nouveaux types erreur ni boucles guérison répétées
- Réplication : backlog stable ou décroissant
- Certificats : jours-avant-expiration au-dessus cible interne, handshake OK
- Hôte : CPU et disque occupé dans fourchette attendue
- Alertes : pas de flapping ; silences retirés après tests
Conclusion
Vous disposez maintenant d'une approche axée production pour la surveillance MinIO : priorisez les signaux disponibilité, capacité, latence et erreurs ; appuyez-les avec des requêtes Prometheus claires, des alertes peu nombreuses et actionnables, et des runbooks concis ; et validez tout avec un pilote local sûr et une liste de vérification post-changement. Continuez d'ajuster les seuils à votre trafic réel et SLO, étendez les dashboards à mesure que vous scalez, et intégrez continuellement les leçons d'incidents dans vos alertes et runbooks.