一、前言

背景:数字化时代,数据的快速增长给企业和组织带来了巨大挑战;

解决方案: 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 &quot;%r&quot; %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)所有节点都同时承担了多种角色,集元数据存储、数据存储、应用访问等功能于一体,真正实现了去中心化和所有节点的完全对等。

Day15-Minio存储-图2

4.2 统一的命名空间

Minio有两种集群部署方式:一种是常见的本地分布式集群部署,一种是联盟模式部署。

本地分布式集群:在本地多个服务器节点部署Minio服务,并将其组成单套分布式存储集群,并提供统一命名空间和标准S3接口以进行统一访问。

联盟:将多个本地Minio集群在逻辑上组成了统一命名空间,实现近乎无线的扩展与海量的数据规模管理,这些集群都可以在本地或者分布在不同地域的数据中心。

Day15-Minio存储-图3

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对象存储系统把存储资源组织为 租户 - 桶 - 对象 的形式

Day15-Minio存储-图4

对象(object):存储资源(文件、视频、音频)的抽象称呼;

桶(bucket):若干个对象的逻辑抽象,相当于若干个对象的容器;

租户(tenant):隔离存储资源。在租户下可以创建桶和存储对象;

用户(user):租户下创建的用于访问不同桶的账号。

4.5 统一域名访问

Minio集群扩展加入了新的集群或者桶后,对象存储的客户端程序需要通过统一的域名 /url 来访问数据对象,这个过程涉及了 etcd 与 CoreDns;

Day15-Minio存储-图5

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后,对应磁盘上的信息如下:

Day15-Minio存储-图6

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 集成方面表现出色。