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!
BefehlBeschreibung
mc mb myminio/sicherungenBucket erstellen
mc cp datei.tar.gz myminio/sicherungen/Datei hochladen
mc mirror /lokales/verz myminio/sicherungen/verz/Verzeichnis synchronisieren
mc ls myminio/sicherungenObjekte auflisten
mc version enable myminio/sicherungenVersionierung aktivieren
mc ilm add --expiry-days 30 myminio/sicherungenAblaufregel
mc admin info myminioCluster-Status
mc admin prometheus generate myminioPrometheus-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
MetrikBeschreibung
minio_cluster_capacity_usable_free_bytesNutzbarer freier Speicher
minio_cluster_nodes_online_totalOnline-Knoten
minio_cluster_drive_offline_totalOffline-Laufwerke
minio_s3_requests_totalAnfragerate

Importieren Sie das Grafana-Dashboard mit ID 13502.


MinIO vs. Alternativen

MerkmalMinIOCeph RGWSeaweedFSAWS S3
Vollständige S3 APIJaJaTeilweiseJa (kanonisch)
Erasure CodingJaJaJaVerwaltet
InstallationskomplexitätNiedrigSehr hochNiedrigKeine
Kubernetes-nativJaTeilweiseTeilweiseN/A
Object Locking (WORM)JaJaNeinJa
Bucket-BenachrichtigungenJaBegrenztNeinJa (SNS)
IAM / OIDCJaJaNeinJa (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