TL;DR — Kurzzusammenfassung

Vollständiger MinIO-Leitfaden: Architektur, verteilter Modus, Erasure Coding, IAM, Verschlüsselung, Benachrichtigungen und Docker Compose Produktionsdeployment.

MinIO ist ein hochperformantes, Kubernetes-natives Objektspeichersystem, das die vollständige AWS S3 API implementiert. Dieser Leitfaden behandelt die verteilte Architektur mit Erasure Coding, integriertes IAM, serverseitige Verschlüsselung, Bucket-Benachrichtigungen, Site-Replikation und einen produktionsbereiten Docker Compose Stack mit nginx. Jedes S3-kompatible Tool — boto3, rclone, Terraform, aws CLI — funktioniert mit MinIO, indem nur die Endpoint-URL geändert wird.

Voraussetzungen

  • Linux-Server (Ubuntu 22.04+ oder RHEL 9+) oder Docker 24+.
  • Mindestens 8 GB RAM und dedizierte Laufwerke (nicht das OS-Laufwerk) in der Produktion.
  • Ports 9000 (API) und 9001 (Konsole) erreichbar.
  • Für den verteilten Modus: identische Hardware auf allen Knoten, DNS zur Auflösung jedes Knotennamens und synchronisierte Uhren (NTP).

Architektur: Erasure Coding und Bitrot-Schutz

MinIO speichert Objekte mithilfe von Erasure Coding (Reed-Solomon). Beim Schreiben eines Objekts wird es in N Datenfragmente und M Paritätsfragmente aufgeteilt — zusammen als Erasure Set bezeichnet. Ein 16-Laufwerk-Erasure-Set mit EC:8 liefert 8 Daten + 8 Parität: MinIO kann den gleichzeitigen Verlust von 8 Laufwerken ohne Datenverlust überstehen.

  • Erasure Set — Redundanzeinheit, typischerweise 4–16 Laufwerke.
  • Server-Pool — Gruppe von Knoten, die einen einzigen Namespace bilden. Pools können online hinzugefügt werden, um die Kapazität zu erweitern.
  • Bitrot-Schutz — jedes Fragment hat eine Prüfsumme (HighwayHash); korrupte Fragmente werden automatisch aus der Parität repariert.
  • Inline-Datenverschlüsselung — Objekte werden auf Fragment-Ebene verschlüsselt, bevor sie auf den Datenträger geschrieben werden.

Installationsmethoden

Methode 1: Binary + systemd

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio && sudo mv minio /usr/local/bin/
sudo useradd -r minio-user -s /sbin/nologin
sudo mkdir -p /data/minio
sudo chown minio-user:minio-user /data/minio

Datei /etc/default/minio:

MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=StarkesPasswort123!
MINIO_VOLUMES="/data/minio"
MINIO_OPTS="--console-address :9001"
sudo systemctl daemon-reload && sudo systemctl enable --now minio

Methode 2: Docker

docker run -d --name minio \
  -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=minioadmin \
  -e MINIO_ROOT_PASSWORD=StarkesPasswort123! \
  -v /data/minio:/data \
  quay.io/minio/minio server /data --console-address ":9001"

Verteilter Modus: Multi-Node Multi-Drive

export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=StarkesPasswort123!

minio server \
  http://minio-knoten{1...4}/data/{1...4} \
  --console-address ":9001"

Führen Sie denselben Befehl auf allen Knoten gleichzeitig aus. Die Klammerexpansion {1...4} generiert automatisch die Knoten-/Laufwerksnamen.


mc CLI: Befehlsreferenz

mc alias set myminio https://minio.beispiel.com minioadmin StarkesPasswort123!
Befehl Beschreibung
mc mb myminio/sicherungen Bucket erstellen
mc cp datei.tar.gz myminio/sicherungen/ Datei hochladen
mc mirror /lokales/verz myminio/sicherungen/verz/ Verzeichnis synchronisieren
mc ls myminio/sicherungen Objekte auflisten
mc version enable myminio/sicherungen Versionierung aktivieren
mc ilm add --expiry-days 30 myminio/sicherungen Ablaufregel
mc admin info myminio Cluster-Status
mc admin prometheus generate myminio Prometheus-Konfiguration

Bucket-Verwaltung: Versionierung, Lifecycle und Object Locking

# Versionierung aktivieren
mc version enable myminio/mein-bucket

# Nicht aktuelle Versionen nach 30 Tagen ablaufen lassen
mc ilm add --noncurrentversion-expiration-days 30 myminio/mein-bucket

# WORM-Sperrung (kann nach Aktivierung nicht deaktiviert werden)
mc mb --with-lock myminio/compliance-bucket
mc retention set --default COMPLIANCE "7y" myminio/compliance-bucket

Identitäts- und Zugriffsverwaltung (IAM)

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:GetObject", "s3:ListBucket"],
    "Resource": ["arn:aws:s3:::sicherungen", "arn:aws:s3:::sicherungen/*"]
  }]
}
mc admin policy create myminio nur-lesen richtlinie.json
mc admin user add myminio appuser geheimschluessel123
mc admin policy attach myminio nur-lesen --user appuser
mc admin user svcacct add myminio appuser

LDAP-Integration:

export MINIO_IDENTITY_LDAP_SERVER_ADDR="ldap.corp.beispiel.com:389"
export MINIO_IDENTITY_LDAP_USER_DN_SEARCH_FILTER="(uid=%s)"

Serverseitige Verschlüsselung

# SSE-S3: interner Schlüssel
export MINIO_KMS_SECRET_KEY="mein-minio-schluessel:bXltaW5pb2tleXBhc3N3b3JkMTIzNDU2Nzg="
mc encrypt set sse-s3 myminio/mein-bucket

# SSE-KMS mit HashiCorp Vault (über KES)
export MINIO_KMS_KES_ENDPOINT="https://kes.beispiel.com:7373"
export MINIO_KMS_KES_KEY_NAME="minio-hauptschluessel"
mc encrypt set sse-kms minio-hauptschluessel myminio/sensitiver-bucket

Bucket-Benachrichtigungen

# Webhook-Ziel konfigurieren
mc admin config set myminio notify_webhook:1 \
  endpoint="https://hooks.beispiel.com/minio" \
  auth_token="Bearer meintoken"
mc admin service restart myminio
mc event add myminio/mein-bucket arn:minio:sqs::1:webhook --event put,delete

# Kafka-Ziel
mc admin config set myminio notify_kafka:1 \
  brokers="kafka1.beispiel.com:9092" topic="minio-ereignisse"

Site-Replikation und Bucket-Replikation

# Aktiv-Aktiv-Replikation zwischen zwei Clustern
mc admin replicate add site-a site-b

# Bucket-Replikation für Disaster Recovery
mc version enable site-a/wichtiger-bucket
mc replicate add site-a/wichtiger-bucket \
  --remote-bucket https://adminB:passB@minio-b.beispiel.com/bucket-replik \
  --replicate "delete,delete-marker,existing-objects"

Monitoring mit Prometheus und Grafana

mc admin prometheus generate myminio > /etc/prometheus/minio.yml
Metrik Beschreibung
minio_cluster_capacity_usable_free_bytes Nutzbarer freier Speicher
minio_cluster_nodes_online_total Online-Knoten
minio_cluster_drive_offline_total Offline-Laufwerke
minio_s3_requests_total Anfragerate

Importieren Sie das Grafana-Dashboard mit ID 13502.


MinIO vs. Alternativen

Merkmal MinIO Ceph RGW SeaweedFS AWS S3
Vollständige S3 API Ja Ja Teilweise Ja (kanonisch)
Erasure Coding Ja Ja Ja Verwaltet
Installationskomplexität Niedrig Sehr hoch Niedrig Keine
Kubernetes-nativ Ja Teilweise Teilweise N/A
Object Locking (WORM) Ja Ja Nein Ja
Bucket-Benachrichtigungen Ja Begrenzt Nein Ja (SNS)
IAM / OIDC Ja Ja Nein Ja (volles IAM)

Produktions-Docker-Compose mit nginx

services:
  minio:
    image: quay.io/minio/minio:latest
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: "${MINIO_ROOT_USER}"
      MINIO_ROOT_PASSWORD: "${MINIO_ROOT_PASSWORD}"
      MINIO_KMS_SECRET_KEY: "${MINIO_KMS_SECRET_KEY}"
    volumes:
      - minio_data:/data
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 30s
    networks:
      - minio_net

  nginx:
    image: nginx:alpine
    ports:
      - "443:443"
      - "9001:9001"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/nginx/certs:ro
    depends_on:
      minio:
        condition: service_healthy
    networks:
      - minio_net

volumes:
  minio_data:
networks:
  minio_net:

Zusammenfassung

  • MinIO bietet einen vollständigen S3-kompatiblen Objektspeicher-Stack selbst gehostet — Erasure Coding, IAM, SSE, Benachrichtigungen und Replikation.
  • Einzelknoten für Entwicklung; verteilter Modus mit Server-Pools für die Produktion.
  • SSE-KMS + KES für regulierte Workloads, die externe Schlüsselverwaltung erfordern.
  • Object Locking (WORM) im COMPLIANCE-Modus erfüllt SEC 17a-4, FINRA und ähnliche Vorschriften.
  • Monitoring mit Prometheus + Grafana-Dashboard 13502.

Verwandte Artikel