一、分布式存储系统应用场景

image

1.1 常见的传统存储方案

image-20260406104749425

DAS

Direct Attached Storage直连存储,储设备直接与主机服务器连接,其他主机不能使用这个存储设备普通的PC服务器的存储即为DAS,将外部的存储设备直接加在服务器内部来存储数据服务器本身容易成为系统瓶颈,服务器发生故障时,整个存储数据将不可访问。

对于存在多个服务器的系统,设备分散,不便于管理。同时多台服务器使用DAS时,存储空间不能在服务器之间动态分配和共享,可能造成相当的资源浪费。

这种存储方式,比较适用于小型网络结构,数据量小,对数据的传输与读取速度要求不高的场景下DAS 属于块设备

NAS

Network Attached Storage 网络附加存储

存储系统直接接入网络,通过网络交换机,将服务器与存储连接在一起,用户可以通过TCPIP协议访问数据

并通过标准的业界文件共享协议,如: FTP、CIFS、NFS来实现目录级的共享。

此方式安装布署比较简单,可以即插即用,而且不依赖于操作系统,缺点就是存储的性能不太好NAS是“文件级”数据共享

SAN

Storage Area Network 存储区域网络

交换机将磁盘阵列等存储设备与相关服务器连接起来的高速专用存储网络。最开始用的是FC-SAN,也就是基于FC设备及通信协议的存储区域网络。

因为光纤网络的成本太高,后面又发展出一种基于以太网的SAN存储形式, 利用TCP/IP协议实现了对SCSI协议的封装

相对于其它方式,更易于扩容、集中管理、更好的性能以及更灵活的备份策略。

SAN提供的是裸设备,属于Block级共享

1.2 OS Object storage 对象存储

1.2.1 什么是 Object storage

对象存储(Object Storage)是一种用于存储和管理海量非结构化数据的存储架构,常用于存放图片、视频、备份文件、日志等大文件。与传统的块存储和文件存储不同,对象存储将数据作为对象

(Object)来管理,而不是文件系统中的文件或块设备中的块。每个对象包含:

1、数据:需要存储的内容(例如一张图片或一个视频)。

2、元数据:关于这个数据的描述性信息,比如创建时间、文件类型等。

3、唯一的标识符:每个对象都有一个唯一的ID,通过它可以直接访问该对象。

1.2.2 OS 对象存储应用场景

当前互联网上有海量的非结构化数据的需要存储,如下数据

  • 电商网站: 海量商品图片
  • 视频网站: 海量视频文件
  • 音乐网站: 海量音频文件
  • 社交网站: 海量图片
  • 云平台: 大量的虚拟机镜像文件
  • 网盘: 海量文件

以上海量的数据如果是基于传统的SAN和NAS的方式进行存储,无论是性能,容器和可用性方方面面都已经力所不及。

当前常用的解决方案是基于对象存储服务(Object Storage Service, OSS)实现

1.2.3 对象存储服务 OSS (Object Storage Service ) 特点

对象存储是一种分布式、基于Restful方式操作的存储服务

数据作为单独的对象进行存储

水平扩展性:对象存储的架构能够轻松扩展,支持存储海量数据,在上传大文件时,OSS会采用分片上传, 通常用于云存储服务(如Amazon S3、Google Cloud Storage等)

高可用性和持久性:对象存储的数据被自动复制并分布在多个物理位置,减少数据丢失的可能。

无层级结构:与文件存储的层次目录结构不同,对象存储是扁平结构,不直接使用目录树,所有对象存放在同一个命名空间中,可以通过其唯一ID直接访问。可以在互联网任何位置通过URL方式对每个对象进行存储和访问,但不支持挂载

适合大文件存储:适合存储非结构化数据﹔比如︰视频、图片、日志、文本文件等,通常用于云计算环境中

适合读多写少的场景

1.2.4 OSS 分类

分为公有云的OSS服务和私有云的OSS服务

公有云: 阿里云的OSS,腾讯云的COS,天翼云的OSS,亚马逊的S3(2006年3月),Microsoft AzureBlob存储等公有云提供OSS服务

私有云: MinIO, Ceph RGW

二、阿里云的OSS

阿里云等公有云提供了OSS服务

https://www.aliyun.com/product/oss

2.1 什么是OSS

https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/file-manage-files/zh%EF%BF%BECN/20220727/ttob/OSS%E6%96%B0%E7%89%88%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性, $9 9 . 9 9 5 \%$ 的数据可用性。多种存储类型供选择,全面优化存储成本。

OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

2.2 阿里云 OSS重要特性

版本控制

版本控制是针对存储空间(Bucket)级别的数据保护功能。开启版本控制后,针对数据的覆盖和删除操作将会以历史版本的形式保存下来。您在错误覆盖或者删除文件(Object)后,能够将Bucket中存储的Object恢复到任意时刻的历史版本。更多信息,请参见版本控制概述。

Bucket Policy

Bucket拥有者可通过Bucket Policy授权不同用户以何种权限访问指定的OSS资源。例如您需要进行跨账号或对匿名用户授权访问或管理整个Bucket或Bucket内的部分资源,或者需要对同账号下的不同RAM用户授予访问或管理Bucket资源的不同权限,例如只读、读写或完全控制的权限等。关于配置Bucket Policy的具体操作,请参见通过Bucket Policy授权用户访问指定资源。

跨区域复制

跨区域复制(Cross-Region Replication)是跨不同OSS数据中心(地域)的Bucket自动、异步(近实时)复制Object,它会将Object的创建、更新和删除等操作从源存储空间复制到不同区域的目标存储空间。跨区域复制功能满足Bucket跨区域容灾或用户数据复制的需求。更多信息,请参见跨区域复制概述。

数据加密

服务器端加密:上传文件时,OSS对收到的文件进行加密,再将得到的加密文件持久化保存;下载文件时,OSS自动将加密文件解密后返回给用户,并在返回的HTTP请求Header中,声明该文件进行了服务器端加密。更多信息,请参见服务器端加密。

客户端加密:将文件上传到OSS之前在本地进行加密。更多信息,请参见客户端加密。

数据永久保存

OSS默认永久保存上传到Bucket的数据

2.3 阿里云 OSS应用场景

图片和音视频等应用的海量存储

OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。

OSS支持流式写入和文件写入两种方式。

image

网页或者移动应用的静态和动态资源分离

利用海量互联网带宽,OSS可以实现海量数据的互联网并发下载。OSS提供原生的传输加速功能,支持上传加速、下载加速,提升跨国、跨洋数据上传、下载的体验。同时,OSS也可以结合CDN产品,提供静态内容存储、分发到边缘节点的解决方案,利用CDN边缘节点缓存的数据,提升同一个文件被同一地区客户大量重复并发下载的体验。

image

云端数据处理

上传文件到OSS后,可以配合智能媒体管理服务和图片处理服务进行云端的数据处理。

image

三、MinIO介绍

image

MinIO 是GlusterFS创始人之一Anand Babu Periasamy发布的新的开源项目。

MinlO 是一个用 GoLang 语言开发的基于 GNU AGPL v3 开源协议的对象存储服务(Object StorageService, OSS)

对象存储服务是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。

对象存储服务支持容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

MinlO 兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如:图片、视频、日志文件、备份数据和容器/虚拟机镜像等

MinlO 支持的一个对象文件可以是任意大小,从几kb到最大5T不等

MinlO 是一个非常轻量的服务, 可以很简单的和其他应用的结合,也支持各种操作系统,比如:Linux,Windows,Mac等

对于中小型企业的对象存储,如果不选择公有云存储,那么Minio是个不错的选择

MinIO 除了直接作为对象存储使用,还可以作为云上对象存储服务的网关层,无缝对接到Amazon S3、MicroSoft Azure。

国内的阿里巴巴、腾讯、百度、中国联通、华为、中国移动等9000多家企业也都在使用MinIO产品。

官网

https://min.io/
http://minio.org.cn/
https://github.com/minio/minio

image

3.1 MinIO 特点

MinIO 提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的云储存服务。

MinIO 使用和部署非常简单,可以让您在最快的时间内实现下载到生产环境的部署。

MinIO 读写性能优异,高性能MinIO 是世界上最快的对象存储,没有之一。在 32 个 NVMe 驱动器节点和 100Gbe 网络上发布的 GET/PUT 结果超过 325 GiB/秒和 165 GiB/秒

MinIO 支持的对象文件小到几kb到最大5T,并实现了数据的高可用

MinIO 原生支持 Kubernetes,它可用于每个独立的公共云、每个 Kubernetes 发行版、私有云和边缘的对象存储套件。

MinIO 是软件定义的,不需要购买其他任何硬件,在 GNU AGPL v3 下是100%开源的

3.2 MinIO 性能

https://blog.min.io/scaling-minio-more-hardware-for-higher-scale/

机械硬盘

image

HDD Backend PUT (GB/s) GET (GB/s)
16 Node 8.57 GB/s 10.81 GB/s
24 Node 9.4 GB/s 17.0 GB/s
Scale Factor 1.1x 1.57x

NVME固态硬盘

image

NVMe Backend PUT (GB/s) GET (GB/s)
8 Node 34.4 GB/s 46.5 GB/s
32 Node 171.3 GB/s 183.2 GB/s
Scale Factor 4.9x 3.9x

四、MinIO 工作机制

4.1 MinIO 相关术语

0bject 对象

存储到Minio的基本对象,如文件、字节流等任意数据

一个文件就是一个对象

Bucket 桶

用来存储Object的逻辑空间。

每个Bucket之间的数据是相互隔离的。

对于客户端而言,就相当于一个存放文件的顶层文件夹,用于实现不同资源的分类存储通常一个项目或同一类资源可以对应于一个Bucket

Drive 驱动器

即存储数据的磁盘,一个Drive通常对应一块物理磁盘或者一个独立目录

在MinIO启动时,以参数的方式传入。

Minio 中所有的对象数据都会存储在Drive里

Set 存储集

set 是一组Drive的集合,即一组相关的磁盘的集合

分布式部署时,MinIO会根据集群规模自动划分一个或多个Set,每个Set中的Drive分布在不同位置。

一个对象存储在一个Set上

一个集群划分为多个Set

一个Set包含的Drive数量是固定的, 默认由系统根据集群规模自动计算得出

一个Set中的Drive尽可能分布在不同的节点上

4.2 纠删码EC (Erasure Code)

https://blog.min.io/erasure-coding/
https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html
https://www.minio.org.cn/docs/minio/kubernetes/upstream/operations/concepts.html#id11

分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一-致性、高可用、高性能的基础。而对于在存储领域,一 般对于保证数据可靠性的方法主要有两类,一类是冗余法,一 类是校验法。

分布式存储可靠性常用方法

冗余法

冗余法即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。

当前有很多分布式系统采用此种方式实现,如:ELasticsearch的索引副本,Kafka的副本,Redis的集群,MySQL的主从模式,Hadoop的多副本的文件系统

校验法

校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据可以实现校验和还原两个功能通过对数据进行校验和( checksum )进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如TCP协议

恢复还原,通过对数据结合校验码进行数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的RAID技术,纠删码(Erasure Code)技术等。

MinlO采用的就是纠删码技术。

MinIO 纠删码EC (Erasure Code) 是一种提供数据高可用性功能,允许具有多个驱动器的 MinIO 部署即时自动重建对象,即使群集中丢失了多个驱动器或节点。 纠删码提供了对象级修复

Minio使用纠删码erasure code 与校验和checksum来保护数据免受硬件故障和无声数据损坏。即便您丢失一 半数量(N/2) 的硬盘,您仍然可以恢复数据。

纠删码是一种恢复铁和损坏数据的数学算法,Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2奇偶校验块。

当损坏总磁盘数的一半磁盘时,只能读取而不能上传新的文件,只要保证正常磁盘数大于等n/2+1时,就可以支持写入新数据

这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。

实现纠删码 EC 至少需要4块Drive磁盘以上

纠删码是可以通过数学计算,实现数据冗余,功能上类似于RAID技术,当磁盘损坏时,可以通过计算把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n $+ \mathsf { m }$ 份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。

MinIO 根据纠删集的大小将对象拆分为数据和奇偶校验块,然后将数据和奇偶校验块随机均匀地分布在一组驱动器上,以便每个驱动器每个对象包含的块不超过一个。虽然驱动器可能包含多个对象的数据和奇偶校验块,但只要系统中有足够的驱动器,单个对象每个驱动器的块不超过一个。对于版本化对象,MinIO 选择相同的驱动器进行数据和奇偶校验存储,同时在任何一个驱动器上保持零重叠。

当一个大文件大于10 MB时,写入 MinIO,S3 API 将其分解为分段上传。分段大小由客户端在上传时确定。S3 要求每个部分至少为 5 MB(最后一部分除外)且不超过 5 GB。根据 S3 规范,一个对象最多可以分成10,000 个Part 部分。假设一个 320 MB 的对象。如果此对象分为 64 个部分,MinIO 会将每个部分: part.1、part.2 写入驱动器,...直到第 64 部分。这些部分的大小大致相等,例如,作为多部分上传的320 MB 对象将拆分为 64 个 5 MB 部分。

上传的每个部分都通过条带进行纠删码。Part.1 是上载对象的第一部分,所有部分在驱动器上水平条带化。每个部分都由其数据块、奇偶校验块和 XL 元数据组成。MinIO 轮换写入,因此系统不会总是将数据写入相同的驱动器,并将奇偶校验写入相同的驱动器。每个对象都独立旋转,允许统一有效地使用群集中的所有驱动器,同时还增强了数据保护。

为了检索对象,MinIO 执行哈希计算以确定对象的保存位置,读取哈希并访问所需的纠删节和驱动器。

需要注意的是: 纠删码的内在工作原理和RAID实际是不同的,像RAID5可以在损失一块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。MinIO纠删码的设计目标是为了性

能和尽可能的使用硬件加速,与相类技术(如 RAID 或复制)相比,开销要少得多。

纠删码比 RAID 更适合对象存储有几个原因。MinIO 纠删码不仅可以在多个驱动器和节点发生故障时保护对象免受数据丢失,还可以在对象级别进行保护和修复。一次修复一个对象的能力是比在卷级别修复的 RAID 的显着优势。损坏的对象可以在几秒钟内在 MinIO 中恢复,而在 RAID 中则需要数小时。如果驱动器损坏并被更换,MinIO 会识别新驱动器,将其添加到纠删节,然后验证所有驱动器上的对象。更重要的是,读取和写入不会相互影响,从而实现大规模性能。有 MinIO 部署,在 PB 级存储中拥有数千亿个对象。

MinIO 中的纠删码实施可提高数据中心的运营效率。与复制不同,无需跨驱动器和节点进行冗长的重建或重新同步数据。这听起来可能微不足道,但移动/复制对象可能非常昂贵,并且 16TB 驱动器出现故障并通过数据中心网络复制到另一个驱动器会给存储系统和网络带来巨大的负担。

https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html

纠删码计算器

https://min.io/product/erasure-code-calculator

image

EC(Erasure-Code)算法的最底层的基本的数学原理:行列矩阵中-种特殊矩阵的性质:即任意N*M (N行M列{N<M})的行列式,其任意NxN的子矩阵那是可逆,以实现数据恢复运算。

定义: erasure code是一种技术,它可以将n份原始数据,增加m份数据(用来存储erasure编码), 并能通过n+m份中的任意n份数据,还原为原始数据。定义中包含了encode和decode两个过程,将原始的n份数据变为n+m份是encode,之后这n+m份数据可存放在不同的device上,如果有任意小于m份的数据失效,仍然能通过剩下的数据还原出来。也就是说,通常n+m的erasure编码,能容m块数据故障的场景,这时候的存储成本是1+m/n,通常m<n。

RS(Reed-Solomon) code是最基本的一种ES。RS codes是基于有限域的一种编码算法,有限域又称为GaloisField,是以法国著名数学家Galois 命名的,在RS codes中使用GF(2^w),其中2^w>=n+ m. RS codes定义了一个(n + m) * n的分发矩阵(Distribution Matrix)

4.3 MinIO 工作流程

image

4.4 MinIO 存储机制

对象上传到MinIO后,以Bucket目录下,目录结构如下

./bucket_name/filename/xl.meta #元数据文件
./bucket_name/filename/hash/part.N 
#编号为奇数的磁盘中的part.N为校验码文件
#编号为偶数的磁盘中的part.N为原始数据文件
#示例
[root@ubuntu2204 ~]#tree /minio/
/minio/
├── data1
 └── mybucket
   └── 19M图片.jpg
       ├── ff0324e9-45d5-4cb3-af1e-b04cb9b948b2
        └── part.1
       └── xl.meta
├── data2
 └── mybucket
   └── 19M图片.jpg
       ├── ff0324e9-45d5-4cb3-af1e-b04cb9b948b2
        └── part.1
       └── xl.meta
├── data3
 └── mybucket
   └── 19M图片.jpg
       ├── ff0324e9-45d5-4cb3-af1e-b04cb9b948b2
        └── part.1
       └── xl.meta
├── data4
 └── mybucket
   └── 19M图片.jpg
       ├── ff0324e9-45d5-4cb3-af1e-b04cb9b948b2
        └── part.1
       └── xl.meta
├── data5
 └── mybucket
   └── 19M图片.jpg
       ├── ff0324e9-45d5-4cb3-af1e-b04cb9b948b2
        └── part.1
       └── xl.meta
├── data6
 └── mybucket
   └── 19M图片.jpg
       ├── ff0324e9-45d5-4cb3-af1e-b04cb9b948b2
        └── part.1
       └── xl.meta
├── data7
 └── mybucket
   └── 19M图片.jpg
       ├── ff0324e9-45d5-4cb3-af1e-b04cb9b948b2
        └── part.1
       └── xl.meta
└── data8
  └── mybucket
      └── 19M图片.jpg
          ├── ff0324e9-45d5-4cb3-af1e-b04cb9b948b2
           └── part.1
          └── xl.meta

4.5 MinIO 启动模式

image