MinIO是一款高性能、开源的对象存储解决方案,提供了与Amazon Web Services S3兼容的API,支持所有核心S3功能。它设计为可以部署在任何地方 - 公共云、私有云、裸机基础设施、编排环境和边缘基础设施。
对象存储是一种数据存储架构,专为处理大量非结构化数据而设计。与传统的文件存储和块存储不同,对象存储将数据视为独立的对象,每个对象包含数据、元数据和唯一标识符,使其特别适合云环境和大规模数据存储需求。
MinIO支持多种部署拓扑,可以根据需求灵活选择。以下是三种主要部署模式的对比:
适用场景:
特点:
局限性:
适用场景:
特点:
局限性:
适用场景:
特点:
局限性:
部署选择建议:根据您的数据规模、性能需求、可⽤资源和预期增⻓来选择合适的部署⽅案。对于⽣产环境,MinIO强烈推荐使⽤多节点多驱动(MNMD)部署以确保⾼可⽤性和数据持久性。
这是最简单的MinIO部署方式,适合初始开发和评估MinIO对象存储及其S3兼容API层。
使用RPM安装(RHEL/CentOS):
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20241107005220.0.0-1.x86_64.rpm -O minio.rpm
sudo dnf install minio.rpm
使用DEB安装(Debian/Ubuntu):
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20241107005220.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb
使用二进制安装:
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
# 创建存储目录
mkdir ~/minio
# 启动MinIO服务器
minio server ~/minio --console-address :9001
服务器会输出类似以下内容:
API: http://192.0.2.10:9000 http://127.0.0.1:9000
RootUser: minioadmin
RootPass: minioadmin
Console: http://192.0.2.10:9001 http://127.0.0.1:9001
RootUser: minioadmin
RootPass: minioadmin
这是推荐用于生产环境的部署方式,提供企业级性能、可用性和可扩展性。
按照单节点部署中的步骤在每个节点上安装MinIO。
在每个节点上创建/usr/lib/systemd/system/minio.service
文件:
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
创建MinIO用户和组:
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/disk1 /mnt/disk2 /mnt/disk3 /mnt/disk4
在每个节点上创建/etc/default/minio
文件:
# 设置MinIO启动时使用的主机和卷
MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio"
# 设置MinIO服务器选项
MINIO_OPTS="--console-address :9001"
# 设置根用户名
MINIO_ROOT_USER=minioadmin
# 设置根密码
MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME
将TLS证书放置在/home/minio-user/.minio/certs
目录中。
如果使用自签名或内部CA签名的证书,将CA证书放在/home/minio-user/.minio/certs/CAs
目录中。
在每个节点上运行以下命令:
sudo systemctl start minio.service
sudo systemctl enable minio.service
检查服务状态:
sudo systemctl status minio.service
journalctl -f -u minio.service
通过浏览器访问https://minio1.example.com:9001
打开MinIO控制台,使用MINIO_ROOT_USER和MINIO_ROOT_PASSWORD登录。
对于开发环境或快速测试,Docker是一个方便的选择:
# 拉取MinIO镜像
docker pull minio/minio
# 单节点部署
docker run -p 9000:9000 -p 9001:9001 \
--name minio \
-v ~/minio/data:/data \
-e "MINIO_ROOT_USER=minioadmin" \
-e "MINIO_ROOT_PASSWORD=minioadmin" \
minio/minio server /data --console-address ":9001"
存储桶是MinIO中存储对象的逻辑容器,类似于文件系统中的文件夹。存储桶名称在整个系统中必须唯一。
对象是存储在MinIO中的基本实体,包括数据、元数据和唯一标识符。对象可以是任何类型的文件,如文档、图像、备份等。
服务器池是一组MinIO服务器节点,它们汇集各自的驱动器和资源来支持对象存储。在分布式部署中,可以有多个服务器池。
纠删集是支持MinIO纠删码的一组多个驱动器。MinIO将对象分成称为分片的块,并将它们均匀分布在纠删集的每个驱动器上。
MinIO Client是一个命令行工具,用于与MinIO服务器交互:
# 安装MinIO Client
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
# 创建别名
mc alias set myminio http://127.0.0.1:9000 minioadmin minioadmin
# 列出所有存储桶
mc ls myminio
# 创建新存储桶
mc mb myminio/mybucket
# 上传文件到存储桶
mc cp myfile.txt myminio/mybucket/
# 下载文件
mc cp myminio/mybucket/myfile.txt myfile-download.txt
# 列出存储桶中的对象
mc ls myminio/mybucket/
# 删除对象
mc rm myminio/mybucket/myfile.txt
# 删除存储桶
mc rb myminio/mybucket
MinIO Console是一个直观的Web界面,用于管理和监控MinIO部署:
http://127.0.0.1:9001
MinIO完全兼容S3 API,因此可以使用任何S3兼容的SDK与MinIO交互。以下是使用AWS SDK for Python (Boto3)的示例:
import boto3
from botocore.client import Config
# 初始化S3客户端
s3 = boto3.client(
's3',
endpoint_url='http://127.0.0.1:9000',
aws_access_key_id='minioadmin',
aws_secret_access_key='minioadmin',
config=Config(signature_version='s3v4'),
region_name='us-east-1'
)
# 创建存储桶
s3.create_bucket(Bucket='mybucket')
# 上传文件
with open('myfile.txt', 'rb') as data:
s3.upload_fileobj(data, 'mybucket', 'myfile.txt')
# 下载文件
s3.download_file('mybucket', 'myfile.txt', 'myfile-download.txt')
# 列出存储桶中的对象
response = s3.list_objects_v2(Bucket='mybucket')
for obj in response.get('Contents', []):
print(obj['Key'])
# 删除对象
s3.delete_object(Bucket='mybucket', Key='myfile.txt')
# 删除存储桶
s3.delete_bucket(Bucket='mybucket')
MinIO支持对象锁定功能,可以防止对象被删除或覆盖:
# 启用存储桶的对象锁定功能
mc mb --with-lock myminio/locked-bucket
# 设置对象保留期限
mc retention set --default governance 1d myminio/locked-bucket
多站点复制(Site Replication)将多个MinIO部署链接在一起,并保持存储桶、对象和IAM设置在所有连接的站点之间同步:
# 添加复制配置
mc admin replicate add myminio site1 site2 site3
# 检查复制状态
mc admin replicate status myminio
可以配置对象生命周期规则,自动删除过期的对象:
# 创建生命周期配置
cat > lifecycle.json << EOF
{
"Rules": [
{
"Status": "Enabled",
"Expiration": { "Days": 30 },
"ID": "ExpireOldObjects",
"Filter": { "Prefix": "logs/" }
}
]
}
EOF
# 应用生命周期配置
mc ilm import myminio/mybucket < lifecycle.json
MinIO使用Prometheus数据模型发布实时指标,可以与多种监控工具集成。
# 创建Prometheus配置
cat > prometheus.yml << EOF
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'minio'
metrics_path: /minio/v2/metrics/cluster
scheme: http
static_configs:
- targets: ['minio:9000']
basic_auth:
username: minioadmin
password: minioadmin
EOF
# 启动Prometheus
docker run -d --name prometheus \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
MinIO也可以与InfluxDB集成,用于监控和告警。配置Telegraf从MinIO抓取指标并发送到InfluxDB。
MinIO可以将服务器日志和审计日志发布到HTTP webhook。
服务器日志包含与系统控制台相同的MinIO服务器操作,用于一般监控和故障排除。
# 配置服务器日志
mc admin config set myminio logger_webhook:server endpoint=http://logger-server:8080
审计日志是对MinIO部署上每个操作的更详细描述,支持需要详细操作跟踪的安全标准和法规。
# 配置审计日志
mc admin config set myminio audit_webhook:audit endpoint=http://audit-server:8080
# 创建完整备份
mc mirror myminio/mybucket backup/mybucket
# 恢复备份
mc mirror backup/mybucket myminio/mybucket
配置桶复制可以自动将对象从一个存储桶复制到另一个存储桶,甚至跨不同的MinIO部署:
# 设置桶复制
mc replicate add myminio/source-bucket dest/dest-bucket
分布式MinIO部署支持通过添加新的服务器池来扩展存储容量:
# 将新的服务器池添加到现有部署
minio server https://minio{1...4}.example.net/mnt/disk{1...4} \
https://minio{5...8}.example.net/mnt/disk{1...4}
在扩展后,可以手动启动重新平衡操作,将数据在所有服务器池之间平衡分配:
# 启动重新平衡操作
mc admin rebalance start myminio
对于具有多个服务器池的部署,可以停用旧池并将数据迁移到部署中的新池:
# 停用服务器池
mc admin decommission start myminio https://minio{5...8}.example.net/mnt/disk{1...4}
# 下载新版本
wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /usr/local/bin/minio.new
chmod +x /usr/local/bin/minio.new
# 备份原有二进制文件
mv /usr/local/bin/minio /usr/local/bin/minio.old
# 更新二进制文件
mv /usr/local/bin/minio.new /usr/local/bin/minio
# 重启服务
systemctl restart minio
在分布式部署中,可以通过逐个升级节点来实现零停机升级:
MinIO提供了健康检查API端点,用于监控节点正常运行时间和集群高可用性:
/minio/health/live
: 检查服务器是否正在运行/minio/health/ready
: 检查服务器是否准备好处理请求/minio/health/cluster
: 检查整个集群的健康状态# 检查MinIO服务器健康状态
curl -s http://127.0.0.1:9000/minio/health/live
# 检查集群健康状态
curl -s http://127.0.0.1:9000/minio/health/cluster
MinIO是一款功能强大的对象存储解决方案,提供了与Amazon S3兼容的API,可以部署在任何环境中。它的高性能、可扩展性和企业级特性使其成为现代数据基础设施的理想选择。
根据您的需求和资源,可以选择单节点单驱动器、单节点多驱动器或多节点多驱动器部署模式。生产环境应优先考虑多节点多驱动器(分布式)部署,以获得最佳的性能、可用性和可靠性。
通过本指南,您应该已经掌握了MinIO的基本概念、部署方法、使用技巧和运维策略。随着数据量的增长和应用需求的变化,可以利用MinIO的扩展和管理功能来适应这些变化。
无论是AI/ML数据湖、备份归档、内容分发还是云原生应用,MinIO都能为您提供可靠、高性能的对象存储基础设施。