Minio简介
Minio是一个开源的对象存储服务器。对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。它是对Amazon S3云存储服务的开源替代方案。采用Golang实现。Minio提供了一个简单的Web界面,可以通过它来管理对象存储,还包括了API和SDK,可以与多种应用程序和编程语言一起使用,如Python、Java、JavaScript、Go等等。它最适合存储非结构化数据,如:照片、视频、日志文件、容器/虚拟机/映像等,单次存储对象的大小最大可达5TB。
以下是Minio的一些特点:
- Minio与Amazon S3具有相同的API,可以无缝替换S3,提供了许多与S3相同的功能和优势,例如:多区域存储、安全性、HA、持久性等等。
- Minio可以作为一个基于HTTP的对象存储服务器,为应用程序提供文件存储和读取操作,支持分布式部署,可以轻松地扩展存储容量和带宽。
- Minio提供了简单的Web界面和命令行工具,可以方便地管理和监控存储。
- Minio是基于Go语言编写,具有高性能和高可靠性,支持多种存储后端,包括本地磁盘、NFS、S3、Azure Blob存储等等。
MinIO的优势
AWS S3标准兼容
亚马逊云的S3 API(接口协议)是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。MinIO在很早的时候就采用了S3兼容协议,并且MinIO是第一个支持S3 Select的产品.MinIO对其兼容性的全面性感到自豪,并且得到了750多个组织的认同,包括Microsoft Azure使用MinIO的S3网关-这一指标超过其他同类产品的总和。
高性能
MinIO号称是目前速度最快的对象存储服务器。在标准硬件上,对象存储的读/写速度最高可以高达183GB/s和171GB/s。对象存储可以作为主存储层,用来处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。
MinIO用作云原生应用程序的主要存储,和传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。
数据安全性
Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。纠删码是一种恢复丢失和损坏数据的数学算法,目前,纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)里德-所罗门类纠删码和LDPC(Low Density Parity Check Code)低密度奇偶校验纠删码。Erasure Code是一种编码技术,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。
Minio的架构
Minio是一个分布式对象存储服务器,由多个Minio节点组成一个Minio集群。以下是Minio架构的一些关键组件及其作用:
- Minio Server:Minio服务器是核心组件,它负责存储和检索对象数据,并通过S3兼容的API提供服务。
- Erasure Coding:Minio使用一种称为“Erasure Coding”的技术,将对象数据切分成多个“数据块”和“校验块”,并将它们分别存储在不同的磁盘上,从而提高了数据的可靠性和安全性。
- Gateway:Minio Gateway是一种代理服务器,它提供了对其他云存储服务(如Amazon S3、Google Cloud Storage)的访问,使你可以使用Minio API访问这些云存储服务。
- Minio Client:Minio客户端是一种命令行工具,可以用来管理和监控Minio服务器,并执行一些基本的文件操作,如上传、下载、复制、移动等。
- Distributed Mode:Minio支持分布式部署,允许将多个Minio节点组成一个分布式集群,从而提高存储容量和带宽。
MINIO有几个概念比较重要
- Object:存储到Minio的基本对象,如文件、字节流,Anything…
- Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。
- Drive:即存储数据的磁盘,在MinIO启动时,以参数的方式传入。Minio中所有的对象数据都会存储在Drive里。
- Set:即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set中的Drive分布在不同位置。一个对象存储在一个Set上。(For example: {1…64} is divided into 4 sets each of size 16.)
- 一个对象存储在一个Set上
- 一个集群划分为多个Set
- 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出
- 一个SET中的Drive尽可能分布在不同的节点上
去中心化架构
Minio采用去中心化的无共享架构,对象数据被打散存放在不同节点的多块硬盘,对外提供统一命名空间访问,并通过负载均衡或者DNS轮询在各个服务器之间实现负载均衡。
统一的命名空间
Minio有两种集群部署方式,一种是常见的本地分布式集群部署,一种是联盟模式部署。本地分布式集群部署即在多个本地服务器节点部署Minio服务,并将其组成单套分布式存储集群,并提供统一命名空间和标注的S3访问接口。联盟部署则是将多个本地Minio集群在逻辑上组成了统一命名空间,实现近乎无线的扩展与海量的数据规模管理,这些集群都可以在本地或者分布在不同地域的数据中心。
分布式锁管理
与分布式数据库类似,Minio也会存在面临数据一致性的问题:一个客户端在读取一个对象的同时,另一个客户端可能正在修改或者删除这个对象。为了避免出现不一致的情况。Minio专门设计并实现了dsync分布式锁管理器,来控制数据一致性。
- 任何一个节点的锁请求都会广播给集群内的所有在线节点
- 如果收到N/2+1个节点的同意,则获取所成功
- 没有主节点,每个节点互相对等,节点间通过stalelock检测机制,判断节点的状态及持有锁情况
- 由于设计简单,比较粗糙。有一定的缺陷性,最多支持32个节点。无法避免锁丢失的场景。不过基本满足可用需求。
数据结构
Minio对象存储系统把存储资源组织为租户-桶-对象的形式
- 对象:类似于hash表中的表xiang表项,名字是关键字,内容相当于值
- 桶:是若干个对象的逻辑抽象,是盛装对象的容器
- 租户:用于隔离存储资源。在租户下可以建立桶、存储对象
- 用户:在租户下面创建的用于访问不同桶的账号。可以使用minio提供的mc命令设置不同用户访问各个桶的权限
统一域名访问
Minio集群扩展加入了新的集群或者桶后,对象存储的客户端程序需要通过统一的域名/url来访问数据对象,这个过程涉及了etcd与CoreDns.
存储机制
Minio使用纠删码erasure code和checksum来保护数据免受硬件故障和无声数据损坏。即使丢失一半数量(N/2)的硬盘,仍然可以恢复数据。
纠删码是一种恢复丢失和损坏数据的数学算法,目前纠删码技术在分布式存储系统中的应用分为三类,阵列纠删码(Array code: RAID5、RAID6等)、RS(Reed-solomon)里德-所罗门类纠删码和LDPC(Low Density Parity Check Code)低密度奇偶检验纠删码。Erasure Code是一种编码技术,它可以将份原始数据,增加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和BitRot Protection的HighwayHash这两个特性,所以Minio的数据可靠性很高。
lambda计算与持续备份
Minio支持lambda计算通知机制,即桶中的对象支持事件通知机制。当前支持的事件类型有:对象上传、对象下载、对象删除、对象复制等。当前支持事件接受系统有:redis、NATS、AMQP、Kafka、mysql、elasticsearch等。
对象通知机制增强了Minio的扩展性,可以让用户通过自行开发来实现某些Minio未实现的功能。比如基于元数据的检索、与用户业务相关的计算等。同时也可以通过这个机制进行快速有效的增量备份。
对象存储网关
Minio除了可以作为存储系统服务外,还可以作为网关,后端可以与NAS系统、HDFS系统等分布式文件系统或者S3、OSS这样的第三方存储系统。有了Minio网关,就可以为这些后端系统添加S3兼容的API,便于管理和移植,因为S3 API已经是对象存储界事实的标注。
用户通过统一的S3 API请求存储资源,通过S3 API Router将各个请求路由到对应的ObjectLayer,每个ObjectLayer对应实现了各个存储系统的对象操作的所有API。例如GCS(Google cloud storage)实现了ObjectLayer接口后,它对于后端存储的操作就是通过GCS的SDK实现。当终端通过S3 API获取存储桶列表,那么最终的实现会通过GCS的SDK访问GCS服务获取存储桶列表,然后包装成S3标准的结构返回给终端。
参考链接: