抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

MinIO对象存储

minio01

对象存储

随着互联网的高速发展,我们会面对越来越多海量非结构化数据的存储需求,在这样的背景下,对象存储解决方案为我们文件的存取提供了很大的便利和保障

为什么引入对象存储

我们知道,在很长的一段时间里,这三种架构几乎统治了数据存储市场,所有行业用户的数据存储需求,都是在这三者中进行选择

img

​ 然而,随着时代的发展,一种新的数据存储形态诞生,开始挑战前面三者的垄断地位,没错,它就是云计算时代存储技术的新网红——对象存储。

​ 对象存储,也称为“面向对象的存储”,英文是Object-based Storage,现在很多云厂商,也直接称之为“云存储”。

存储发展趋势

20世纪末,随着互联网的爆发,数据存储需求发生了两个重大的变化。

数据量爆炸式增长

Web应用的崛起、社交需求的刺激,极大地推动了多媒体内容的创作和分享,人们开始上传大量的照片、音乐、视频,加剧了数据量的爆发,此外,信息技术的发展、企业数字化的落地,也产生了大量的数据,不断吞食着存储资源。

非结构化数据的占比显著增加

什么是非结构化数据?举个例子大家就明白了,我们经常做的excel表格,姓名、身高、体重、年龄、性别,这种用二维表结构可以进行逻辑表达的数据,就是结构化数据,而图像、音频、视频、word文章、演示胶片这样的数据,就是非结构化数据

​ 根据此前的预测,到2020年,全球数据总量的80%,将是非结构化数据,面对这两大趋势,因为本身技术和架构的限制,DAS、SAN和NAS无法进行有效应对。

三种存储技术

下面我们来看下最常见的三种存储技术

块存储

块存储像是一块块硬盘直接挂载在主机上,以卷或硬盘形式体现,对于存储的数据内容和格式一无所知,只关心读取和写入,不关心关系和用途,数据按字节来访问,性能很高,但是太偏向于底层,不利于扩展,常见的有DAS(直连式存储)、SAN(存储区域网络)。

  • DAS是指将存储设备通过SCSI接口直接连接到一台服务器上使用,存储介质直接挂载到内部总线上,数据存储是整个服务器结构的一部分。

  • SAN是通过高速网络将一个或多个存储设备和服务器连接起来的专用存储系统,可以把SAN理解成一个网络,里面包含着磁盘阵列、交换机等各种元素。

img

存储协议

块存储,操作对象是磁盘,存储协议是SCSI、iSCSI、FC,以 SCSI 为例,主要接口命令有 Read/Write/Read Capacity/Inquiry 等等。

文件存储

文件存储一般以文件和目录形式体现,有多级访问路径和基于文件系统的目录结构,数据以文件的形式进行存取,也可以进行一些高级管理功能,比如文件层面的访问权限控制等。文件存储可以很方便的进行共享,用途也非常广泛,但是其读写速度相对较慢,常见的有NAS(网络附加存储服务器)。

​ NAS设备本质就是将本地主机的文件系统迁移至IP网络设备上,多个用户节点可以公用同一个NAS上的同一个文件系统。

​ 由于块存储和文件存储的存储特点,并不适合公有云存储,一般只适合在局域网内部使用,另外随着互联网需求的发展,数据量爆炸式的增长,不断吞食着存储资源;数据类型也逐渐多元化,各类非结构化的数据占比显著增加,如何应对新的存储需求?对象存储应运而生。

存储协议

文件存储,操作对象是文件和文件夹,存储协议是NFS、SAMBA(SMB)、POSIX等

​ 以NFS为例,文件相关的接口命令包括:READ/WRITE/CREATE/REMOVE/RENAME/LOOKUP/ACCESS 等等,文件夹相关的接口命令包括:MKDIR/RMDIR/READDIR 等等。

对象存储

对象存储是一种基于对象的存储设备,综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的分布式数据共享等优势。适合存储海量图片、视频、日志文件、备份数据、容器镜像等。

​ 对象存储底层存储硬件介质,仍旧是硬盘,这一点和块存储、文件存储没有区别,但是底层硬件之上的系统和两者完全不同。

存储协议

对象存储,主要操作对象是对象(Object)

​ 存储协议是S3、Swift等,以 S3 为例,主要接口命令有 PUT/GET/DELETE 等,看出来了吧?接口命令非常简洁,没有那种目录树的概念,在对象存储系统里,你不能直接打开/修改文件,只能先下载、修改,再上传文件。

img

对象存储

对象存储是用来描述解决和处理离散单元的方法的通用术语,对象在一个层结构中不会再有层级结构,是以扩展元数据为特征的

对象存储结构

对象存储呈现出来的是一个“桶”(bucket),你可以往“桶”里面放“对象(Object)”,这个对象包括三个部分:Key、Data、Metadata。

img

Key

可以理解文件名,是该对象的全局唯一标识符(UID)

​ Key是用于检索对象,服务器和用户不需要知道数据的物理地址,也能通过它找到对象,这种方法极大地简化了数据存储,看上去就是一个URL网址。如果该对象被设置为“公开”,所有互联网用户都可以通过这个地址访问它。

Data

也就是用户数据本体。

Metadata

Metadata叫做元数据,它是对象存储一个非常独特的概念,元数据有点类似数据的标签,标签的条目类型和数量是没有限制的,可以是对象的各种描述信息。

​ 举个例子,如果对象是一张人物照片,那么元数据可以是姓名、性别、国籍、年龄、拍摄地点、拍摄时间等。

​ 在传统的文件存储里,这类信息属于文件本身,和文件一起封装存储,而对象存储中,元数据是独立出来的,并不在数据内部封装,元数据的好处非常明显,可以大大加快对象的排序,还有分类和查找。

对象存储的架构

对象存储的架构是怎样的呢?如下图所示,分为3个主要部分:

img

OSD对象存储设备

​ 这是对象存储的核心,具有自己的CPU、内存、网络和磁盘系统。它的主要功能当然是存储数据,同时,它还会利用自己的算力,优化数据分布,并且支持数据预读取,提升磁盘性能。

MDS元数据服务器

​ 它控制Client和OSD的交互,还会管理着限额控制、目录和文件的创建与删除,以及访问控制权限。

Client客户端

提供文件系统接口,方便外部访问。

​ 根据上面的架构可以看出,对象存储系统可以是一个提供海量存储服务的分布式架构。

对象存储的优点

对象存储的优点很多,简单归纳如下:

容量无限大

对象存储的容量是EB级以上,EB有多大?大家的硬盘普遍是TB级别,1EB约等于1TB的一百万倍,请自行脑补…

​ 对象存储的所有业务、存储节点采用分布式集群方式工作,各功能节点、集群都可以独立扩容,从理论上来说,某个对象存储系统或单个桶(bucket),并没有总数据容量和对象数量的限制。

​ 换句话说,只要你有足够的money,服务商就可以不停地往架构里增加资源,这个存储空间就是无限的,你可以根据自身需求购买相应大小的对象存储空间,如果需要调整大小,也是支持弹性伸缩的,你不要进行数据迁移和人工干预。

数据安全可靠

对象存储采用了分布式架构,对数据进行多设备冗余存储(至少三个以上节点),实现异地容灾和资源隔离

​ 根据云服务商的承诺,数据可靠性至少可以达到99.999999999%(不用数了,一共11个9),这意味着,1000亿个文件里,每月最多只会有1个文件发生数据丢失,这比一个人被陨石击中的概率还要小143000倍。

​ 数据访问方面,所有的桶和对象都有ACL等访问控制策略,所有的连接都支持SSL加密,OBS系统会对访问用户进行身份鉴权,因为数据是分片存储在不同硬盘上的,所以即使有坏人偷了硬盘,也无法还原出完整的对象数据

使用方便

对于用户来说,对象存储是一个非常方便的存储方式。

​ 很多人把它比喻为“代客泊车”,你只需要把车扔给他,他给你一个凭证,你通过凭证取车就可以了,你不需要知道车库的布局,也不需要自己去费力停放。

​ 数据的存取方法也非常灵活多样,除了前面说的可以使用网页(基于http)直接访问之外,大部分云服务提供商都有自己的图形化界面客户端工具,用户存取数据就像用网盘一样。

MinIO概述

MinIO是什么?

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务

​ 它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等

​ MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

与阿里云oss 的功能对比

阿里云收费的oss 也是对象存储,和与阿里云oss 有什么区别呢?

功能 阿里云oss minio
文件管理
文件管理权限策略
纠删码数据修复
持续备份
使用SDK管理资源
监控
版本控制 开启版本控制后,针对文件的覆盖和删除操作将会以历史版本的形式保存下来,在错误覆盖或者删除文件后,能够将存储空间中存储的文件恢复至任意时刻的历史版本 ×
在指定时间内自动批量删除 支持生命周期规则,您可以通过生命周期规则定期将非热门数据转换为低频访问、归档存储或冷归档存储,并删除过期数据 ×
提升数据上传、下载速率 支持传输加速服务 受限于服务器网卡带宽
高性能、高吞吐的数据访问服务 缓存OSS中的热点文件,并提供高性能、高吞吐量的数据访问服务 设置访问一个对象并下载下来进行缓存,那接下来的请求都会直接访问缓存磁盘上的对象,直至其过期失效
加密、保护敏感数据 ×
防护DDoS攻击 当受保护的Bucket遭受大流量攻击时,OSS高防会将攻击流量牵引至高防集群进行清洗,并将正常访问流量回源到目标Bucket,确保业务的正常进行。 ×
记录资源的访问信息 可以通过日志功能完成OSS的操作审计、访问统计、异常事件回溯和问题定位等工作 ×
控制流量 在上传、下载、拷贝文件时进行流量控制,以保证您其他应用的网络带宽 ×
对数据进行分析和处理 图片处理、视频截帧、智能媒体管理 ×
使用工具管理资源 OSS支持图形化工具、命令行工具、文件挂载工具、FTP工具等方便您管理OSS资源 支持图形化工具、命令行工、各类SDK
同城容灾、异地容灾 ×
数据合规保留 允许用户以“不可删除、不可篡改”方式保存和使用数据。 ×
与HDFS对比

HDFS也是经常使用的文件存储方案,与HDFS相比有什么区别呢

对象存储可提供更好的数据保护

虽然HDFS能够利用内部的服务器级存储,它实际上是按照其标准的数据保护策略将所有数据做了三个副本

​ 因此,尽管可以使用较便宜的服务器内部的硬盘驱动器,它可能并不像最初希望的那样经济,因为容量需求要乘以3。

HDFS会暴露主节点

HDFS具有一个主节点和一系列从节点,从节点处理数据并将结果发送给主节点,主节点还需要维护数据复制策略以及基本的集群管理

​ 如果主节点发生故障,集群的其余节点将不能被访问,HDFS对主节点只提供了有限的保护,所以企业需要采取特殊措施来实现主节点的高可用性。

  如上所述,在对象存储系统中,主节点与从节点都能受到相同的纠删编码的数据保护,此外,由主节点维护的管理Hadoop集群所需的所有元数据(metadata)都可以存储在集中化的对象存储系统中。这样当主节点发生故障时,从节点或备用节点可以迅速变成为主节点。

HDFS不能进行单独扩展

像任何其他架构一样,Hadoop对计算和存储容量也会有不同程度的需求,问题是,HDFS要求计算能力和存储容量需要按比例进行扩展,这意味着你不能单独对某一种资源进行扩充。

  要说明这一点最常见的方式是当一个Hadoop架构的存储容量用尽时,因为增加更多容量就意味着加入另一个装满硬盘的节点,这也增加了更多的计算能力。反之亦如此,作为Hadoop基础设施,往往需要更多的处理能力,但存储空间却很充裕。大多数时候,当购置了一个新的服务器以增加计算能力时,它也带来了新的存储空间。其结果是,Hadoop架构总是在某种资源上浪费金钱,而对另一种资源却总是缺乏。

  对象存储允许容量和计算能力各自独立地进行扩展,计算节点可以是1U或2U的机箱,通过固态存储引导,对象存储系统可以装满高容量驱动器,从而保持每GB成本最低。更重要的是,随着应用环境的变化,每一层都可以独立扩展。

MinIO优势

开发文档全面

MinIO作为一款基于Golang 编程语言开发的一款高性能的分布式式存储方案的开源项目,有十分完善的官方文档,官网文档地址:https://docs.min.io/cn/

高性能

MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。

minio02

​ 对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。
​ MinIO用作云原生应用程序的主要存储,与传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟,而这些都是MinIO能够达成的性能指标。

可扩展性

MinIO利用了Web缩放器的来之不易的知识,为对象存储带来了简单的缩放模型。

minio02

​ 据有 “简单可扩展”的特点, 在 MinIO,扩展从单个群集开始,该群集可以与其他MinIO群集联合以创建全局名称空间, 并在需要时可以跨越多个不同的数据中心, 通过添加更多集群可以扩展名称空间,,更多机架,直到实现目标。

云的原生支持

MinIO 是在过去4年的时间内从0开始打造的一款软件 ,符合一切原生云计算的架构和构建过程,并且包含最新的云计算的全新的技术和概念。

​ 其中包括支持Kubernetes 、微服和多租户的的容器技术。使对象存储对于 Kubernetes更加友好。

minio02

支持全面

目前MinIO支持市面主流的开发语言并且可以通过SDK快速集成快速集成使用。

image-20230129144439815

AWS S3标准兼容

亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准

minio02

​ MinIO 在很早的时候就采用了 S3 兼容协议,并且MinIO 是第一个支持 S3 Select 的产品. MinIO对其兼容性的全面性感到自豪, 并且得到了 750多个组织的认同, 包括Microsoft Azure使用MinIO的S3网关 - 这一指标超过其他同类产品的总和。

非常简单

极简主义是MinIO的指导性设计原则,简单性减少了出错的机会,提高了正常运行时间,提供了可靠性,同时简单性又是性能的基础

​ 只需下载一个二进制文件然后执行,即可在几分钟内安装和配置MinIO,配置选项和变体的数量保持在最低限度,这样让失败的配置概率降低到接近于0的水平,MinIO升级是通过一个简单命令完成的,这个命令可以无中断的完成MinIO的升级,并且不需要停机即可完成升级操作 - 降低总使用和运维成本。

开放全部源代码 + 企业级支持

MinIO 基于Apache V2 license 100% 开放源代码

minio02

​ 这就意味着 MinIO的客户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。 此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。

管理界面的支持

MinIO服务安装后,可以直接通过浏览器登录系统,完成文件夹、文件的管理,非常方便使用。

image-20230129145141763

MINIO 基础概念

下面我们来看下MinIO的一些基础概念

术语 含义
Object 存储到MinIO的基本对象,如文件,字节流等
Bucket 存储Object的逻辑空间,每个Bucket之间的数据时相互隔离的。对于用户而言,相当于存放文件的顶层文件夹。
Drive 存储Object的磁盘,在MinIO启动时,以参数的方式传入。
Set 即一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set ,每个 Set 中的 Drive 分布在不同位置。一个对象存储在一个 Set 上。
* 一个对象存储在一个Set上。
* 一个集群划分成多个Set。
* 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算出。
* 一个Set中的Drive尽可能分布在不同的节点上。
EC 纠删码(Erasure Code),保证高可靠。
* n 份原始数据,m份编码数据。
* 任意小于等于m份的数据丢失,以通过剩下的数据还原出来。
Set /Drive 的关系

Set /Drive 这两个概念是 MINIO 里面最重要的两个概念,一个对象最终是存储在 Set 上面的。

​ 我们来看下边 MINIO 集群存储示意图,每一行是一个节点机器,这有 32 个节点,每个节点里有一个小方块我们称之 Drive,Drive 可以简单地理解为一个硬盘。

​ 图中,一个节点有 32 个 Drive,相当于 32 块硬盘,Set 是另外一个概念,Set 是一组 Drive 的集合,图中,所有蓝色、橙色背景的Drive(硬盘)的就组成了一个 Set。

image-20230129173501910

MIINO如何写入对象?

MINIO 是通过数据编码,将原来的数据编码成 N 份,N 就是一个 Set 上面 Drive 的数量,后面多次提到的 N 都是指这个意思,上图中,一个 Set 上面 Drive 的数量,是3。

​ 对象被编码成N份之后,把每一份,写到对应的 Drive 上面,这就是把一个对象存储在整个 Set 上。

image-20230129174234129

​ 一个集群包含多个 Set,每个对象最终存储在哪个 Set 上是根据对象的名称进行哈希,然后影射到唯一的 Set 上面,这个方式从理论上保证数据可以均匀的分布到所有的 Set 上。

​ 根据的观测,数据分布的也非常均匀,一个 Set 上包含多少个 Drive 是由系统自动根据集群规模算出来的,当然,也可以自己去配置,一个 Set 的 Drive 系统会考虑尽可能把它放在多的节点上面,保证它的可靠性。

MinIO数据可靠性

Minio使用了纠删码位衰减保护以及分布式的特性,所以MinIO的数据可靠性做的高。

分布式

在大数据领域,通常的设计理念都是无中心和分布式,Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

数据保护
  • 分布式Minio采用 纠删码来防范多个节点宕机和位衰减bit rot

  • 分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能

高可用

单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio, 只要有N/2硬盘在线,你的数据就是安全的

​ 不过你需要至少有N/2+1个硬盘来创建新的对象,例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。

​ 注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘,比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。

一致性

​ Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。

纠删码

纠删码(Erasure Code)简称EC,是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。

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

什么是纠删码

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

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

​ 从数据函数角度来说,纠删码提供的保护可以用下面这个简单的公式来表示:n = k + m,变量“k”代表原始数据或符号的值,变量“m”代表故障后添加的提供保护的额外或冗余符号的值,变量“n”代表纠删码过程后创建的符号的总值。

​ 举个例子,假设n=16,代表有16块磁盘,另外,有10份原始文件一模一样,称为k,16 = 10 +m,这个m就是可以恢复的校验块个数,所以m是6,任意6个不可用,原始文件都可以恢复,极端情况,10个原始文件坏掉6个,靠4个原始的加上6个校验块,可以把坏掉的6个原始文件恢复,这个用到数学行列式矩阵知识,不做展开。

为什么纠删码有用?

纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。

​ 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长,Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复,Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。

纠删码原理

MinIO的编码方式,将一个对象编码成若干个数据块和校验块,我们简称为Erasure Code码

​ 这个是编码的类型,这种编码的类型,还需要算法来实现,minio 采用的是 Reed-Solomon算法,MinIO使用Reed-Solomon算法,该算法把对象编码成若干个数据块和校验块。

​ Reed-Solomon 是纠删码的实现算法的一种,当然,也是一种恢复丢失和损坏数据的数学算法,Minio默认采用Reed-Solomon code将数据拆分成N/2个数据块和N/2个奇偶校验块。

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

img

​ 如上图,如我们所知,一个对象存储在一个Set上面,这个Set包含16个Drive,其中灰色的一半是数据库,橙色的一半是校验块,这种方式最多能忍受一半的编码丢失或损坏。

所有编码块的大小是原对象的2倍,跟传统多副本存储方案相比,他只冗余存了一份,但可靠性更高。

纠删码的工作原理和RAID或者副本不同,像RAID6只能在损失两块盘,或者以下的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。

而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。

Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。

此外,针对不同应用所需的数据安全级别不同,Minio还提供了存储级别(Storage Class)的配置,调整数据块和校验块的比例,做到对空间的最佳使用

img

比如在将比例调整为14:2后,存储100M的数据占用的空间仅为114M。

算法的特点

Reed-Solomon算法有以下特点,把数据块和校验块统称为编码块,之后我们可以通过编码块的一部分就能还原出整个对象。

  • 低冗余
  • 高可靠

位衰减

位衰减是一个数据位随机翻转的现象 (由0到1或相反),尽管有很多原因引发位衰减,但通常情况下是由 物理媒介的退化 所引起的,它也被称为比特衰变、数据腐烂、数据衰变和静默数据损坏。

​ 它只是物理设备上的一些文件细微的损坏,还没有被操作系统所硬件所察觉,但是他已经损坏了,Bit Rot 位衰减又被称为数据腐化Data Rot、无声数据损坏Silent Data Corruption,位衰减可以理解为无形中的数据丢失——或者称为“Bit rot”, 是指物理存储介质的衰减所带来的隐患将凸显出来。

位衰减现象

下面是一个发生了位衰减文件的例子,衰减位已经多到图像的绝大部分不可恢复。

未发生位衰减的图片

img

已发生位衰减的图片

其中发生位衰减的图片坏块可能有绿色、褐色等等

img

危害

随着数据存储容量的增长,由位衰减(数据中的单比特错误)导致的问题越来越让存储管理员感到头疼

​ 位衰减——这种磁能渗漏常常存放磁盘或芯片的一个单元的二进制数据的状态,无论这种渗漏是由于降低绝缘或辐射或者是气候变化所导致。

​ 位衰减是目前硬盘数据的一种严重数据丢失问题,硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志,一项对150万块硬盘的研究表明,每90块硬盘就有1块有这种“软错误”,这个错误不但会导致数据丢失,还会导致RAID错误。

​ 针对这一问题,最新的Minio采用了HighwayHash算法计算校验和来防范位衰减,根据测试结果,其可以实现10GB/s的处理速度。

解决方案

MinIO把之前的编码块进行 HighwayHash 编码,最后要校验这个编码,以确保每个编码是正确的。

文件的修复

另外,MinIO提供了一个管理工具,可以对所有编码块进行校验,如果发现编码块有问题,再去修复它。

​ 得益于Reed-Solomon纠删码,Minio可以更加灵活的对文件进行修复,目前,Minio提供了全量、bucket、文件夹、文件等各个粒度的修复操作。

​ 相比一般的RAID方式,Minio可以在非常小的粒度下对文件进行修复操作,灵活性有了很大提高。

递归修复
1
mc admin heal -r myminio
指定桶修复
1
mc admin heal -r myminio/dev

MinIO部署

存储架构

Minio针对不同应用场景也设置了对应的存储架构

单主机,单硬盘模式

该模式下,Minio只在一台服务器上搭建服务,且数据都存在单块磁盘上,该模式存在单点风险,主要用作开发、测试等使用

img

启动的命令
1
minio server /usr/local/minio/data --console-address ":9001"
单主机,多硬盘模式

该模式下,Minio在一台服务器上搭建服务,但数据分散在多块(大于4块)磁盘上,提供了数据上的安全保障

img

启动的命令
1
minio server /usr/local/minio/data{1..4} --console-address ":9001"
多主机、多硬盘模式(分布式)

该模式是Minio服务最常用的架构,通过共享一个access_key和secret_key,在多台(2-32)服务器上搭建服务,且数据分散在多块(大于4块,无上限)磁盘上,提供了较为强大的数据冗余机制(Reed-Solomon纠删码)。

img

启动命令
1
2
3
export MINIO_ACCESS_KEY=<TENANT1_ACCESS_KEY>
export MINIO_SECRET_KEY=<TENANT1_SECRET_KEY>
minio --config-dir ~/tenant1 server --address :9001 http://192.168.10.11/data/tenant1 http://192.168.10.12/data/tenant1 http://192.168.10.13/data/tenant1 http://192.168.10.14/data/tenant1

单机单硬盘

该模式下,Minio只在一台服务器上搭建服务,且数据都存在单块磁盘上,该模式存在单点风险,主要用作开发、测试等使用

服务架构

img

服务部署
创建目录
1
mkdir -p /usr/local/minio/{data,logs}
下载文件

下载minio安装文档

1
2
cd /usr/local/minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
授权

将下载的文件变成可执行

1
chmod 755 minio
创建启动脚本

使用启动脚本启动会更简单一些

1
vi start.sh
1
nohup /usr/local/minio/minio server /usr/local/minio/data --console-address ":9001" >> /usr/local/minio/logs/minio.log 2>&1 &
启动服务
1
2
sh start.sh
ps -ef|grep minio

image-20230131143852239

查看服务

如果访问地址出现如下界面则说明启动已经成功了

1
http://192.168.245.129:9001/login

image-20230131143946026

单机多硬盘(纠删码)

该模式下,Minio在一台服务器上搭建服务,但数据分散在多块(大于4块)磁盘上,提供了数据上的安全保障,默认情况下使用使用多盘就会自动开启纠删码模式

服务架构

img

服务部署
创建目录
1
2
mkdir -p /usr/local/minio/data{1..4}
mkdir -p /usr/local/minio/logs
下载文件

下载minio安装文档

1
2
cd /usr/local/minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
授权

将下载的文件变成可执行

1
chmod 755 minio
创建启动脚本

使用启动脚本启动会更简单一些

1
vi start.sh
1
nohup /usr/local/minio/minio server /usr/local/minio/data{1..4} --console-address ":9001" >> /usr/local/minio/logs/minio.log 2>&1 &
启动服务
1
2
sh start.sh
ps -ef|grep minio

我们启动后发现服务并没有启动起来

image-20230131150151566

查看日志

我们查看下日志为什么报错

1
tail -f logs/minio.log

出现了如下的错误

image-20230131150243489

通过查找资源后,原因如下

​ minio 集群部署被强制性安装在独占的磁盘分区,不能在 root 根盘符下建立目录,如在 /usr/local/data1 等等建目录文件夹代替,会抛上述错误提示,因此可以在系统已挂载的磁盘下建 data 目录

磁盘挂载

我们发现磁盘问题后,接下来我们就用虚拟机增加多块磁盘

新增磁盘

我们通过虚拟机进行新增磁盘,先停止 VM 主机,进入设置中添加新硬盘

image-20230131150647553

创建一个虚拟磁盘用来进行演示,容量设置位5G就可以用来演示了

image-20230131150834913

接下来同样的步骤再增加三块盘,总共追加四块盘

image-20230131162459950

查看磁盘

启动虚拟机后就可以查看未使用的磁盘信息了

  • fdisk -l 显示所有使用和未使用的分区大小与簇信息

  • lsblk # 显示所有使用和未使用的分区,其中 sdb 即新扩展的未使用盘符

1
lsblk

下满选中的就是未使用的磁盘

image-20230131162712081

格式化磁盘

刚添加的磁盘需要先进行格式化后才能使用

1
2
3
4
mkfs.ext4 /dev/sdb
mkfs.ext4 /dev/sdc
mkfs.ext4 /dev/sdd
mkfs.ext4 /dev/sde

其他几个磁盘也是一样的操作,按照下面方式格式化即可

image-20230131152908910

挂载磁盘

使用mount命令来进行挂载磁盘

1
2
3
4
5
6
mount /dev/sdb /usr/local/minio/data1
mount /dev/sdc /usr/local/minio/data2
mount /dev/sdd /usr/local/minio/data3
mount /dev/sde /usr/local/minio/data4

df -h

这样我们就把磁盘挂载到了目录中了,我们查看以下磁盘信息

image-20230131162944400

启动服务

我们再次来启动服务

1
2
sh start.sh
ps -ef|grep minio

我们看到进程存在说明服务已经启动了

image-20230131150151566

查看服务

如果访问地址出现如下界面则说明启动已经成功了

1
http://192.168.245.129:9001/login

image-20230131143946026

登录后可以查看设备信息

image-20230131164434349

MinIO使用

基本使用

接下来我们讲解下MinIO如何使用

登录MinIO

我们访问如下的地址就可以登录MinIO

1
http://192.168.245.207:9001/

默认用户名密码是: minioadmin/minioadmin,登录就可以看到首页了

image-20230306184226172

创建 bucket

在浏览器中登录到 MinIO 存储系统,点击右下角创建 bucket 来存储对象

image-20230307090534387

这样我们就创建一个imagesbucket来存储图片信息

image-20230307090604597

公开资源

默认情况下不允许外部访问,需要进行配置访问策略,我们先简单的设置为公开资源,这样就可以被外部放了,我们在桶的访问你策略将private改为public

image-20230307094530939

改为public,这样外部的就可以进行修改新增操作了

image-20230307094652507

上传资源

这样,我们点击upload就可以上传一张图片了

image-20230307092140546

这样我们就成功上传一张图片

image-20230307092334325

我们还可以进行预览图片,点击图片会出现详情页面,点击Preview就可以预览图片了

image-20230307092540255

访问资源

因为我们已经将资源给设置为了公共资源我们可以进行直接访问了

​ 我们只需要按照http://${MINIO_HOST}:${MINIO_PORT}/${bucketName}/${fileName}规则就可以访问到资源,(不需要进行分享操作)

image-20230307094955303

验证纠删码

使用多盘模式后自动就会开启纠删吗模式

创建桶

对象存储需要先创建一个桶

image-20230131165117420

我们创建了一个bucket的桶

image-20230131165150293

上传图片

我们上传一些文件来验证以下纠删码模式,我们进入对象预览页面

image-20230131165326040

点击桶名称就可以进入桶就可以上传图片了

image-20230131165357465

点击上传按钮上传文件我们就可以上传图片了

image-20230131165616827

查看目录结构

我们通过tree命令来看以下文件的目录结构

1
tree data{1..4}

我们看到目录的存储结构如下,以及目录的含义

image-20230131170804080

删除单个文件

因为多盘采用了纠删码模式,我们可以大胆删除,只要删除的驱动(目录)个数小于 N/2,都可以保证文件被恢复,只要删除的驱动(目录)个数小于 N/2,都可以保证文件被恢复

1
rm -rf /usr/local/minio/data1/bucket/

image-20230131171300043

我们登录管理界面查看图片信息,我们发现图片还是存在的,说明不影响使用

image-20230131171337483

我们稍等一会,会发现目录自动修复了

1
ll -h

image-20230131171546931

删除两个文件

下面我们来验证下删除两个文件

1
2
rm -rf /usr/local/minio/data{1..2}/bucket/
tree /usr/local/minio/data{1..2}

我们发现文件都已经被删除了

image-20230131171707215

我们发现图片信息依然可以正常查看

image-20230131171752231

删除三个文件

下面我们来验证下删除两个文件

1
2
rm -rf /usr/local/minio/data{1..3}/bucket/
tree /usr/local/minio/data{1..4}

我们发现文件都3/4的文件已经被删除了

image-20230131172815435

我们发现图片文件已经不存在了

image-20230131172914531

MinIO权限设置

MinIO权限类型

MinIO默认有三种访问权限

image-20230307100827448

public

所有人都可以访问该桶的资源,包括桶内的文件内容和文件目录

private

桶设置为private后,未经授权不能进行任何操作,所有Access Rules失效

​ 所有人都无法直接访问该桶的资源,如果外部需要访问,只能通过外链(最长有效期7天)

custom

这种Access Policy策略是通过如下自定义Access Rules出现的

readonly

可以设置资源不经过授权,只能读取

readwrite

资源不经过授权,只能写入

writeonly

资源不经过授权,可读可写

设置用户策略

策略概念及语法

策略(policy):IAM(Identity and Access Management)最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。

​ 基于策略的授权是一种更加灵活的授权方式,能够满足企业对权限最小化的安全管控要求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::testpolicy1/*"
]
}
]
}
策略参数

一下是策略常用的一些参数

参数 说明
Version 标识策略的版本号,Minio中一般为”2012-10-17”
Statement 策略授权语句,描述策略的详细信息,包含Effect(效果)、Action(动作)、Principal(用户)、Resource(资源)和Condition(条件)。其中Condition为可选
Effect Effect(效果)作用包含两种:Allow(允许)和Deny(拒绝),系统预置策略仅包含允许的授权语句,自定义策略中可以同时包含允许和拒绝的授权语句,当策略中既有允许又有拒绝的授权语句时,遵循Deny优先的原则。
Action Action(动作)对资源的具体操作权限,格式为:服务名:资源类型:操作,支持单个或多个操作权限,支持通配符号*,通配符号表示所有。例如 s3:GetObject ,表示获取对象
Resource Resource(资源)策略所作用的资源,支持通配符号,通配符号表示所有。在JSON视图中,不带Resource表示对所有资源生效。Resource支持以下字符:-_0-9a-zA-Z./\,如果Resource中包含不支持的字符,请采用通配符号。例如:arn:aws:s3:::my-bucketname/myobject\,表示minio中my-bucketname/myobject目录下所有对象文件。
Condition Condition(条件)您可以在创建自定义策略时,通过Condition元素来控制策略何时生效。Condition包括条件键和运算符,条件键表示策略语句的Condition元素,分为全局级条件键和服务级条件键。全局级条件键(前缀为g:)适用于所有操作,服务级条件键(前缀为服务缩写,如obs:)仅适用于对应服务的操作。运算符与条件键一起使用,构成完整的条件判断语句。
系统默认策略
权限 描述
consoleAdmin 控制台管理员
diagnostics 诊断
readonly 只读
readwrite 读写
writeonly 只写

评论