MinIO:完美的对象存储
引言
最近做了网盘相关项目,了解一下一般情况下常用的一些文件存储方法:用IO库进行的本地磁盘存储,需要付费但是方便安全的OSS云存储(阿里云等),以及今天的主角的-MinIO对象存储系统
可以说,MinIO就是可以存储文件的“数据库”
在本质上,OSS云存储也只不过是在企业云服务器上部署的MinIO或本地存储方式,MinIO同样也是经过包装过的直接访问本地磁盘的存储方式
概述和特点
MinIO的独特之处,在于其完全云原生,高性能,轻量级且完全开源的设计哲学,内部完全由Go语言实现,它重新定义了企业级对象存储的构建和运行方式
再简单点说,MinIO的独特之处在于,它将对象存储的门槛降到了最低(轻量 & 开源),同时将性能拉到了最高,专为云原生和容器化环境而生
如同之前所说,MinIO是一种完美的对象存储系统,那么MinIO和其他存储方式有什么区别呢?
这里我们就要聚焦到MinIO的设计理念和S3标准的云原生
独特的对象和K-V化存储(Object & Bucket)
MinIO的对象化存储,存的不只是文件的数据,还有文件的标识符Key和文件的元数据Value
K-V
在minIO的存储设计里,所有需要存储的文件本质上都是一个对象(Object)
我们都知道,无论是最简单的文本文件TXT,还是动辄几GB的视频文件或文件流,本质上都是由字节流(byte[])构成的,而MinIO存储的正是这种字节流(byte[]),因此MinIO基本能够存储所有文件类型
更重要的是,MinIO将每个对象都通过一个唯一的“键”寻址,并与元数据绑定,这也是S3的协议标准
存储桶(Bucket)
在MinIO中,这个K-v设计中的这个Key可以是MyApp/Project1/storage/1.txt,但本质上这个Key是一个标识符,而非真实的目录层级
因此,与传统的树状文件系统不同的是,MinIO独特的KV式设计,让他的对象存储变成了一个巨大的**“存储池”**,而非依赖于路径下层层进深的树状结构。
所有对象都放在一个巨大的桶(Bucket)里,通过唯一的键Key直接定位
这种设计让存储的拓展性变得无比简单,让人无须担心目录树的深度或复杂度
S3
在说云原生之前,我们需要先了解一下S3这一概念
S3 是 Amazon Simple Storage Service 的简称,是亚马逊AWS云提供的一项核心对象存储服务,核心结构也为B-O(Bucket-Object)式存储服务,具有高耐久性和可用性,使用标准的RESTful API进行上传,下载和管理操作
由于S3出色的设计,可靠的稳定性,S3的API接口已经成为对象存储领域的行业标准协议。无数应用程序,工具或开源项目都原生支持S3协议
云原生
云原生意味着MinIO不仅采用了云原生架构原则,也可以运行在云服务器上
MinIO本身可以看作一个提供S3 API的微服务,用户可以通过K8S,用yaml文档声明式地定义和部署一个MinIO集群以实现自动化运维,且可以根据自身情况,动态规划MinIO中的Pod实例数量来契合个人的项目数据
也正是因为MinIO的S3支持和他强大的工具生态,MinIO才得以成为对象存储的杀手锏
MinIO的使用
我们可以在自己的项目里运用MinIO存储
快速开始
1. 拉取并运行Docker镜像
1 | # 拉取最新的MinIO镜像 |
2. MinIO管理控制台
运行后,可以通过访问http://localhost:9001,使用上述账号密码登录MinIO管理控制台
3. 安装客户端库
1 | go get github.com/minio/minio-go/v7 |
4. 初始化客户端库
1 | package main |
API实例
初始化客户端
1 | ctx := context.Background() |
创建存储桶
1 | // 创建一个存储桶(如果不存在) |
上传文件
1 | // 3. 上传一个文件 |
生成URL
1 | // 4. 生成一个用于临时访问文件的预签名URL(有效期7天) |
注意事项
- 启用HTTPS以加密数据传输
- 可以在控制台通过
Access Key为不同程序创建具有特定策略(policy)的子账户,避免直接使用ROOT账户密钥 - 数据持久化:使用Docker或K8S不是时,务必通过卷(Volume)或持久化卷声明(PVC)将
/data目录挂载到宿主机或网络存储,避免重启容器造成数据丢失 - 桶命名(bucket_name)限制: 3-63字符,只允许 小写字母,数字,点号
.,连字符-,不能包含相邻的句点..或与连字符相邻的句点.-/-. - 对象命名(object_name): 建议使用 ASCⅡ可打印字符,在Windows环境使用时,不允许包含对操作系统有歧义的字符 “./“
项目实例
1 | package minIO |