去年因为工作的原因接触使用了MinIO,这里特此记录一下,分享MinIO的使用过程与体会;
写在前面 - 49年入国军
MinIO已经将协议修改为AGPLv3,并且阉割了WebUI控制台功能;截止2025年12月,MinIO进入不再维护的状态,正式标记了该开源产品的日落;如果不考虑社区后续支持,或是测试验证需求,MinIO仍然是不错的选择;当前开发者在积极探索MinIO的替代品,对于该项目感兴趣的同学,可以关注如下产品:
| 替代品 | 开源协议 | S3 兼容性 | 特点 | 适合场景 | 缺点 |
|---|---|---|---|---|---|
| SeaweedFS | Apache 2.0 | ✔️(通过 S3 Gateway) | 高性能、专为海量小文件优化、O(1) 寻址、轻量 | 图片/日志/边缘存储、中小规模对象存储 | 需要独立元数据服务(如 etcd)、S3 功能较基础 |
| Ceph (RGW) | LGPL | ✔️(RADOS Gateway 提供 S3 API) | 企业级分布式存储、支持块/文件/对象三合一 | 大型企业、云平台、已有 Ceph 基础设施 | 架构复杂、运维成本高、学习曲线陡峭 |
| RustFS | MIT/Apache | ✔️(目标是 MinIO 替代) | 专为替代 MinIO 设计、Rust 编写、API 高度兼容 | 技术尝鲜者、愿意参与早期生态 | 仍处于 Alpha 阶段,生产环境风险高 |
| MinIO 社区 Fork(如 openminio) | GPL / 社区自定 | ✔️(延续原版) | 保留 MinIO UI 和功能 | 暂时过渡、希望延续 MinIO 体验 | 长期维护性和安全性不确定 |
接下来让我们进入正片:)
MinIO是什么
MinIO是一个高性能、开源的对象存储系统,专为云原生环境(如 Kubernetes、Docker)设计,100% 兼容 Amazon S3 API。它用 Go 语言编写,以单个二进制文件形式发布,无外部依赖,既可以作为轻量级单机服务运行,也能构建跨数据中心的分布式集群。
对于从未接触过S3的同学,可能有必要解释下S3是什么;S3即Amazon Simple Storage Service(Amazon S3),是亚马逊AWS(Amazon Web Services)提供的一种对象存储服务。它是云计算领域最基础、最广泛使用的存储服务之一。
S3是一个可通过互联网访问的、无限容量、高可靠、安全且按需付费的“云端硬盘”,但它不是传统意义上的硬盘,而是以“对象”为单位存储数据。当前各大云厂商都有对标的同类项的产品服务面向客户(如GCP的GCS,华为云的OBS,阿里云的OSS)。
| 特性 | S3(对象存储) | 文件存储(如 NAS) | 块存储(如 EBS) |
|---|---|---|---|
| 结构 | 扁平(Key 唯一标识) | 树状目录 | 无结构(需格式化) |
| 访问方式 | HTTP/REST API | NFS/SMB | SCSI(挂载为磁盘) |
| 扩展性 | 无限自动扩展 | 有限 | 需手动扩容 |
| 适用负载 | 海量静态数据 | 共享文件协作 | 数据库、操作系统盘 |
选择MinIO
在当时,我正面临一个项目上的问题:我需要一个大文件的存储系统——传统的数据库主要提供快速、稳定的查询与写入能力,同时需要提供事务一致性;但并不适用于大文件的读写。在这一场景下,S3类服务比较符合业务的诉求。但此时正处于业务的初期,团队并不想将业务与云服务进行集成,因此我选择MinIO作为业务的文件存储系统。
快速启动MinIO
使用 Docker 快速启动:
docker run -p 9000:9000 -p 9001:9001 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=12345678" \
-v /data:/data \
minio/minio server /data --console-address ":9001"
9000:S3 API 端口9001:Web 控制台端口
访问http://localhost:9001即可管理Bucket(桶)和文件。通过MINIO_ROOT_USER和MINIO_ROOT_PASSWORD登录。
通过控制台可以管理桶和对象;同时提供丰富的访问、身份、监控等管理能力。
桶(Bucket) :类似文件夹,用于组织对象,名称全局唯一。
对象(Object) :存储的基本单元,包含数据 + 元数据 + 唯一标识(Key)。
快速基于MinIO开发
MinIO提供了多种语言的SDK供开发者使用:
| 语言 | 安装/获取方式 |
|---|---|
| Go | go get github.com/minio/minio-go/v7 |
| Python | pip3 install minio |
| Java | Maven / Gradle / JAR |
| .NET | Install-Package Minio |
| JavaScript | npm install --save minio |
| Haskell | 通过 .cabal 或 hpack |
| C++ | vcpkg install minio-cpp |
| Rust | cargo add minio |
当然,也可以通过MinIO提供的S3兼容API来进行访问。
什么情况下选择MinIO
最后分享下对于什么情况下应该选择使用MinIO的个人理解:
- 不希望在自己的系统中集成云服务:可能由于敏感数据合规要求的原因,数据无法上云;或是对云服务的使用无相关经验;或是对上云成本相对敏感。那么在本地部署MinIO是一个不错的选择。
- 小型项目或处于初期的项目:MinIO可以单机(容器)部署,同时对未来也有较好的扩展性;由于采用了S3兼容的API,也方便后续系统转向接入云上的S3类产品。
- 对依赖对象存储的服务进行验证,或本身就希望学习或测试S3类产品:同样由于其对S3的兼容性,MinIO可以很好的满足这一点。
补充对MinIO特性的总结:
- 高性能:MinIO 被官方称为“世界上最快的对象存储”。它利用并行化和分布式架构,能够充分利用多核处理器和高速网络(如100Gbe),实现极高的数据读写吞吐量(例如,在特定硬件上读取速度可达325GB/秒)7。
- S3 兼容:完全兼容 Amazon S3 API 协议。这意味着任何为 AWS S3 开发的应用程序、工具或 SDK 都可以无缝地与 MinIO 对接,无需修改代码,极大地降低了迁移和集成成本13。
- 云原生与轻量:天然为容器化环境(如 Docker、Kubernetes)设计,支持自动化编排和运维。其本身轻量级的特性使其可以轻松部署在边缘计算节点上2。
- 高可用与可扩展:采用去中心化的分布式架构。通过将数据分片并分布在多个节点上,MinIO 可以实现线性的水平扩展,并自动处理节点故障,确保数据的高可靠性和服务的持续可用48。
- 安全性:提供包括客户端加密、服务器端加密(SSE-KMS)在内的多种安全机制,并支持与第三方密钥管理系统集成2。
- AI 基础设施集成:在 AI 领域,MinIO 已成为关键的数据基础设施。例如,截至2025年,它已被集成到英特尔® Tiber™ AI Cloud 中,并与 H2O.ai、Apache Spark、TensorFlow 等主流机器学习框架深度集成,为 AI 应用的开发和训练提供可扩展的数据存储支持12。