MinIO 自建 S3 对象存储
引言
大家好,今天想跟你们聊聊我自己是怎么搭建对象存储服务的。之前公司业务需要存储大量的图片、视频和日志文件,最开始用的是云厂商的 S3 服务,成本嘛,你们懂的,随着数据量增长,账单看得我肉疼。后来发现了 MinIO 这个开源方案,简直打开了新世界的大门——完全兼容 S3 协议,性能也不错,关键是免费开源,可以自己部署在本地或者私有云上。今天就把我的使用经验整理一下,分享给有同样需求的朋友。
什么是 MinIO
MinIO 是一个开源的分布式对象存储服务,特点是高性能、支持 S3 兼容协议、部署简单。它的设计理念就是让每个人都能够轻松搭建自己的 "AWS S3",不需要昂贵的硬件,也不需要复杂的运维。
我最喜欢 MinIO 的几个点:
- 完全兼容 S3 协议:现有的 S3 SDK、CLI 工具都可以直接用
- 部署简单:一个二进制文件就能跑,不需要复杂的依赖
- 性能强劲:支持分布式部署,读写速度很可观
- 开源免费:Apache License,想怎么用就怎么用
对于我们这种中小团队来说,用 MinIO 替代商业对象存储服务,能省下一大笔钱。
快速部署 MinIO
单节点部署
最简单的方式就是单节点部署,适合开发测试或者小规模使用。我一般在 Docker 里跑,方便管理:
docker run -d \
--name minio \
-p 9000:9000 \
-p 9001:9001 \
-v /data/minio:/data \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
minio/minio server /data --console-address ":9001"
这里解释一下:9000 端口是 S3 API 接口,9001 端口是管理后台。数据目录我映射到了宿主机的 /data/minio,你改成自己的路径就行。
启动成功后,浏览器访问 http://你的IP:9001,用刚才设置的用户名密码登录,就能看到管理界面了。
Docker Compose 方式
如果想要更规范一点,可以用 Docker Compose 来管理:
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- ./data:/data
command: server /data --console-address ":9001"
restart: unless-stopped
保存为 docker-compose.yml,然后 docker-compose up -d 就完事了。
使用 S3 客户端操作
部署好了之后,怎么往里面存文件呢?这里有几种方式。
1. 管理后台
直接在浏览器访问 9001 端口,登录后可以可视化上传、下载、创建存储桶(Bucket),跟使用网盘差不多,对非技术人员很友好。
2. mc 命令行工具
MinIO 官方提供了一个叫 mc(MinIO Client)的命令行工具,功能很强大,安装也简单:
# Linux/macOS
curl https://dl.min.io/client/mc/release/linux-amd64/mc -o mc
chmod +x mc
sudo mv mc /usr/local/bin/
或者用 Homebrew
brew install minio-stable/mc/mc
配置连接到我们的 MinIO 服务:
mc alias set myminio http://192.168.1.100:9000 minioadmin minioadmin
然后就可以愉快地操作了:
# 创建存储桶
mc mb myminio/my-bucket
上传文件
mc cp /path/to/file.txt myminio/my-bucket/
下载文件
mc cp myminio/my-bucket/file.txt ./
查看文件列表
mc ls myminio/my-bucket
设置存储桶为公开访问
mc anonymous set download myminio/my-bucket
3. AWS CLI
因为 MinIO 兼容 S3 协议,所以 AWS CLI 也能直接用,只需要配置一下:
aws configure
AWS Access Key ID: minioadmin
AWS Secret Access Key: minioadmin
Default region name: us-east-1
Default output format: json
然后修改 S3 endpoint:
aws s3 ls --endpoint-url=http://192.168.1.100:9000
aws s3 cp test.txt s3://my-bucket/ --endpoint-url=http://192.168.1.100:9000
4. 编程语言 SDK
各种语言的 SDK 也都支持,只需要把 endpoint 改成你的 MinIO 地址就行。以 Python 为例:
import boto3
s3 = boto3.client(
's3',
endpoint_url='http://192.168.1.100:9000',
aws_access_key_id='minioadmin',
aws_secret_access_key='minioadmin'
)
上传文件
s3.upload_file('test.txt', 'my-bucket', 'test.txt')
下载文件
s3.download_file('my-bucket', 'test.txt', 'downloaded.txt')
存储桶策略与权限控制
生产环境肯定需要精细的权限控制,MinIO 支持类似 AWS S3 的存储桶策略(Bucket Policy)。
比如我想让某个存储桶可以公开读取,但只能由特定用户写入,可以这样配置:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": ["arn:aws:iam::root:user/uploader"]
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
在管理后台的 "存储桶 → 编辑策略" 里可以可视化配置,或者用 mc policy 命令行操作。
分布式集群部署
如果单节点不够用,MinIO 还支持分布式部署,可以多台机器组成集群,提高可用性和容量。
分布式部署需要至少 4 台服务器(推荐 4、6、8 等偶数台),每个节点上运行 MinIO 实例,数据会自动分布在多个节点上。
minio server http://host1/data http://host2/data http://host3/data http://host4/data
集群模式下,MinIO 会自动进行数据 erasure coding,即使坏掉一半的硬盘,数据依然可以恢复。这个特性非常适合对数据可靠性要求高的场景。
总结
好啦,今天的分享就到这里。MinIO 真的是一个非常棒的工具,部署简单、性能强劲、兼容性好,无论是个人项目还是企业级应用都很合适。
我的使用场景主要是:
- 存储用户上传的图片和视频
- 备份数据库和日志
- 作为静态资源服务器
- 开发测试环境模拟 S3
如果你也在寻找对象存储解决方案,不妨试试 MinIO,相信不会让你失望的。有什么问题欢迎在评论区留言,我们一起讨论!
MinIO 自建 S3 对象存储
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法