Introduction
Running MinIO in production requires understanding deployment architectures, configuration options, and operational best practices. This article covers everything from single-server deployments to large-scale distributed clusters with erasure coding, replication, monitoring, and security configurations.
Deployment Architectures
Standalone Deployment
For development and small workloads:
# Single node, single drive
./minio server /data
# Single node, multiple drives (not recommended for production)
./minio server /data1 /data2 /data3 /data4
Distributed Deployment
For production, distribute across multiple nodes:
# 4 nodes, 4 drives each
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=password
./minio server \
http://server1/minio1 \
http://server1/minio2 \
http://server2/minio1 \
http://server2/minio2 \
http://server3/minio1 \
http://server3/minio2 \
http://server4/minio1 \
http://server4/minio2
Docker Compose
version: '3.8'
services:
minio:
image: minio/minio:latest
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- minio-data:/data
command: server /data --console-address ":9001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
volumes:
minio-data:
Kubernetes Deployment
apiVersion: v1
kind: Service
metadata:
name: minio
spec:
selector:
app: minio
ports:
- port: 9000
name: s3
- port: 9001
name: console
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: minio
spec:
serviceName: minio
replicas: 4
selector:
matchLabels:
app: minio
template:
spec:
containers:
- name: minio
image: minio/minio:latest
args:
- server
- http://minio-{0...3}.minio.default.svc.cluster.local/data
env:
- name: MINIO_ROOT_USER
value: "minioadmin"
- name: MINIO_ROOT_PASSWORD
value: "minioadmin"
ports:
- containerPort: 9000
- containerPort: 9001
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Ti
Erasure Coding
MinIO uses erasure coding for data protection:
How It Works
With erasure coding, data is split into data and parity fragments:
# Example: 8 drives
# EC:4 = 4 data + 4 parity
# Can tolerate 4 drive failures
# EC:4 configuration (automatic with 4+ drives)
./minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8
Calculating Capacity
| Setup | Data Drives | Parity | Usable Capacity |
|---|---|---|---|
| 4 drives | 2 | 2 | 50% |
| 8 drives | 4 | 4 | 50% |
| 12 drives | 6 | 6 | 50% |
| 16 drives | 8 | 8 | 50% |
Best Practices
# Use homogeneous drives (same size)
# Minimum 4 drives for production
# Use multiple nodes for fault tolerance
Configuration
Environment Variables
# Basic
export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=password
export MINIO_REGION_NAME=us-east-1
# Storage
export MINIO_CACHE_DRIVES=/mnt/cache1,/mnt/cache2
export MINIO_CACHE_EXCLUDE="*.pdf,*.mp4"
export MINIO_CACHE_QUOTA=80
export MINIO_CACHE_AFTER=3
# Network
export MINIO_ADDRESS=":9000"
export MINIO_CONSOLE_ADDRESS=":9001"
# TLS
export MINIO_CERT_FILE=/path/to/cert.pem
export MINIO_KEY_FILE=/path/to/key.pem
Server Configuration File
version: v1
alias: myminio
url: http://localhost:9000
access_key: minioadmin
secret_key: minioadmin
api:
signature_version: "s4"
chunk_size: 5242880
Replication
Bucket Replication
# Enable bucket replication (site replication)
mc replicate add myminio/source-bucket \
--remote-bucket https://user:pass@dest-minio:9000/dest-bucket
# View replication status
mc replicate status myminio/bucket
Site Replication
For multi-site replication:
# Initialize site replication
mc admin replicate add myminio
# Add site to replication cluster
mc admin replicate add myminio \
--api-signature "2" \
https://user:pass@site2:9000
Security
TLS Configuration
# Generate self-signed certificate
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
# Start MinIO with TLS
./minio server /data \
--cert-file /path/to/cert.pem \
--key-file /path/to/key.pem
Access Management
# Create service account
mc admin user svcacct add myminio/ \
--access-key reader \
--secret-key password123 \
--policy reader-policy.json
# Create IAM policy
cat > reader-policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::mybucket/*"]
}
]
}
EOF
Encryption
# Enable bucket encryption (SSE-S3)
mc encryption set SSE-S3 myminio/mybucket
# Use SSE-KMS
mc encryption set SSE-KMS myminio/mybucket \
--key-id my-key-id \
https://kms-key:9443
# Enable bucket default encryption
mc encryption set SSE-S3 myminio/mybucket
Monitoring
Prometheus Integration
# Enable Prometheus metrics
mc prometheus generate myminio
# Metrics endpoint
curl http://minio:9000/minio/v2/metrics/cluster
Health Checks
# Liveness probe
curl http://localhost:9000/minio/health/live
# Readiness probe
curl http://localhost:9000/minio/health/ready
# Cluster health
mc admin info myminio
Logging
# MinIO console logging
# Access at http://localhost:9001
# Audit logs
mc admin audit myminio
# Set audit targets
mc admin config set myminio audit_webhook \
endpoint=http://audit-server:9000 \
auth_token=token
Alerts
# Monitor disk usage
mc admin info myminio
# Set up Prometheus alerts
- alert: MinIOOffline
expr: up{job="minio"} == 0
for: 5m
- alert: MinIODiskSpaceLow
expr: (minio_disk_storage_available_bytes / minio_disk_storage_total_bytes) < 0.1
Backup and Recovery
Backup Strategies
# Use mc to backup
mc mirror myminio/bucket /backup/bucket
# Incremental backup with rsync
rsync -avz --delete /data/ backup/
# Use cloud-native tools
aws s3 sync s3://minio-bucket s3://s3-backup-bucket
Disaster Recovery
# Restore from backup
mc mirror /backup/bucket myminio/bucket
# Point-in-time recovery requires replication setup
# Set up site replication for automatic DR
Performance Tuning
# Increase concurrency
mc admin config set myminio \
set rootDrive concurrency=16
# Set cache
mc admin config set myminio \
cache drive=/mnt/cache \
quota=80 \
exclude="*.pdf,*.mp4"
# Optimize network
mc admin config set myminio \
nodes pool size=8
Upgrading MinIO
# Stop MinIO
systemctl stop minio
# Backup config
cp -r /etc/minio /etc/minio.bak
# Install new version
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
# Start MinIO
systemctl start minio
# Verify
mc admin info myminio
Conclusion
Production MinIO deployments require careful planning: distributed clusters with erasure coding for resilience, proper monitoring and alerting, TLS for security, and replication for disaster recovery. Following these operational best practices ensures reliable, performant object storage for your applications.
In the next article, we’ll explore MinIO’s internal architecture to understand how it achieves high performance.
Comments