MinIO对象存储
对象存储
随着互联网的高速发展,我们会面对越来越多海量非结构化数据的存储需求,在这样的背景下,对象存储解决方案为我们文件的存取提供了很大的便利和保障
为什么引入对象存储
我们知道,在很长的一段时间里,这三种架构几乎统治了数据存储市场,所有行业用户的数据存储需求,都是在这三者中进行选择
然而,随着时代的发展,一种新的数据存储形态诞生,开始挑战前面三者的垄断地位,没错,它就是云计算时代存储技术的新网红——对象存储。
对象存储,也称为“面向对象的存储”,英文是Object-based Storage,现在很多云厂商,也直接称之为“云存储”。
存储发展趋势
20世纪末,随着互联网的爆发,数据存储需求发生了两个重大的变化。
数据量爆炸式增长
Web应用的崛起、社交需求的刺激,极大地推动了多媒体内容的创作和分享,人们开始上传大量的照片、音乐、视频,加剧了数据量的爆发,此外,信息技术的发展、企业数字化的落地,也产生了大量的数据,不断吞食着存储资源。
非结构化数据的占比显著增加
什么是非结构化数据?举个例子大家就明白了,我们经常做的excel表格,姓名、身高、体重、年龄、性别,这种用二维表结构可以进行逻辑表达的数据,就是结构化数据,而图像、音频、视频、word文章、演示胶片这样的数据,就是非结构化数据
根据此前的预测,到2020年,全球数据总量的80%,将是非结构化数据,面对这两大趋势,因为本身技术和架构的限制,DAS、SAN和NAS无法进行有效应对。
三种存储技术
下面我们来看下最常见的三种存储技术
块存储
块存储像是一块块硬盘直接挂载在主机上,以卷或硬盘形式体现,对于存储的数据内容和格式一无所知,只关心读取和写入,不关心关系和用途,数据按字节来访问,性能很高,但是太偏向于底层,不利于扩展,常见的有DAS(直连式存储)、SAN(存储区域网络)。
- DAS是指将存储设备通过SCSI接口直接连接到一台服务器上使用,存储介质直接挂载到内部总线上,数据存储是整个服务器结构的一部分。
- SAN是通过高速网络将一个或多个存储设备和服务器连接起来的专用存储系统,可以把SAN理解成一个网络,里面包含着磁盘阵列、交换机等各种元素。
存储协议
块存储,操作对象是磁盘,存储协议是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 等,看出来了吧?接口命令非常简洁,没有那种目录树的概念,在对象存储系统里,你不能直接打开/修改文件,只能先下载、修改,再上传文件。
对象存储
对象存储是用来描述解决和处理离散单元的方法的通用术语,对象在一个层结构中不会再有层级结构,是以扩展元数据为特征的
对象存储结构
对象存储呈现出来的是一个“桶”(bucket),你可以往“桶”里面放“对象(Object)”,这个对象包括三个部分:Key、Data、Metadata。
Key
可以理解文件名,是该对象的全局唯一标识符(UID)
Key是用于检索对象,服务器和用户不需要知道数据的物理地址,也能通过它找到对象,这种方法极大地简化了数据存储,看上去就是一个URL网址。如果该对象被设置为“公开”,所有互联网用户都可以通过这个地址访问它。
Data
也就是用户数据本体。
Metadata
Metadata叫做元数据,它是对象存储一个非常独特的概念,元数据有点类似数据的标签,标签的条目类型和数量是没有限制的,可以是对象的各种描述信息。
举个例子,如果对象是一张人物照片,那么元数据可以是姓名、性别、国籍、年龄、拍摄地点、拍摄时间等。
在传统的文件存储里,这类信息属于文件本身,和文件一起封装存储,而对象存储中,元数据是独立出来的,并不在数据内部封装,元数据的好处非常明显,可以大大加快对象的排序,还有分类和查找。
对象存储的架构
对象存储的架构是怎样的呢?如下图所示,分为3个主要部分:
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 编程语言开发的一款高性能的分布式式存储方案的开源项目,有十分完善的官方文档,官网文档地址:docs.min.io/cn/
高性能
MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。
对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。 MinIO用作云原生应用程序的主要存储,与传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟,而这些都是MinIO能够达成的性能指标。
可扩展性
MinIO利用了Web缩放器的来之不易的知识,为对象存储带来了简单的缩放模型。
据有 “简单可扩展”的特点, 在 MinIO,扩展从单个群集开始,该群集可以与其他MinIO群集联合以创建全局名称空间, 并在需要时可以跨越多个不同的数据中心, 通过添加更多集群可以扩展名称空间,,更多机架,直到实现目标。
云的原生支持
MinIO 是在过去4年的时间内从0开始打造的一款软件 ,符合一切原生云计算的架构和构建过程,并且包含最新的云计算的全新的技术和概念。
其中包括支持Kubernetes 、微服和多租户的的容器技术。使对象存储对于 Kubernetes更加友好。
支持全面
目前MinIO支持市面主流的开发语言并且可以通过SDK快速集成快速集成使用。
AWS S3标准兼容
亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准
MinIO 在很早的时候就采用了 S3 兼容协议,并且MinIO 是第一个支持 S3 Select 的产品. MinIO对其兼容性的全面性感到自豪, 并且得到了 750多个组织的认同, 包括Microsoft Azure使用MinIO的S3网关 - 这一指标超过其他同类产品的总和。
非常简单
极简主义是MinIO的指导性设计原则,简单性减少了出错的机会,提高了正常运行时间,提供了可靠性,同时简单性又是性能的基础
只需下载一个二进制文件然后执行,即可在几分钟内安装和配置MinIO,配置选项和变体的数量保持在最低限度,这样让失败的配置概率降低到接近于0的水平,MinIO升级是通过一个简单命令完成的,这个命令可以无中断的完成MinIO的升级,并且不需要停机即可完成升级操作 - 降低总使用和运维成本。
开放全部源代码 + 企业级支持
MinIO 基于Apache V2 license 100% 开放源代码
这就意味着 MinIO的客户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。 此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。
管理界面的支持
MinIO服务安装后,可以直接通过浏览器登录系统,完成文件夹、文件的管理,非常方便使用。
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。
MIINO如何写入对象?
MINIO 是通过数据编码,将原来的数据编码成 N 份,N 就是一个 Set 上面 Drive 的数量,后面多次提到的 N 都是指这个意思,上图中,一个 Set 上面 Drive 的数量,是3。
对象被编码成N份之后,把每一份,写到对应的 Drive 上面,这就是把一个对象存储在整个 Set 上。
一个集群包含多个 Set,每个对象最终存储在哪个 Set 上是根据对象的名称进行哈希,然后影射到唯一的 Set 上面,这个方式从理论上保证数据可以均匀的分布到所有的 Set 上。
根据的观测,数据分布的也非常均匀,一个 Set 上包含多少个 Drive 是由系统自动根据集群规模算出来的,当然,也可以自己去配置,一个 Set 的 Drive 系统会考虑尽可能把它放在多的节点上面,保证它的可靠性。