一、前言¶
背景:数字化时代,数据的快速增长给企业和组织带来了巨大挑战;
解决方案: MinIO 作为一个轻量级的、分布式的开源对象存储服务被部分开发者及企业所认可。
二、为什么需要对象存储?¶
2.1 传统方式如何解决资源存储及访问呢?¶
传统开发中,我们可以使用 tomcat 类似的服务器进行映射目录实现资源访问(在 server.xml 文件中 进行配置)。例如:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 增加的静态资源映射配置 -->
<Context path="/static"
docBase="/usr/local/app/html/"
reloadable="true"
crossContext="true">
</Context>
</Host>
也可以使用 nginx 对静态资源进行代理。例如:
server {
listen 80;
server_name www.kubernets.cn;
# charset koi8-r;
# access_log logs/host.access.log main;
location / {
root html; # 代理 html 目录
index index.html index.htm;
}
}
三、MinIO简介¶
MinIO 是一种高性能、S3 兼容的对象存储。
它专为大规模 AI/ML、数据湖和数据库工作负载而构建,并且它是由软件定义的存储。
简单:无论是在技术上还是在操作上。MinIO使用和部署非常简单,没有其他对象存储可以让您在最快的 时间内实现下载到生产环境的部署。
高性能:MinIO 是世界上最快的对象存储,没有之一。在 32 个 NVMe 驱动器节点和 100Gbe 网络上发 布的 GET/PUT 结果超过 325 GiB/秒和 165 GiB/秒。
Kubernetes原生支持:通过原生 Kubernetes 运营商集成,MinIO 支持公共云、私有云和边缘云上所有主要的 Kubernetes 发行版。
相关数据地址:
社区地址 - https://slack.min.io
文档地址(文档推荐)- https://docs.min.io
中文文档 - http://docs.minio.org.cn/docs/
博客地址 - https://blog.min.io
官网地址 - https://min.io
四、MinIO架构¶
4.1 去中心化架构¶
1)Minio采用去中心化的无共享架构,对象数据被打散存放在不同节点的多块硬盘,对外提供统一命名 空间访问,并通过负载均衡或者DNS轮询在各个服务器之间实现负载均衡。
2)所有节点都同时承担了多种角色,集元数据存储、数据存储、应用访问等功能于一体,真正实现了去中心化和所有节点的完全对等。

4.2 统一的命名空间¶
Minio有两种集群部署方式:一种是常见的本地分布式集群部署,一种是联盟模式部署。
本地分布式集群:在本地多个服务器节点部署Minio服务,并将其组成单套分布式存储集群,并提供统一命名空间和标准S3接口以进行统一访问。
联盟:将多个本地Minio集群在逻辑上组成了统一命名空间,实现近乎无线的扩展与海量的数据规模管理,这些集群都可以在本地或者分布在不同地域的数据中心。

4.3 分布式锁管理¶
Minio专门设计并实现了 dsync 分布式锁管理器,来控制数据一致性。
- 任何一个节点的锁请求都会广播给集群内的所有在线节点;
- 如果收到N/2+1个节点的同意,则获取所成功;
- 客户端获得锁以后可保留任意时间,不需要时自己释放即可。释放操作也会广播给所有的节点,从而恢复锁的可用状态。
| EC2 Instance Type | Nodes | Locks/server/sec | Total Locks/sec | CPU Usage |
|---|---|---|---|---|
| c3.8xlarge(32 vCPU) | 8 | (min=2601, max=2898) | 21996 | 10% |
| c3.8xlarge(32 vCPU) | 8 | (min=4756, max=5227) | 39932 | 20% |
| c3.8xlarge(32 vCPU) | 8 | (min=7979, max=8517) | 65984 | 40% |
| c3.8xlarge(32 vCPU) | 8 | (min=9267, max=9469) | 74944 | 50% |
4.4 数据结构¶
Minio对象存储系统把存储资源组织为 租户 - 桶 - 对象 的形式

对象(object):存储资源(文件、视频、音频)的抽象称呼;
桶(bucket):若干个对象的逻辑抽象,相当于若干个对象的容器;
租户(tenant):隔离存储资源。在租户下可以创建桶和存储对象;
用户(user):租户下创建的用于访问不同桶的账号。
4.5 统一域名访问¶
Minio集群扩展加入了新的集群或者桶后,对象存储的客户端程序需要通过统一的域名 /url 来访问数据对象,这个过程涉及了 etcd 与 CoreDns;

4.6 存储机制¶
Minio使用纠删码erasure code和checksum来保护数据免受硬件故障和数据损坏。即使丢失一半数量 (N/2)的硬盘,仍然可以恢复数据。
纠删码是一种恢复丢失和损坏数据的数学算法,目前纠删码技术在分布式存储系统中的应用分为三类:
- 阵列纠删码(Array code: RAID5、RAID6等)
- RS(Reed-solomon)里德-所罗门类纠删码
- LDPC(LowDensity Parity Check Code)低密度奇偶检验纠删码。
ErasureCode是一种编码技术,它可以将份原始数据,增加M份数据,并能通过N+M份中的任意N分数 据,还原原始数据。
即如果有任意小于等于M份的数据丢失,仍然能通过剩下的数据还原。
Minio采用Reed-solomon code将对象拆分成N/2数据和N/2奇偶检验快,这就意味着如果是12块盘,一 个对象将会被分成6个数据块、6个奇偶检验快,可以丢失任意6块盘(不管存放的数据快还是奇偶检验快),仍然可以从剩下的盘中的数据恢复。
在一个N节点的分布式Minio中,只要有N/2个节点在线,你的数据就是安全的。不过至少需要N/2+1个节点才能进行写操作。
将一个文件上传至Minio后,对应磁盘上的信息如下:

xl.json:为此对象的元数据文件。
part.1:为此对象的第一个数据分片。(分布式中每一个节点都会存在这两个文件分别是数据块和奇偶检 验快)在读取数据时Minio会对编码快进行HighwayHash编码,然后进行校验,以确保每个编码的正确 性。
基于Erasure Code和Bit Rot Protection 的 HighwayHash 这两个特性,所以 Minio 的数据可靠性很高。
4.7 对象存储网关¶
Minio 除了可以作为存储系统服务外,还可以作为网关,后端可以与 NAS 系统、HDFS 系统等分布式文 件系统或者S3、OSS这样的第三方存储系统对接。
用户通过统一的 S3 API 请求存储资源,通过 S3 API Router 将各个请求路由到对应的 ObjectLayer,每个 ObjectLayer 对应实现了各个存储系统的对象操作的所有API。
五、多维度 Ceph VS MinIO¶
5.1 软件整体对比¶
| Project | Ceph | Minio |
|---|---|---|
| 语言 | C++ | Go |
| 代码量(行) | 1147695 | 43818 |
| License | LGPL | AGPLv3 |
| 提供的API | librados (C, C++, Python, Ruby, PHP, C#, Perl), S3, Swift, FUSE | AWS S3 API (Go, Java, Python, .NET, Javascript, Haskell…) |
| 高可用 | Yes | Yes |
| Shared | Yes | Yes |
| 数据冗余方式 | 副本/纠删码 | 纠删码 |
| 纠删码算法 | Pluggable erasure codes(RS/LRC/SHEC) | Reed-Solomon |
| 纠删码作用单位 | Pool | Object |
| 初始版本发布时间 | 2010 | 2014 |
| 部署需求 | 1 per 1TB of storage | 无限制 |
| 部署方式 | k8s operator(rook)/裸机 (ansible/cephadm/ceph-volume/binary) | k8s operator/裸机(docker- compose/ansible/binary/) |
| 平台支持 | Linux/~~Windows~~/~~MacOS~~ | Linux/Windows/MacOS |
| K8S存储支持 | CSI/COSI(NAS) | DirectPV(DAS) |
| 数据一致性 | 强 | 强 |
| 文档支持 | 强 | 弱 |
| 社区支持 | 邮件列表 | slack |
5.2 对象存储功能对比¶
| 项目 | Ceph | Minio |
|---|---|---|
| 容灾备份 | AA/AP | AA/AP |
| 认证/访 问控制 | 支持插件(Active Directory/OpenLDAP/OpenID)/IAM | 支持插件 (KEYCLOAK/facebook/Google/Okata/Active Directory/OpenLDAP)/IAM |
| TLS加密 | Yes | Yes |
| 客户端加密 | Yes | Yes |
| 服务端加密 | Yes | Yes |
| 对象锁定(WORM) | Yes(nautilus) | Yes |
| 版本管理 | Yes | Yes |
| 生命周期管理 | Yes | Yes |
| 数据分层 | Yes | Yes |
| 管理接口 | Dashboard/API/CLI | Console/API/CLI |
| 监控告警 | Prometheus | Prometheus |
| 事件通知 | Yes | Yes |
| 可扩展性 | Yes | Yes |
| AWS兼 容 | Yes(不完全兼容) | Yes |
| S3 Select | Yes | Yes |
| 云网关模式 | 无 | Google Azure/NAS/S3/HDFS |
| 导出为文件系统 | nfs | minfs |
| 数据存储 | (bluestore)/Linux文件系统(filestore) | linux文件系统 |
| 元数据存储 | kv数据库/(rockdb/leveldb/other) | linux文件系统 |
5.3 Ceph和MinIO区别¶
Ceph和MinIO是用于管理大量数据的分布式存储系统。 以下是它们之间的主要区别:
架构:
- Ceph 是一个统一的分布式存储系统,提供块、文件和对象存储。
- MinIO 是一个轻量级云原生对象存储系统,专注于对象存储。它设计简单、可扩展、兼容 Amazon S3 API 。
部署灵活性:
- Ceph 可部署为自我管理的解决方案,但需要更复杂的配置和管理。
- MinIO 被设计为易于部署,并且可以快速设置为独立实例或分布式集群。
可扩展性和性能:
- Ceph 以其高可扩展性和性能而闻名。 它可以处理海量数据并提供跨多个节点的自动数据分发。
- MinIO 针对高性能对象存储工作负载进行了优化。 它使用纠删码和并行对象上传来实现出色的性 能。
数据保护和冗余:
- Ceph 通过其分布式存储架构提供数据保护和冗余。 它利用数据复制和纠删码技术来确保数据的持 久性和容错能力。
- MinIO 还通过纠删码提供数据冗余和容错。 它允许用户根据自己的具体需求配置冗余级别。
API兼容性:
- Ceph提供了一个名为 RADOS(可靠的自主分布式对象存储)的 RESTful API,允许开发人员以编程 方式与存储系统进行交互。
- MinIO 与 Amazon S3 API 完全兼容。 它支持所有 S3 功能,并提供与 S3 兼容的应用程序和工具的 无缝集成。
社区和生态系统:
- Ceph 拥有庞大而活跃的社区以及强大的行业支持。 社区提供了广泛的文档、论坛以及社区驱动的 工具和插件。
- MinIO 还拥有一个活跃的社区,并提供全面的文档和支持。 它受益于与 S3 API 的兼容性以及与流 行的云原生工具和平台的集成。
六、总结¶
- Ceph和MinIO都是用于管理大数据量的分布式存储系统。 Ceph 是一个统一的解决方案,支持具有可扩展性的块、文件和对象存储。
- MinIO 专注于轻量级对象存储,兼容 Amazon S3 API。在轻松部署、性能优化和 Kubernetes 集成方面表现出色。