精华内容
下载资源
问答
  • 对象存储

    千次阅读 2018-09-01 22:21:45
    对象存储到底是个什么鬼 对象存储到底是个什么鬼 小小河 2016-7-23   存储圈真会玩,块存储、文件存储、混合存储,今年又火了一个对象存储。银行,公安局,各大单位一言不合就换成对象存...

    对象存储到底是个什么鬼

    对象存储到底是个什么鬼

    小小河

    2016-7-23

     

    存储圈真会玩,块存储、文件存储、混合存储,今年又火了一个对象存储。银行,公安局,各大单位一言不合就换成对象存储,有时候真怀疑IT部门的单身狗只是单纯地看上“对象”这两个字了。因为有很多人在问:对象存储的定义是什么?什么叫做对象存储?

    对象存储(Object Storage)的始作俑者是亚马逊2006年推出的S3(Simple Storage Service),此后新老厂商一窝蜂地推出各种产品,形态各异,但都号称对象存储。亚马逊没有给出一个定义,也没有看到有业界普通接受的说法,码农也是从自己角度各说各话,夹杂着成堆的缩写名词。

    各家产品差异较大,因此从实现技术上定义对象存储比较困难。但从应用场景上理解就相当简单,它的特征如下。

    远程访问。对象存储为云计算而生,存储设备在数据中心,用户遍布世界各地,必须通过互连网访问。最好的广域网访问当然是http了,实际上S3协议就是在http的基础上定义的。传统的块存储要求与达客户端之间的延时很小(例如1 ms),因此使用线缆直连或者专用低延时网络连接,相距很近。文件存储称微放松对延时的要求,但仍要求存储设备与客户端位于同一个网段,即一个局域网之内,也不能距离太远。

    海量用户。云计算公司至少要计划支持上亿用户吧,否则也太没出息了。各个用户之间还要能够相互授权,例如小红把自己的视频授权给小军看,存储系统要保证其它用户看不到,否则会泄露隐私。传统文件存储也有多租户功能,但它支持的用户数量较少,撑死几千几万个,而且不能把一个文件的权限分享给相互独立的若干个用户。

    无限扩容。海量用户自然带来海量的数据,云计算公司自然不到傻到一次采购大量的设备,总是随着数据的增长持续扩容。多大容量是个头呢?没头,永远用不完,无限。相应地,支持的文件数量也要无限个。

    廉价。传统存储基本都采用定制硬件,而且厂商故意模糊硬件信息,黑盒子一样,比价困难。银行、电信运营商等单位的数据价值密度高,还土豪不差钱,买得起。而存到云上的数据(视频、照片等)价值密度很低,例如,视频监控数据在不出事的时候就是垃圾。没人会为存放这些数据花大价钱,也花不起。因此,对象存储想尽办法降低成本。

     

    这四个根本特征共同定义了对象存储。如果非要用一句话来概括,那么我希望是:对象存储是支持海量用户远程访问的无限容量廉价存储系统。

     

    从根本特征出发,就能推导出各种表象。

    扁平目录结构。数据中心的服务器成千上万台,可能每天都有服务器出故障,会频繁更换设备。如果采用传统的树形目录↓↓↓,一台设备损坏或者扩容时,就需要将巨型目录树中的数据重新分配均衡,实施起来很复杂。索性大幅简化,只保留二级目录结构↓↓↓:根下直接就是桶(bucket,对应Windows下的文件夹),桶中直接存放对象(object,对应Windows下的文件),桶中不能再建桶(禁止多层文件夹)。这样以来,元数据结构十分简单,移动方便。

    对象存储到底是个什么鬼
    对象存储到底是个什么鬼

    传输加密:跨越广域网,防止被窃听。

    重复数据删除:可能很多用户都上传了同一部电影,只保留一份即可,节省存储空间。

    计费信息:云计算公司费这么大劲,为的不就是挣钱吗?

    通用服务器:出货量大,竞争激烈,价格低,省成本。

    分区下电:省电费。

    支持NAS/HDFS接口:兼容老的应用软件,使用户业务更容易迁到云端;便于在云端就近做大数据分析。

    存储端加密:防止数据被盗,打消客户的安全顾虑。

     

    剥掉唬的人术语,技术其实挺简单的,你说呢?


    21

    0

    阅读 (10287) 评论 (0) 收藏 (1) 转载 (0) 喜欢 打印 举报
    已投稿到:

    转载列表:

      转载

      转载是分享博文的一种常用方式…

      点击加载更多
      发评论
      展开全文
    • 三种存储类型:块存储、文件存储、对象存储

      千次阅读 多人点赞 2020-11-02 10:21:27
      ... ... 存储类型 先从三种存储类型开始。...看了很多文章,感觉都无从下手,因为我还不了解为什么有这么多的存储方式和存储类型,所以先不看这些概念的定义,先了解为什么会有这些概念。 为什么会有这么多存储

      链接:

      https://www.zhihu.com/question/21536660

      https://www.cnblogs.com/hukey/p/8323853.html

      https://www.cnblogs.com/sylar5/p/11520149.html

      https://juejin.im/post/6844903541169979400

      存储类型

      先从三种存储类型开始。

      看了很多文章,感觉都无从下手,因为我还不了解为什么有这么多的存储方式和存储类型,所以先不看这些概念的定义,先了解为什么会有这些概念。

      为什么会有这么多存储类型?

      因为业务需要,不同场景需要满足不同的人,其实有很多存储类型可以用,三种只是常见的。就像有很多种编程语言,没有优劣之分,只是在各自领域里各司其职

      三种存储类型有什么区别?

      这个本来该了解了三种存储类型得具体含义后再说,但我觉得知乎上的答案说的很好:这三者的本质差别是使用数据的“用户”不同:块存储的用户是可以读写块设备的软件系统,例如传统的文件系统、数据库;文件存储的用户是自然人;对象存储的用户则是其它计算机软件。

      先说分布式存储:

      知乎:首先要说明一下的是,这三个概念都是分布式存储中的概念,由不同的网络存储协议实现。

      所谓分布式存储,就是底层的存储系统,因为要存放的数据非常多,单一服务器所能连接的物理介质是有限的,提供的IO性能也是有限的,所以通过多台服务器协同工作,每台服务器连接若干物理介质,一起为多个系统提供存储服务。为了满足不同的访问需求,往往一个分布式存储系统,可以同时提供文件存储、块存储和对象存储这三种形式的服务。

      来个通俗易懂的理解,用不同的存储类型存储玉米:

      块存储

      块存储一般体现形式是卷或者硬盘(比如windows里面看到的c盘),数据是按字节来访问的,对于块存储而言,对里面存的数据内容和格式是完全一无所知的。好比上面图中,数据就像玉米粒一样堆放在块存储里,块存储只关心玉米粒进来和出去,不关心玉米粒之间的关系和用途。

      块存储只负责数据读取和写入,因此性能很高,适用于对响应时间要求高的系统。比如数据库等。

      文件存储

      文件存储一般体现形式是目录和文件(比如C:\Users\Downloads\text.doc),数据以文件的方式存储和访问,按照目录结构进行组织。文件存储可以对数据进行一定的高级管理,比如在文件层面进行访问权限控制等。好比上面图中,数据像玉米粒一样组成玉米棒子,再对应到不同的玉米杆上,要找到某个玉米粒,先找到玉米杆,再找到玉米棒子,然后根据玉米粒在玉米棒子上的位置找到它。

      文件存储可以很方便的共享,因此用途非常广泛。比如常用的NFS、CIFS、ftp等都是基于文件存储的。

      对象存储

      对象存储一般体现形式是一个UUID(比如https://www.youtube.com/watch?v=nAKxJbcec8U),数据和元数据打包在一起作为一个整体对象存在一个超大池子里。对于对象访问,只需要报出它的UUID,就能立即找到它,但访问的时候对象是作为一个整体访问的。好比上面图中,数据的玉米粒被做成了玉米罐头,每个玉米罐头都有一个唯一出厂号,但是买卖罐头,都一次是一盒为单位。

      从设计之初衷(一般的对象存储都是基于哈希环之类的技术来实现),对象存储就可以非常简单的扩展到超大规模,因此非常适合数据量大、增速又很快的视频、图像等。

       

      块存储

      传统的文件系统,是直接访问存储数据的硬件介质的。介质不关心也无法去关心这些数据的组织方式以及结构,因此用的是最简单粗暴的组织方式:所有数据按照固定的大小分块,每一块赋予一个用于寻址的编号。以大家比较熟悉的机械硬盘为例,一块就是一个扇区,老式硬盘是512字节大小,新硬盘是4K字节大小。老式硬盘用柱面-磁头-扇区号(CHS,Cylinder-Head-Sector)组成的编号进行寻址,现代硬盘用一个逻辑块编号寻址(LBA,Logical Block Addressing)。所以,硬盘往往又叫块设备(Block Device),当然,除了硬盘还有其它块设备,例如不同规格的软盘,各种规格的光盘,磁带等。

      至于哪些块组成一个文件,哪些块记录的是目录/子目录信息,这是文件系统的事情。不同的文件系统有不同的组织结构,这个就不展开了。为了方便管理,硬盘这样的块设备通常可以划分为多个逻辑块设备,也就是我们熟悉的硬盘分区(Partition)。反过来,单个介质的容量、性能有限,可以通过某些技术手段把多个物理块设备组合成一个逻辑块设备,例如各种级别的RAID,JBOD,某些操作系统的卷管理系统(Volume Manager)如Windows的动态磁盘、Linux的LVM等。

      块设备的使用对象除了传统的文件系统以及一些专用的管理工具软件如备份软件、分区软件外,还有一些支持直接读写块设备的软件如数据库等,但一般用户很少这样使用。

      在网络存储中,服务器把本地的一个逻辑块设备——底层可能是一个物理块设备的一部分,也可能是多个物理块设备的组合,又或者多个物理块设备的组合中的一部分,甚至是一个本地文件系统上的一个文件——通过某种协议模拟成一个块设备,远程的客户端(可以是一台物理主机,也可以是虚拟机,某个回答所说的块设备是给虚拟机用是错误的)使用相同的协议把这个逻辑块设备作为一个本地存储介质来使用,划分分区,格式化自己的文件系统等等。这就是块存储,比较常见的块存储协议是iSCSI。

      优点

      • 这种方式的好处当然是因为通过了Raid与LVM等手段,对数据提供了保护;
      • 可以将多块廉价的硬盘组合起来,称为一个大容量的逻辑盘对外提供服务,提高了容量;
      • 写入数据时,由于是多块磁盘组合出来的逻辑盘,所以几块硬盘可以并行写入的,提升了读写效率;
      • 很多时候块存储采用SAN架构组网,传输速度以及封装协议的原因,使得传输速度和读写效率得到提升

      缺点

      • 采用SAN架构组网时,需要额外为主机购买光纤通道卡,还要购买光纤交换机,造价成本高;
      • 主机之间数据无法共享,在服务器不做集群的情况下,块存储裸盘映射给主机,在格式化使用后,对于主机来说相当于本地盘,那么主机A的本地盘根本不能给主机B去使用,无法共享数据
      • 不利于不同操作系统主机间的数据共享:因为操作系统使用不同的文件系统,格式化后,不同的文件系统间的数据是共享不了的。 例如一台win7,文件系统是FAT32/NTFS,而linux是EXT4,EXT4是无法识别NTFS的文件系统的

      使用场景

      docker容器、虚拟机磁盘存储分配。
      日志存储。
      文件存储。

      典型设备

      磁盘阵列、硬盘

      典型存储方式

      • DAS(Direct Attach STorage):是直接连接于主机服务器的一种储存方式,每一台主机服务器有独立的储存设备,每台主机服务器的储存设备无法互通,需要跨主机存取资料时,必须经过相对复杂的设定,若主机服务器分属不同的操作系统,要存取彼此的资料,更是复杂,有些系统甚至不能存取。通常用在单一网络环境下且数据交换量不大,性能要求不高的环境下,可以说是一种应用较为早的技术实现。
      • SAN(Storage Area Network):是一种用高速(光纤)网络联接专业主机服务器的一种储存方式,此系统会位于主机群的后端,它使用高速I/O 联结方式, 如 SCSI, ESCON 及 Fibre- Channels。一般而言,SAN应用在对网络速度要求高、对数据的可靠性和安全性要求高、对数据共享的性能要求高的应用环境中,特点是代价高,性能好。例如电信、银行的大数据量关键应用。它采用SCSI 块I/O的命令集,通过在磁盘或FC(Fiber Channel)级的数据访问提供高性能的随机I/O和数据吞吐率,它具有高带宽、低延迟的优势,在高性能计算中占有一席之地,但是由于SAN系统的价格较高,且可扩展性较差,已不能满足成千上万个CPU规模的系统。

      文件存储

      文件存储的用户是自然人,最容易理解。计算机中所有的数据都是0和1,存储在硬件介质上的一连串的01组合对我们来说完全无法去分辨以及管理。因此我们用“文件”这个概念对这些数据进行组织,所有用于同一用途的数据,按照不同应用程序要求的结构方式组成不同类型的文件(通常用不同的后缀来指代不同的类型),然后我们给每一个文件起一个方便理解记忆的名字。而当文件很多的时候,我们按照某种划分方式给这些文件分组,每一组文件放在同一个目录(或者叫文件夹)里面,当然我们也需要给这些目录起一个容易理解和记忆的名字。而且目录下面除了文件还可以有下一级目录(称之为子目录或者子文件夹),所有的文件、目录形成一个树状结构。我们最常用的Windows系统中,打开资源管理器就可以看到以这种方式组织起来的无数个文件和目录。

      为了方便查找,从根节点开始逐级目录往下,一直到文件本身,把这些目录、子目录、文件的名字用特殊的字符(例如Windows/DOS用“\”,类Unix系统用“/”)拼接起来,这样的一串字符称之为路径,例如Linux中的“/etc/systemd/system.conf”或者Windows中的“C:\Windows\System32\taskmgr.exe”。人类用路径作为唯一标识来访问具体的文件。而由作为自然人的程序员所编写的各种软件程序,绝大部分也使用这种方式来访问文件。

      把存储介质上的数据组织成目录-子目录-文件这种形式的数据结构,用于从这个结构中寻找、添加、修改、删除文件的程序,以及用于维护这个结构的程序,组成的系统有一个专用的名字:文件系统(File System)。文件系统有很多,常见的有Windows的FAT/FAT32/NTFS,Linux的EXT2/EXT3/EXT4/XFS/BtrFS等。而在网络存储中,底层数据并非存储在本地的存储介质,而是另外一台服务器上,不同的客户端都可以用类似文件系统的方式访问这台服务器上的文件,这样的系统叫网络文件系统(Network File System),常见的网络文件系统有Windows网络的CIFS(也叫SMB)、类Unix系统网络的NFS等。而文件存储除了网络文件系统外,FTP、HTTP其实也算是文件存储的某种特殊实现,都是可以通过某个url来访问一个文件。

      优点

      • 造价低:随便一台机器就可以,另外普通的以太网就可以,根本不需要专用的SAN网络,所以造价低
      • 方便文件共享

      缺点

      • 读写速率低,传输速率慢:以太网,上传下载速度较慢
      • 所有读写都要1台服务器里面的硬盘来承受,相比起磁盘阵列动不动就十几上百块硬盘同时读写,速率慢了许多。

      使用场景

      日志存储。
      有目录结构的文件存储。

      典型设备

      FTP、NFS服务器

      典型存储方式

      • 通常,NAS产品都是文件级存储。NAS(Network Attached Storage):是一套网络储存设备,通常是直接连在网络上并提供资料存取服务,一套 NAS 储存设备就如同一个提供数据文件服务的系统,特点是性价比高。例如教育、政府、企业等数据存储应用。它采用NFS或CIFS命令集访问数据,以文件为传输协议,通过TCP/IP实现网络化存储,可扩展性好、价格便宜、用户易管理,如目前在集群计算中应用较多的NFS文件系统,但由于NAS的协议开销高、带宽低、延迟大,不利于在高性能集群中应用。

      对象存储

      之所以出现对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一个读写块,利于共享的存储出来呢?于是就有了对象存储。

      一个文件包含了属性(术语:metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(数据)。
          像FAT32这种文件系统,是直接将一份文件与metadata一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(例如4M的文件,假设文件系统要求一个块4K,那么就将文件打散称为1000个小块),再写进硬盘里,过程中没有区分数据和metadata的。而每个块最后会告知你下一个要读取的块地址,然后一直这样顺序的按图索骥,最后完成整份文件的所有块的读取。
          这种情况下读写速率很慢,因为就算你有100个机械臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有1个机械臂在实际工作。

      而对象存储则将元数据独立出来了,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息)而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪里OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。
          这时候由于是3台OSD同时对外传输数据,所以传输的速度就会加快了,当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。
          另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在共享方面的困难了,也解决了文件共享方面的问题
          所以对象存储的出现,很好的结合了块存储和文件存储的优点。

      为什么对象存储兼具块存储和文件存储的好处,还要使用块存储和文件存储呢?

          (1)有一类应用是需要存储直接裸盘映射的,例如数据库。因为数据需要存储楼盘映射给自己后,再根据自己的数据库文件系统来对裸盘进行格式化的,所以是不能够采用其他已经被格式化为某种文件系统的存储的。此类应用更合适使用块存储。
          (2)对象存储的成本比起普通的文件存储还要较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。

      优点

      • 具备块存储的读写高速。
      • 具备文件存储的共享等特性。
      • 可扩展性高:对象存储能够扩展数十乃至数百EB的容量,能够充分利用高密度存储;
      • 效率高:扁平化结构,不受复杂目录系统对性能的影响;
      • 无需迁移:对象存储是一种横向扩展系统,随着容量的增加,数据根据算法自动分布于所有的对象存储节点;
      • 安全性高:对象存储通常凭借HTTP调用对象存储本身提供的认证密钥来提供数据访问;
      • 访问方便:不光支持HTTP(S)协议,采用REST的API方式调用和检索数据,同样增加了NFS和SMB支持;
      • 成本相对低:与块存储方式相比,对象存储是最具成本效益的数据存储类型,并且与云计算搭配,把对象存储的这一特性发挥的淋漓尽致。

      缺点

      • 最终一致性:由于不同节点的位置不同,数据同步时可能会有一定时间的延迟或者错误;
      • 不易做数据库:对象存储比较适合存储那些变动不大甚至不变的文件,而对于像数据库这种需要直接与存储裸盘相互映射的应用,还是块存储更合适。

      使用场景

      对象存储服务OSS(英文Object Storage Service)主要应用于以下场景。

      • 图片和音视频等应用的海量存储。OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。OSS支持流式写入和文件写入两种方式
      • 网页或者移动应用的静态和动态资源分离。利用BGP带宽,OSS可以实现超低延时的数据直接下载。也可以配合阿里云CDN加速服务,为图片、音视频、移动应用的更新分发提供最佳体验
      • 云端数据处理。上传文件到OSS后,可以配合媒体转码服务(MTS)和图片处理服务(IMG)进行云端的数据处理。

      典型设备

      内置大容量硬盘的分布式服务器。对象存储最常用的方案,就是多台服务器内置大容量硬盘,再装上对象存储软件,然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。管理节点可以管理其他服务器对外提供读写访问功能。

      典型存储方式

      (网上找到的对象存储的技术挺多的,存储方式我没找到。。)

      三种存储类型的差异:

       

      展开全文
    • 对象存储简介

      千次阅读 多人点赞 2020-06-20 14:13:31
      对象存储简介 一 导读 计算机系统是图灵机的高效实现,即根据输入数据的规则得到输出数据。现在的计算机系统由CPU、内存、总线、外设(如网络设备、存储设备)等组成,其中,存储是非常重要的一部分。 近年来,...

      一 导读

      如今云计算、大数据发展得如火如荼,PB容量单位早已经进入国内企业存储采购单,DT时代即将来临。Ceph对象存储的优秀特性吸引越来越多开发者,本文对Ceph对象存储进行架构详解。

      二 对象存储

       

      文件存储,通常指的是遵循POSIX协议,同时具备并行化访问和冗余机制的存储方式,现在也将非POSIX协议的GFS、HDFS、FastDFS等归为文件存储。同时文件存储引进了目录,十分类似我们平时Windows的文件结构,当单个目录文件数量过大时,文件查找效率会急剧下降。

      对象存储是在文件存储的基础上发展而来的,对象存储抛弃了文件存储的命名空间、文件目录等结构。对象存储相比文件存储更加简洁,抛弃了命名空间、文件目录等结构,更加扁平化,在使用、扩展、维护方面更加符合大众化思想。操作主体由文件变为对象,对象的操作主要以Put、Get和Delete为主,十分类似Java的HashMap,只不过对象存储中的对象不支持修改。总体来说,对象存储是为了克服文件存储的缺点,并发挥文件存储的优点而出现的。但对于存储内容而言,文件存储和对象存储并无本质区别,只是存储方式发生了变化。

      三 Ceph

      Ceph是一个去中心化、强一致性、易扩展性的分布式对象存储系统,并消除了对系统单一中心节点的依赖,从而实现了真正的无中心结构的设计思想,这也是其他分布式存储系统不能比的。目前业界自研商业存储例如阿里云存储、华为云存储、七牛云存储等或多或少都借鉴Ceph的设计思想和物理架构。

      3.1 设计思想

      Ceph最初针对的应用场景,就是大规模的、分布式的存储系统。所谓大规模和分布式,至少是能够承载PB级别的数据和成千上万的存储节点组成的存储集群

      如今云计算、大数据发展得如火如荼,PB容量单位早已经进入国内企业存储采购单,DT时代即将来临。Ceph起源于2004年,那是一个商用处理器以单核为主流,常见硬盘容量只有几十GB的年代。当时SSD也没有大规模商用,正因如此,Ceph之前版本对SSD的支持不是很好,发挥不了SSD的性能。如今Ceph高性能面临的最大挑战正是这些历史原因,目前社区和业界正在逐步解决这些性能上的限制。Ceph的技术特性,总体表现在集群可靠性、集群扩展性、数据安全性、接口统一性4个方面。

      3.1.1 集群可靠性

      所谓可靠性,首先从用户角度来说数据是第一位的,要尽可能保证数据不会丢失。其次,就是数据写入过程中的可靠性,在用户将数据写入Ceph存储系统的过程中,不会因为意外情况出现而造成数据丢失。最后,就是降低不可控物理因素的可靠性,避免因为机器断电等不可控物理因素而产生的数据丢失。

      3.1.2 集群扩展性

      这里的可扩展概念是广义的,既包括系统规模和存储容量的可扩展,也包括随着系统节点数增加的聚合数据访问带宽的线性扩展。

      3.1.3 数据安全性

      所谓数据安全性,首先要保证由于服务器死机或者是偶然停电等自然因素的产生,数据不会丢失,并且支持数据自动恢复,自动重平衡等。总体而言,这一特性既保证了系统的高度可靠和数据绝对安全,又保证了在系统规模扩大之后,其运维难度仍能保持在一个相对较低的水平。

      3.1.4 接口统一性

      所谓接口统一性,指的是Ceph可以同时支持3种存储,即块存储、对象存储和文件存储,Ceph支持市面上所有流行的存储类型。严格来说,Ceph只支持对象存储,块存储和文件存储也是借助对象存储来实现的。

      根据Ceph的技术特性,可以总结出Ceph的设计思路,概述为两点:充分发挥存储本身计算能力和去除所有的中心点。充分发挥存储设备自身的计算能力:其实就是采用廉价的设备和具有计算能力的设备(最简单的例子就是普通的服务器)作为存储系统的存储节点。当前阶段只是将这些服务器当做功能简单的存储节点,从而产生资源过度浪费(如同虚拟化的思想一样,都是为了避免资源浪费)。而如果充分发挥节点上的计算能力,则可以实现前面提出的技术特性。这一点成为了Ceph系统设计的核心思想。去除所有的中心点:如果系统中出现中心点,一方面会引入单点故障,另一方面也必然面临着当系统规模扩大时的可扩展性和性能瓶颈。除此之外,如果中心点出现在数据访问的关键路径上,也必然导致数据访问的延迟增大。虽然在大多数存储软件实践中,单点故障点和性能瓶颈的问题可以通过为中心点增加HA或备份加以缓解,但Ceph系统最终采用CRUSH、Hash环等方法更彻底地解决了这个问题。

      3.2 架构设计

      Ceph底层核心是RADOS,整体架构如下图。

      3.2.1 RADOS

      RADOS具备自我修复等特性,提供了一个可靠、自动、智能的分布式存储,是Ceph存储集群的基础。Ceph中的一切都以对象的形式存储,而RADOS就负责存储这些对象,而不考虑它们的数据类型。RADOS确保数据一致性和可靠性,对于数据一致性,它执行数据复制、故障检测和恢复,还包括数据在集群节点间的Recovery。

      OSD,数据存储单元,主要功能包括数据存储、数据复制、数据恢复、数据回补、数据平衡等功能,并将一些相关数据提供给Monitor,例如OSD心跳等。一般情况下,一块磁盘对于一个OSD。对于整个存储集群,需要多个OSD,只有当OSD数量足够多时,Ceph的虚随机算法才能实现数据均匀分布。

      Monitor,监视器,主要功能是维护整个集群健康状态,提供一致性决策。Ceph需要多个Monitor组成小集群,它们通过Paxos同步数据,用来保存OSD的元数据。Monitor同时维护着Ceph集群中的各种Map图,比如OSD Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和ObjectId等计算出数据最终存储的位置。

      3.2.2 LIBRADOS

      对RADOS进行抽象和封装,简化访问RADOS的一种方法,并向上层提供API,以便直接基于RADOS进行应用开发,API目前支持PHP、Ruby、Java、Python、C和C++语言。它提供了Ceph 存储集群的一个本地接口RADOS ,并且是其他服务(如RBD 、RGW)的基础,以及为Ceph FS提供POSIX接口。LIBRADOS API支持直接访问RADOS ,使得开发者能够创建自己的接口来访问Ceph集群存储。

      3.2.3 RBD

      Ceph块设备,对外提供块存储。可以像磁盘一样被映射、格式化已经挂载到服务器上,支持快照,常用于虚拟化场景。

      3.2.4 RGW

      提供与Amazon S3和Swift兼容的RESTful API的网关,以供相应的对象存储应用开发使用。RGW提供的API抽象层次更高,但在类S3或Swift LIBRADOS的管理比便捷,因此,开发者应针对自己的需求选择使用。

      3.2.5 Ceph FS

      提供了一个任意大小且兼容POSlX的分布式文件系统(类似TFS、HDFS、FastDFS等文件系统),Ceph FS依赖元数据服务Ceph MDS来跟踪文件层次结构。

      3.3 智能分布

      数据分布是分布式存储系统的一个重要部分,数据分布算法至少要考虑以下3个因素。故障隔离:同份数据的不同副本分布在不同的故障域,降低数据损坏的风险。负载均衡:数据能够均匀地分布在磁盘容量不等的存储节点,避免部分节点空闲,部分节点超载,从而影响系统性能。数据迁移:控制节点加入离开时引起的数据迁移量。当节点离开时,最优的数据迁移是只有离线节点上的数据被迁移到其他节点,而正常工作的节点的数据不会发生迁移。

      对象存储中一致性Hash和CRUSH算法是使用比较多的数据分布算法。在Aamzon的Dyanmo键值存储中采用一致性Hash算法,并且对它做了很多优化。OpenStack的Swift对象存储中也使用了一致性Hash算法。

      CRUSH(Controlled Replication Under Scalable Hashing)是一种基于伪随机控制数据分布、复制的算法。Ceph是为大规模分布式存储系统(PB级的数据和成百上千台存储设备)而设计的,在大规模的存储系统里,必须考虑数据的平衡分布和负载(提高资源利用率)、最大化系统的性能,以及系统的扩展和硬件容错等。CRUSH就是为解决以上问题而设计的。在Ceph集群里,CRUSH只需要一个简洁而层次清晰的设备描述,包括存储集群和副本放置策略,就可以有效地把数据对象映射到存储设备上,且这个过程是完全分布式的,在集群系统中的任何一方都可以独立计算任何对象的位置。另外,大型系统存储结构是动态变化的(存储节点的扩展或者缩容、硬件故障等), CRUSH能够处理存储设备的变更(添加或删除),并最小化由于存储设备的变更而导致的数据迁移。

      简单来说,CRUSH算法的核心意义在于,在存储策略不变、PG和OSD数量足够多的情况下,均匀选择一个PG。因为PG管理存储集群所有的OSD,因此均匀选择一个PG,等价于选择一组OSD。

      3.3.1 数据寻址

      分布式存储系统,必须要能够解决两个最基本的问题,即现在应该把数据写到什么地方与之前把数据写到什么地方了,因此会涉及数据如何寻址的问题。Ceph数据寻址要经历以下三个阶段:

      3.3.1 File -> Object映射

      Ceph条带化之后,将获得N个带有唯一OID的Object。OID是进行线性映射生成的,即由File的元数据INO以及Ceph条带化产生的Object序号ONO连缀而成,举例而言,如果1个ID为Filename的File被切分为3个Object,则Object序号依次为0、1和2,最终得到的OID依次为Filename0、Filename1和Filename2。

      3.3.2 Object -> PG映射

      在File被映射为一个或者多个Object之后,接下来就需要将每个Object独立地映射到PG中,这个映射过程也很简单,其计算公式PG ID=Hash(OID)&Mask,其中Mask=PG总数-1,PG总数需要设置为2的整数幂。当有足够数量的Object,PG被选中的概率近似均匀。

      3.3.3 PG -> OSD映射

      在得到PG ID之后,就需要将PG映射到数据实际存储单元OSD上,其计算过程CRUSH(PG ID)=(OSD1,OSD2,OSD3)。CRUSH算法的结果是得到一组OSD,在PG数量、OSD数量、以及存储策略不变的情况下,其结果一般不会变化。

      3.4 冗余方式

      数据冗余能在分布式系统发生故障时起到恢复数据的作用,也是分布式系统可靠性的常用手段。数据冗余方式有两种,一种是多副本,一种是纠删码。Ceph因为能同时支持多副本与纠删码,因此是多数商业存储公司首选的技术方案。

      3.4.1 多副本

      多副本是分布式系统常见的冗余方式,简单易用,可靠性极高。多副本相对纠删码更加成熟、稳定,也是大部分中间件冗余数据的常见手段,例如Kafka分区副本。缺点是磁盘利用率低,在N副本模式下,磁盘利用率只有1/N。在分布式存储中,除了可靠性要考虑之外,磁盘利用率也是要考虑的一个指标。

      3.4.2 纠删码

      纠删码主要是通过利用算法将原始的数据进行编码得到校验,并将数据和校验一并存储起来,以达到容错的目的。其基本思想是将K块原始数据元素通过一定的编码计算,得到M块校验元素。当其中任意m块元素出错(包括数据和校验出错),均可以通过对应的重构算法恢复出原来的K块数据。生成校验的过程被成为编码,恢复丢失数据块的过程被称为解码。

      纠删码能够基于更少的冗余设备,提供和多副本近似的可靠性,但是纠删码也带来了计算量和网络负载的额外负担,磁盘利用率越高,就需要花费更多的计算量和网络负载。在对象存储中,需要在磁盘利用率和可靠性之间做一个平衡。在纠删码模式下,磁盘利用率为K/(K+M),远比多副本1/N高。一般而言,纠删码模式下,磁盘利用率推荐在75%(K=9,M=3)较为合适,磁盘利用率更高的话,可靠性会进一步降低,进而影响对象存储的稳定性。可以归纳为:纠删码是一种用计算换存储空间的存储方式,相比多副本能节省非常多的磁盘空间,但是在数据恢复的时候代价比多副本大得多。

      在对象存储实际生产环境中,对于热数据会使用多副本策略来冗余,冷数据使用纠删码来冗余。

      四 结语

      存储方式没有好坏之分,只有适合与不适合之分,满足当前业务系统需求的存储方式就是最好的存储方式。并不能说Ceph对象存储就一定比TFS、HDFS、FastDFS优秀。这就好像现在机械硬盘已经存在这么多年了,磁带仍然没有消失的原因,因为它用一种最廉价的方式解决了大容量离线数据的存储问题,尽管它是很慢的。

      展开全文
    • 开源对象存储MinIO技术白皮书

      万次阅读 多人点赞 2019-09-27 13:38:36
       与分布式数据库相类似,MinIO对象存储系统也面临数据一致性问题:一个客户端程序在读取一个对象的同时,另一个客户端程序可能正在修改或者删除这个对象。为了避免出现数据不一致情况,MinIO相关开发人员为MinIO...

      MinIO创始者是Anand Babu Periasamy, Harshavardhana(戒日王)等人, Anand是GlusterFS的初始开发者、Gluster公司的创始人与CTO,Harshavardhana曾经是GlusterFS的开发人员,直到2011年红帽收购了Gluster公司。MinIO在设计上汲取了GlusterFS的相关经验与教训,系统复杂度上作了大量简化。
       

      一、MinIO简介

      01.概述

           MinIO对象存储系统是为海量数据存储、人工智能、大数据分析而设计,基于Apache License v2.0开源协议的对象存储系统,它完全兼容Amazon S3接口,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。MinIO主要采用Golang语言实现,整个系统都运行在操作系统的用户态空间,客户端与存储服务器之间采用http/https通信协议。

      02.设计哲学

           极简理念——采用尽可以简单可靠的集群管理方案,摒弃复杂的大规模集群调度管理,减少风险因素与性能瓶颈,聚焦产品的核心功能,打造高可靠的集群、灵活的扩展能力以及超高的性能;

          积木式扩展——建立众多的中小规模、易管理的集群,支持跨数据中心将多个集群聚合成超大资源池,而非直接采用大规模、统一管理的分布式集群。

      03.设计原则

       

      04.产品特点

       

      05.高级特性

       

      二、技术架构

      01 数据组织结构

             NAS系统把整个存储资源组织为目录树的形式。与此不同,对象存储系统把存储资源组织为租户-桶-对象的形式。数据结构组织见下图:

      对象:类似于hash表中的表项:它的名字相当于关键字,它的内容相当于“值”。

      桶:是若干个对象的逻辑抽象,是盛装对象的容器。

      租户:用于隔离存储资源。在租户之下可以建立桶、存储对象。

      用户:在租户下面创建的用于访问不同桶的账号。可以使用MinIO提供的mc命令设置不用用户访问各个桶的权限。

       

      02 数据分布与均衡

      1 去中心化架构

          MinIO采用去中心化的无共享架构,对象数据被打散存放在不同节点的多块硬盘,对外提供统一命名空间访问,并通过Web负载均衡器或DNS轮询(DNS round-robin)在各服务器之间实现负载均衡。 

       

      2 统一命名空间

            MinIO对象存储系统主要有两种部署方式,一种是常见的本地分布式集群部署,一种是联盟模式部署。本地分布式集群部署方式即在多个本地服务器节点部署MinIO软件,并将其组件成单套分布式存储集群,并提供统一命名空间和标准S3访问接口。联盟部署模式即将多个MinIO集群在逻辑上组成了统一命名空间,实现近乎无限的扩展与海量的数据规模管理,这些集群可以都在本地,或分布在不同地域的数据中心。

             如下图所示,4个服务器节点组成一个MinIO集群,每个服务器节点中会选择相同数据的硬盘创建一个纠删组,某个桶的数据会根据MinIO的分布式算法,切片分散存储到对应的纠删组中(详见纠删码相关内容)。

       

      3 分布式锁管理

             与分布式数据库相类似,MinIO对象存储系统也面临数据一致性问题:一个客户端程序在读取一个对象的同时,另一个客户端程序可能正在修改或者删除这个对象。为了避免出现数据不一致情况,MinIO相关开发人员为MinIO对象存储专门设计并实现了dsync分布式锁管理器。它采用如下分布式锁管理机制:

      l  任何一个节点的锁请求都会广播给集群内所有在线节点;

      l  如果n/2 + 1个节点回应“是”,则成功获得锁;

      l  客户端获得锁以后可保留任意时间,不需要时自己释放即可。释放操作也会广播给所有的节点,从而恢复锁的可用状态。写锁仅能被一个写入者获得。

       

      设计目标

      要求设计简单,因为简单的设计,可以避免程序中很多非常棘手的条件分支的支持。

      不存在主节点,因为一旦在设计上引入主节点,那么如果主节点宕机,整个锁管理器机制即将失效,这对MinIO对象存储系统影响非常严重,是不可接受的。

      系统必须是弹性的,即使存在多个失效的节点,只要它们的个数小于n/2, 整个锁管理系统是可以正常工作的。

      完全可以替代Golang标准库中的sync.RWMutex互斥锁。这样可以简化MinIO对象存储系统的编程。

      当失效节点重启以后,其它节点重新连接

       

      不使用zookeeper/raft等技术的原因

             zookeeper/raft功能丰富,而MinIO对象储存的使用用例其实很有限。在MinIO中使用zookeeper/raft,会使整个系统增加不必要的复杂性。

       

      优势

      •实际操作极其简单,有效代码不足一千行,易理解,易维护。

      •超高的性能。详细数据请参考文献[12]

       

      4 云网关模式

             MinIO存储系统的后端可以是磁盘,也可以作为云网关,对接第三方的NAS系统、分布式文件系统或公有云存储资源,并为业务系统转换提供标准的对象访问接口。

           目前MinIO支持Google 云存储、HDFS、阿里巴巴OSS、亚马逊S3, 微软Azure Blob 存储等第三方存储资源。

       

      03 元数据

      1 架构

            MinIO对象存储系统无元数据数据库,所有的操作都是对象级别的粒度的。这种做法的优势是:

      • 个别对象的失效,不会溢出为更大级别的系统失效。

      •便于实现“强一致性”这个特性。此特性对于机器学习与大数据处理非常重要。

       

      2 管理

            元数据与数据一起存放在磁盘上:数据部分纠删分片以后存储在磁盘上,元数据以明文形式存放在元数据文件里(xl.json)。假定对象名字为obj-with-metadata, 它所在的桶的名字是bucket_name,  disk是该对象所在纠删组的任一个磁盘的路径,如下目录:

      disk/bucket_name/obj-with-metadata 

      记录了这个对象在此磁盘上的信息。其中的内容如下:

       

            其中的xl.json即是此对象的元数据文件。part.1 即此对象的第一个数据分片。对象的元数据文件xl.json的内容是如下这种形式的json字符串:

      字段说明

       

      1 format字段

           该字段指明了这个对象的格式是xl。MinIO内部存储数据主要有两种数据格式:xl与fs。使用如下命令启动的MinIO使用的存储格式是fs:

       

             这种模式主要用于测试, 对象存储很多API都是并没有真正实现的桩函数。在生产环境所用的部署方式(本地分布式集群部署、联盟模式部署、云网关模式部署)中,存储格式都是xl。

       

      2 stat字段

            记录了此对象的状态,包括大小与修改时间,如下图:

      3 erasure字段

            这个字段记录此对象与纠删码有关的信息,如下图:

      • 其中的algorithm指明了此对象采用的是Klaus Post实现的纠删码,生成矩阵是范德蒙矩阵。

      • data,parity指明了纠删组中数据盘、校验盘的个数。

      • blockSize 指明了对象被分块的大小,默认是5M(请参见上一节“数据分布与均衡”)。

      •index指明了当前磁盘在纠删组中的序号。

      • distribution:每个纠删组的数据盘、校验盘的个数是固定的,但是不同的对象的分片写入这个纠删组的不同磁盘的顺序是不同的。这里记录了分布顺序。

      • checksum:它下面的字段个数跟此对象的分片数量有关。在旧版本的MinIO对象存储系统,每一个分片经过hash函数计算出的checksum会记录在元数据文件的这个位置。最新版的MinIO会把checksum直接计入分片文件(即part.1等文件)的前32个字节。

            此字段之下algorithm的值是”highwayhash256S”表明checksum值是写入分片文件的。

            

      4 minio字段

             这个字段记录了存储此对象的minio的版本。

       

      5 meta字段

            Content-type, etag两个字段是MinIO对象存储系统自动生成的。

            用户在使用Python等语言的写作的访问MinIO的程序中,如果上传对象时候指定了几个自定义属性,比如:

      author属性值为Zhangsan

      Nation属性值为Cn

      Type属性值为love

      那么对象元数据文件的meta字段就会出现如下几个子字段:

      X-Amz-Meta-Author

      X-Amz-Meta-Nation

      X-Amz-Meta-Type

      6 parts字段

             记录各个分片的信息:

       

      04 集群扩展

      1 扩展方式

             MinIO支持联盟部署模式,即将多个MinIO集群组成一个统一命名空间(一个ETCD集群,若干个CoreDNS服务)。其中ETCD集群相当于整个对象存储系统的配置数据库,很多重要的信息,如桶IP地址等存储于其中。这种模式的MinIO的架构如下图:

      联盟模式多集群部署

       

             同样,MinIO在扩展时也采用相同机制,而不是传统分布式存储的添加节点方式。MinIO主要通过添加新的集群来扩大整个系统,可用空间大幅增加且仍然保持统一命名空间。通过这种方式,MinIO对象存储系统几乎可以无限的扩展总体性能和容量。

       

      2 统一域名访问

          MinIO集群扩展加入新了集群或桶后,对象存储的客户端程序需要通过统一域名/url(如bucket1.domain.com)来访问数据对象,这个过程涉及到了CoreDNS系统。

      CoreDNS实现单一域名/URL访问

       

      MinIO对象存储的某个客户端(比如mc),首先向某个MinIO服务发送创建桶的请求。MinIO服务把这个桶所在的MinIO集群的外部网址(一般为一个Nginx的IP地址,或者MinIO集群的每一台服务器的IP地址),写入到etcd集群中。

      假定域名为domain.com,桶名为buc-1,集群的服务器IP地址为192.168.1.108、192.168.1.109,那么写入etcd集群的共有两条数据.第一条数据的key,value二元组为:

      第二条数据的key,value二元组为:

      CoreDNS通过etcd系统获知”bucket1.domain.com”这个url所对应的两个IP地址为192.168.1.108, 192.168.1.109。对象存储的客户端主机设置如上所配置的CoreDNS服务之后,客户端程序就可以通过域名”bucket1.domain.com”来找到访问这个桶。

       

      3 优势特性

      单一的、超大的命名空间需要花费大量的创建、维护与停机时间,复杂的部署管理,进而带来更严重的次生故障。MinIO的设计理念就是化整为零,简化集群扩展,减小单个集群的体量,轻量化单个集群的运维,从而使得超大规模的存储管理与维护变得更加容易。

      • 集群的节点完全对等,没有主节点,多个节点可以并发提供对象访问服务;

      • 创建桶的时候,可以指定数据中心/地域,以匹配对应的业务访问;

      • 无论添加多少个集群,原有集群的性能几乎是不变的;

      • 集群不会过大(32个节点),可实现可靠的分布式锁管理器,进而保证更新、删除等操作的强一致性。传统的架构允许集群扩容到数百上千节点,此情况下的强一致性容易产生性能问题;

      • 故障的影响范围小,限制在单个集群内部。

       

      05 纠删码

            在同一集群内,MinIO会自动生成若干纠删组,用于存放桶数据。一个纠删组中的一定数量的磁盘发生的故障(故障磁盘的数量小于等于校验盘的数量),通过纠删码算法可以恢复出正确的数据。MinIO集成了Reed-Solomon纠删码库,MinIO存储对象数据时,首先把它生成若干等长的片段(对于大对象,默认按5MB切片),然后每一个片段会纠删算法分成若干分片,包括数据分片与校验分片,每个分片放置在一个纠删组的某个节点上。对象的每一个数据分片、校验分片都被“防比特位衰减”算法所保护。

       

       

      对于一个对象,MinIO是如何定位它所在的纠删组呢?

           假定所有的纠删组都有一个序号(从0开始,直至纠删组个数减1)。MinIO会根据对象名(类似于文件系统的全路径名),使用crc32哈希算法计算出一个整数。然后使用这个整数除以纠删组的个数,得到一个余数。这个余数,可以作为纠删组的序号,这样就确定了这个对象所在的纠删组。MinIO采用CRC32哈希算法,与GlusterFs的Davies-Meyer哈希算法(性能、冲突概率与md4, md5相近)不一样的是, CRC32算法的哈希值分布较不均匀,但运算速度极快,高出md4数倍。相对于容量均衡,MinIO更看重数据的写入速度。

       

      06 数据修复

      比特位衰减(Bitrot)是指存在存储介质中的数据发生了缓慢的变化,如向存储介质写入一段比特流,一段时间后再读出来,二者并不一致。比特位衰减的原因大致有:磁记录磨损、磁盘幻象写(phantom writes)、磁盘指向错误(misdirectedreads/writes)、宇宙射线的辐射等。MinIO对象存储系统从设计之初即考虑到修复静默错误,从被修复的目标来说,按照大小可以分为以下三种类型的修复:某个对象、某个桶、整个集群。

      在控制台上执行mc命令即开始进行数据修复。该命令一方面向minio发送数据修复的HTTP请求,另一方面不断地接收minio服务进程返回的修复进度信息,而后输出到控制台,直到修复工作完毕。

      如前文所述,每个对象都被分成多个分片,然后存储于多台主机的磁盘上。数据修复可以分为正常、深度两种模式,正常模式下只是简单地检查分片状态信息,深度模式下会使用hash算法来校验分片的内容,找出比特位错误,同时也更耗费资源。

      MinIO具体修复流程如下:

      • mc命令作为MinIO对象存储的客户端软件、管理工具,它内部链接了minio软件(代码网址:https://github.com/minio/minio/)的madmin软件模块,通过调用madmin中的修复函数,mc包装了mc命令的命令行参数,然后向minio服务进程发送HTTP消息。

       

      •mc发送一个修复请求,在minio中被类healSequence所描述。每一个healSequence可以启动、停止、查询状态。minio服务程序收到新的任务的时候,会检查是否跟原有的healSequence有重叠的任务,如果有重叠,则启动的修复任务失败。如果minio服务没有发现错误,则使用深度优先搜索的算法,按照磁盘元数据信息、桶、对象的顺序,不断地给后台修复线程推送任务。

       

      •minio后台修复线程修复对象的流程算法:对于对象的每一个block(默认大小为5M),从纠删组的各个主机读取各个分片,如果有错误的分片,就需要修复,有两种可能:校验分片错误——minio使用各个数据分片重新计算缺失的校验片。数据分片错误——使用纠删算法恢复数据(需要计算逆矩阵)。

       

       

      07 lambda计算

             MinIO对象存储软件支持lambda计算通知机制,即桶中的对象支持事件通知机制。MinIO当前支持的事件类型有:对象上传、对象下载、对象删除、对象复制等。MinIO对象存储软件当前支持的事件接受系统有:Redis,NATS, AMQP, MQTT,Apache Kafka, MySql, PostgreSQL, Elasticsearch等。

             对象通知机制,极大地增强了MinIO对象存储的扩展性,可以让用户通过自行开发来实现某些MinIO对象存储不便实现的功能,比如基于元数据进行的各种检索、各种跟用户的业务有关的计算。既方便了用户,又有助于MinIO对象存储的生态建设。

             对象通知机制,使用极为简单,用户只需在MinIO进行少许配置即可。请参考文献[15]。

       

      08 持续备份

           传统的复制的一大问题是不能有效地扩展,很难超过几百TB。在当今的时代,为了支持灾难恢复,任何单位都需要一个备份策略。而且这个备份策略需要跨越不同的地理位置、不同的数据中心、多种多样的云环境。

          MinIO的持续备份是为跨数据中心的大型部署而设计的。通过使用lambda计算通知机制,它可以快速、有效地计算处需要增量备份的内容,这远比传统的批处理模式优秀。持续备份使得未备份的数据尽可能的少,这意味着发生灾难或者严重错误时候,丢失的数据尽可能的少,很好地保护了用户的数据资产。

       

      9 软件模块

           MinIO对象存储系统主要由以下软件模块部分组成:存储服务器软件minio,存储客户端软件mc,多种语言的客户端SDK。minio分为上下两层,上层负责minio的系统管理与对外接口,下层实现具体的逻辑。

       

      1 cmd模块

        这是minio的上层,也就是源代码中的cmd子目录,参见: https://github.com/minio/minio/tree/master/cmd。这一部分主要负责minio的命令行参数解析、初始化系统、格式化磁盘、管理内嵌的web服务器、S3 API的解析与逻辑处理。

       

      2 各个软件包

           这个是minio底层逻辑实现,也就是源代码目录中的pkg子目录。其中一些软件包(比如madmin), 可被其它组织(或个人)在编写辅助minio的软件的时候所重复使用。

      • madmin:使用这个软件包可以自己使用Golang语言撰写MinIO集群的管理程序,比如获取服务的状态(磁盘、cpu等信息)、重启某个机器服务、启动修复某个桶的任务、重新配置系统、获取剖析信息等等。

      • S3 select:如果对象存储系统中有很多超大型的对象,比如大小是几个GB甚至几个TB的对象。如果应用程序(比如spark分析程序),要把符合条件的若干个对象都读过去,然后再做分析,会及其的慢,浪费很多带宽(毕竟对象中可能只有很少的一部分是对某个分析程序有用的)。因此Amazon引入了S3 Select 的功能。通俗地说,就是把select 类型的sql语句在某个对象上执行,从对象中取出一部分内容返回给应用。MinIO提供了S3 Select 功能。相对于S3 Select, MinIO要求对象的内容必须是CSV、 JSON,或者 Parquet格式。S3Select API实现中使用的语法分析器是 Alec Thomas写的如下项目:

      https://github.com/alecthomas/participle

      这个实现的分析算法是带有栈的ll(k)分析算法。

       

      三 性能测试

           MinIO已经为高性能做过高度优化,尤其是部分关键的算法已经使用SIMD指令对Intel(AVX2/AVX512)、Arm(NEON)的cpu做过特殊优化,主要包括:

      1) 纠删码部分用到的伽罗瓦域的运算:加法、乘法、乘方等等;

      2) 监测比特位衰减(bitrot)的哈希函数,如HighwayHash。

      另外每一个MinIO集群都是无中心的,其中的每一个节点都是对等的,从而在性能上,不会存在单点瓶颈,也不会有单点故障。

          如下的硬件配置之下:Intel Skylake CPU, NVMe磁盘,以及Mellanox CX5 dual 100-GbE网卡。下图是MinIO inc的测试结果:

       

      四 设计讨论

      为什么MinIO单集群不支持扩展?

      •传统的扩展方式的劣势

           通过增加节点来扩展单集群,一般需要进行数据均衡,否则群集内各存储节点会因负载不均而出现新的瓶颈。除了数据均衡操作的时机这个问题以外,在均衡过程中一般需要从存储使用率高的节点向使用率低的节点迁移数据。当集群扩容之后,大量已经写入的文件落点会出现改变,文件需要迁移到真实的落点。当存储系统容量比较大时,则会发生大量的文件/对象进行迁移,迁移过程可能由于占用大量资源而导致上层应用性能下降。而且当文件/对象迁移过程中,机器故障可能会导致一些意想不到的情况,尤其是有大量业务的时候。当然针对此类问题,Gluterfs之类的文件系统有一些比较复杂的处理办法。

       

      •使用场景

            人工智能、大数据分析、视频监控等典型使用场景中,对象存储系统中存储的数据往往写入以后一般不再修改。如果现有MinIO集群存储空间使用完毕,重新添加新集群,然后继续写入新集群即可。MinIO对象存储的客户端应用,从业务层面自行决定那些对象存在于哪个集群里面,使用起来并不麻烦。

          单集群不可扩展,也就是说系统不需要处理扩展和数据均衡,不仅有效降低系统复杂性,而且可以使得系统部署规划具有很好的可预测性。

         对于海量对象存储应用场景,数据通常具有典型的生命周期特征,根据实际需求设计好单集群规模,按联合方式扩展,整个系统具有非常好的可维护性。

       

      •MinIO方案的优势

           不支持对单个集群进行扩展,MinIO对象存储系统的这种设计,使得系统的很多模块更加简单(比如从一个对象转换到它所在的纠删组,只用简单的哈希即可。)降低了整个系统出错的概率,使得MinIO对象存储系统更加可靠、稳定。

      详细的讨论参见文献[14]

       

      MinIO是否有类似于GlusterFs 的translator类机制?

          没有,GlusterFs是使用c语言实现的,而c语言是比较低级的语言,本身没有模块机制。Golang语言自身有强大的模块机制,所以也就不需要类似于translator之类的机制。

       

      MinIO的纠删码机制,为何没有采用柯西矩阵?

       

          就Reed-Solomon纠删码的生成矩阵来说,Klaus的纠删码库里面可以选择柯西生成矩阵。不过当前MinIO软件使用的仍然是范德蒙矩阵的Reed-Solomon纠删算法。这是因为:虽然柯西矩阵的生成相比范德蒙矩阵更快,不过MinIO编码矩阵的生成是只进行一次的操作(程序运行中,生成的这个矩阵会被保存起来)。使用柯西矩阵对数据的吞吐量并没有什么影响。

       

      五 对象存储产品选型讨论

            开源对象存储软件以MinIO,Ceph为典型代表。为帮助相关人员在选择对象存储系统之时选择合适的产品,此处对二者的特点、特性做一定讨论。

      01 MinIO优势

      1 部署极其简单

           MinIO系统的服务程序仅有minio一个可执行文件,基本不依赖其它共享库或者rpm/apt包。minio的配置项很少(大部分都是内核之类系统级的设置),甚至不配置也可以正常运行起来。百度、google、bing等搜索引擎上基本没有关于MinIO部署问题的网页,可见在实践中,很少有使用者遇到这方面的问题。

            相比之下,Ceph系统的模块,相关的rpm、apt包众多,配置项非常多,难以部署,难调优。某些Linux发行版的Ceph安装包甚至有bug,需要使用者手动改动Ceph的python脚本,才能安装完毕。

       

      2 二次开发容易

           MinIO对象存储系统除了极少数代码使用汇编实现以外,全部使用Golang语言实现。Ceph系统是使用业界闻名的难学难用的c++语言编写的。Golang语言由于产生较晚,吸收了很多语言尤其是c++的教训,语言特性比较现代化。相对而言,MinIO系统的维护、二次开发比较容易。

       

      3 网管模式支持多种其他存储

           通过网关模式,MinIO对象存储后端,可以对接各种现有的常见其它存储类型,比如的NAS系统,微软Azure Blob 存储、Google 云存储、HDFS、阿里巴巴OSS、亚马逊S3等,非常有利于企业复用现有资源,有利于企业低成本(硬件成本约等于零,部署MinIO对象存储软件即可)地从现有系统平滑升级到对象存储。

       

      02 Ceph优势 

      •数据冗余策略更加丰富

           Ceph同时支持副本、纠删码,而MinIO只支持纠删码。对于个别的对于数据可靠性要求极高的单位,Ceph对象存储更加合适。

      •社区目前更成熟

       

      03 其他对比

      1 厂商支持

           国内使用Ceph的厂商、基于Ceph进行自研的存储厂商都比较多,在使用过程中遇到的问题(有些时候,甚至需要修改、增强乃至重新实现Ceph本身的功能),可以向相关厂商寻求支持。国际方面,Ceph早已被红帽收购,而红帽近期又被IBM收购。

          MinIO开发与支持的厂商只有MinIO公司。由于架构比较先进,语言高级,MinIO本身的程序比较容易读懂、修改。招聘Golang程序员来 维护MinIO所花费的成本,显然低于招聘c++程序员来维护Ceph。 

       

      2 多语言客户端SDK

          二者均有常见编程语言的客户端,比如:python, java等。MinIO对象存储软件的开发SDK另外支持纯函数式的语言Haskell。

       

      3 技术文档  

           内部实现的文档MinIO基本不存在。想要了解内部实现乃至参与开发的技术人员,只能到如下社区:

      http://minio.slack.com/ ,与MinIO的开发人员直接交流,或者自己阅读代码。Ceph的各种实现文档、算法说明文档非常丰富。这方面Ceph要比MinIO成熟很多。

       

      04 结论

          由以上讨论,可见作为对象存储软件来说,MinIO, Ceph都非常优秀,各自有各自的优势。准备使用对象存储软件的用户,应该根据自己单位的需求、技术储备等实际情况,选择适当的软件。

       

      六 参考硬件

       

           MinIO是符合软件定义存储SDS理念的,兼容主流X86服务器以及ARM/飞腾平台,同时也可以移植到诸如申威(Alpha架构)和龙芯(Mips架构)等硬件平台。

          下面这些符合工业标准的、广泛采用的服务器是经过MinIO inc.优化测试过的、MinIO对象存储软件表现优异的服务器:

       

      参考文献

      1https://github.com/krishnasrinivas/wikinotes/wiki/minio-scaling

      2https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/Welcome.html

      3Klaus Post官网:https://klauspost.com/

      4https://github.com/klauspost/reedsolomon 

      5https://developer.ibm.com/articles/cl-cloudstorage/

      6https://github.com/minio/dsync

      7https://github.com/minio/dsync/pull/22#issue-176751755

      8https://github.com/minio/minio/blob/master/cmd/xl-sets.go 

      9https://min.io/resources/docs/MinIO-throughput-benchmarks-on-NVMe-SSD.pdf 

      10https://github.com/minio/minio/blob/master/cmd/admin-heal-ops.go

      11https://github.com/klauspost/reedsolomon/blob/master/options.go

      12https://github.com/minio/dsync

      13https://min.io/resources/docs/CPG-MinIO-implementation-guide.pdf 

      14https://github.com/minio/minio/issues/7986

      15https://docs.min.io/docs/minio-bucket-notification-guide.html

      (TaoCloud团队原创 《MinIO技术白皮书》微信公众号版

      展开全文
    • 前两篇介绍了对象存储的基础,包括存储类型,常用存储分类和分类方法。 SCSI,TCP/IP,FC等存储介质以及DAS\NAS\SAN等存储网络,请参考:对象存储1:传统存储类型和分类。 文件存储,块存储以及对象存储等数据存储...
    • 对象存储(云存储)概述

      万次阅读 多人点赞 2019-03-08 17:54:09
      文章目录三种存储形态1、块存储2、文件存储3、对象存储对象存储对象存储需求对象存储含义对象存储与传统网络存储的区别扩展知识:NAS与SAN概述1、NAS(Network Attached Storage)优点局限2、SAN(Storage Area ...
    • 从应用角度看块存储、文件存储、对象存储 产品和市场需求有各种相互影响的关系,但不管是哪一种,最终呈现都是产品和应用需求需要对应匹配。应用需求越多样化,市场也就划分得更加细,产品种类也就更加丰富。在...
    • 工作6,7年了,在实际搭建私有云网络中常用NAS结构,而部署传统RAC集群的时候也需要配SAN网络,对这几种存储方式有直观的了解,却没能理论化系统化的梳理,今天看到一篇讲这方面的文章,我也就搞了个拿来主义,收录到...
    • 对象存储(OSD)及架构原理

      千次阅读 2020-06-30 16:11:50
      存储局域网(SAN)和网络附加存储(NAS)是我们比较熟悉的两种主流网络存储架构,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)...
    • 计算机存储的发展(块存储,文件存储,对象存储

      万次阅读 多人点赞 2018-09-15 15:04:08
      对象存储 1、对象 2、对象存储设备 3、元数据服务器(Metadata Server,MDS) 4、对象存储系统的客户端Client 三者之间异同比较 参考文献 如果要实现一个计算机,那么这个计算机一定要有以下的三个部分构成:...
    • 阿里云对象存储OSS计费模式分为按量计费和包年包月,对象存储OSS的计费项有很多,不仅包括存储费用,还包括流量费用、请求费用、据处理费、标签费用及传输加速费用,新手站长网来详细说下阿里云对象存储OSS不同计费...
    • 对象存储和传统存储的区别

      千次阅读 热门讨论 2021-05-24 14:30:39
      近几年是大数据的时代,其中有一个对象存储比较火,在蔚可云基础服务中,有一款“对象存储”的产品。对象存储到底是什么东西?它与传统存储方式,有什么区别呢?下面的文章就将为您分析对象存储和传统存储的区别。 ...
    • 存储分类及对象存储osd的技术原理

      万次阅读 2018-11-07 11:23:24
      存储局域网(SAN)和网络附加存储(NAS)是我们比较熟悉的两种主流网络存储架构,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)...
    • 块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。 首先,...
    • 目录 一、资源申请 二、用户管理 1.创建用户组 2.创建用户 2.1 创建用户信息 2.2 保存csv文件 ...1.存储空间(Bucket) 1.1 创建Bucket 1.2 删除Bucket 1.3 Bucket的权限 2.对象/文件(Object) ...
    • 华为大数据云对象存储服务

      千次阅读 2019-06-12 20:00:00
      毫无疑问,云是数据中心的未来,随着数据中心以及物联网和移动设备的快速发展,我们已经来到一个信息爆炸的时代,据IDC报告,当下数据以每年50%左右的速度...如果购买传统的存储设备,高昂的存储初期投资很可能会...
    • 存储类型: https://www.bilibili.com/video/BV1WE41177Kp?from=search&seid=1887114199876544924 存储分类2: 块存储: 文件存储: 对象存储
    • 对象存储系统概念

      千次阅读 2017-10-20 22:43:06
      对象存储系统概念
    • OBS即对象存储服务(Object Storage Service),是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,包括:创建、修改、删除桶,上传、下载、删除对象等。 OBS系统和单个桶都没有...
    • 聊一聊分布式对象存储

      千次阅读 2018-11-12 15:20:41
      今天来聊聊我正在读的一本分布式对象存储的书籍。 前天11月10号,想着京东有满200-100的活动,就买了一些书,准备沉淀一下。自己打算在分布式系统上搞几年,所以买的书基本上都是关于分布式存储的。本身也没想着买...
    • 有5个非常简单好用 S3 客户端工具,可以方便接入对象存储,让你昂你领成本的上手对象存储,还能够抓一抓 S3 协议的包。 s3curl s3curl 是命令行工具,开源免费使用,非常轻量,也是我平时用的最多的一个工具。s3curl...
    • 对象存储是什么?看过就明白了

      千次阅读 2019-12-12 10:52:15
      对象存储是什么 对象存储,官方的名词解释是:对象存储是基于对象的存储,是用来描述解决和处理离散单元的方法的通用术语,这些离散单元被称作对象。 说实话看完这段解释,我的内心是这样的: 这时候如果再继续介绍...
    • 阿里云对象存储OSS和文件存储NAS有什么区别?文件存储NAS和对象存储OSS如何选择?NAS是传统的NFS挂载共享文件夹,OSS可以使用RESTful API,阿里云百科从技术、使用方式、容量、存储内容、性能及使用场景等方面来详细...
    • 使用ceph的对象存储

      万次阅读 2018-06-01 01:26:50
      Ceph 对象存储 Ceph 对象存储使用 Ceph 对象网关守护进程( radosgw ),它是个与 Ceph 存储集群交互的 FastCGI 模块。因为它提供了与 OpenStack Swift 和 Amazon S3 兼容的接口, RADOS 要有它自己的用户管理。 ...
    • 聊一聊分布式对象存储解决方案

      千次阅读 2019-05-11 09:42:43
      OSS(Object Storage Service)俗称对象存储,主要提供图片、文档、音频、视频等二进制文件的海量存储功能。本文列举了常见的开源方案:
    • 阿里云OSS(对象存储服务)简介

      万次阅读 2018-06-15 11:13:24
      所以提前熟悉一下,做一个记录注:阿里云官方文档已经很详细的阐述了OSS、以及开发流程,本文大多都是参考官方文档OSS官方介绍地址:https://help.aliyun.com/document_detail/31947.html阿里云对象存储服务(Object...
    • https://blog.csdn.net/enweitech/article/details/51445087 块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象...
    • Amazon S3 Storage(亚马逊的对象存储

      千次阅读 2020-06-24 20:37:44
      亚马逊S3,全称亚马逊简易存储服务(Amazon Simple Storage Service),是一个由亚马逊网络服务(Amazon Web Services,简称AWS)提供的服务,它通过一个Web Service接口来提供对象存储。亚马逊S3使用与amazon.com...
    • 对象存储(Object Storage)的始作俑者是亚马逊2006年推出的S3(Simple Storage Service),此后新老厂商一窝蜂地推出各种产品,形态各异,但都号称对象存储。亚马逊没有给出一个定义,也没有看到有业界普通接受的...

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 2,174,425
    精华内容 869,770
    关键字:

    对象存储