精华内容
下载资源
问答
  • 对象存储系统概念

    千次阅读 2017-10-20 22:43:06
    对象存储系统概念
    
    
    什么是对象存储(OSD)?
    存储局域网(SAN)和网络附加存储(NAS)是目前两种主流网络存储架构,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。1999年成立的全球网络存储工业协会(SNIA)的对象存储设备(Object Storage Device)工作组发布了ANSI的X3T10标准。总体上来讲,对象存储(Object-Based Storage, OBS)综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的分布式数据共享等优势,提供了具有高性能、高可靠性、跨平台以及安全的数据共享的存储体系结构。

    SAN存储架构
    采用SCSI 块I/O的命令集,通过在磁盘或FC(Fiber Channel)级的数据访问提供高性能的随机I/O和数据吞吐率,它具有高带宽、低延迟的优势,在高性能计算中占有一席之地,如SGI的CXFS文件系统就是基于SAN实现高性能文件存储的,但是由于SAN系统的价格较高,且可扩展性较差,已不能满足成千上万个CPU规模的系统。

    NAS存储架构
    它采用NFS或CIFS命令集访问数据,以文件为传输协议,通过TCP/IP实现网络化存储,可扩展性好、价格便宜、用户易管理,如目前在集群计算中应用较多的NFS文件系统,但由于NAS的协议开销高、带宽低、延迟大,不利于在高性能集群中应用。

    对象存储架构
    核心是将数据通路(数据读或写)和控制通路(元数据)分离,并且基于对象存储设备(Object-based Storage Device,OSD)构建存储系统,每个对象存储设备具有一定的智能,能够自动管理其上的数据分布。对象存储结构由对象、对象存储设备、元数据服务器、对象存储系统的客户端四部分组成。
    对象存储架构
    1、对象

    对象是系统中数据存储的基本单位,每个Object是数据和数据属性集的综合体,数据属性可以根据应用的需求进行设置,包括数据分布、服务质量等。在传统的存储系统中用文件或块作为基本的存储单位,块设备要记录每个存储数据块在设备上的位置。Object维护自己的属性,从而简化了存储系统的管理任务,增加了灵活性。Object的大小可以不同,可以包含整个数据结构,如文件、数据库表项等。在存储设备中,所有对象都有一个对象标识,通过对象标识OSD命令访问该对象。通常有多种类型的对象,存储设备上的根对象标识存储设备和该设备的各种属性,组对象是存储设备上共享资源管理策略的对象集合等。
    传统块存储与对象存储

    对象的组成

    传统的访问层次和虚拟数据访问模型

    2、对象存储设备

    每个OSD都是一个智能设备,具有自己的存储介质、处理器、内存以及网络系统等,负责管理本地的Object,是对象存储系统的核心。OSD同块设备的不同不在于存储介质,而在于两者提供的访问接口。OSD的主要功能包括数据存储和安全访问。目前国际上通常采用刀片式结构实现对象存储设备。OSD提供三个主要功能:
    (1) 数据存储。OSD管理对象数据,并将它们放置在标准的磁盘系统上,OSD不提供块接口访问方式,Client请求数据时用对象ID、偏移进行数据读写。
    (2) 智能分布。OSD用其自身的CPU和内存优化数据分布,并支持数据的预取。由于OSD可以智能地支持对象的预取,从而可以优化磁盘的性能。
    (3) 每个对象元数据的管理。OSD管理存储在其上对象的元数据,该元数据与传统的inode元数据相似,通常包括对象的数据块和对象的长度。而在传统的NAS系统中,这些元数据是由文件服务器维护的,对象存储架构将系统中主要的元数据管理工作由OSD来完成,降低了Client的开销。

    传统模型 VS OSD模型

    3、元数据服务器(Metadata Server,MDS)

    MDS控制Client与OSD对象的交互,为客户端提供元数据,主要是文件的逻辑视图,包括文件与目录的组织关系、每个文件所对应的OSD等。主要提供以下几个功能:
    (1) 对象存储访问。MDS构造、管理描述每个文件分布的视图,允许Client直接访问对象。MDS为Client提供访问该文件所含对象的能力,OSD在接收到每个请求时将先验证该能力,然后才可以访问。
    (2) 文件和目录访问管理。MDS在存储系统上构建一个文件结构,包括限额控制、目录和文件的创建和删除、访问控制等。
    (3) Client Cache一致性。为了提高Client性能,在对象存储系统设计时通常支持Client方的Cache。由于引入Client方的Cache,带来了Cache一致性问题,MDS支持基于Client的文件Cache,当Cache的文件发生改变时,将通知Client刷新Cache,从而防止Cache不一致引发的问题。

    4、对象存储系统的客户端Client

    为了有效支持Client支持访问OSD上的对象,需要在计算节点实现对象存储系统的Client。现有的应用对数据的访问大部分都是通过POSIX文件方式进行的,对象存储系统提供给用户的也是标准的POSIX文件访问接口。接口具有和通用文件系统相同的访问方式,同时为了提高性能,也具有对数据的Cache功能和文件的条带功能。同时,文件系统必须维护不同客户端上Cache的一致性,保证文件系统的数据一致。文件系统读访问流程:
    1)客户端应用发出读请求;
    2)文件系统向元数据服务器发送请求,获取要读取的数据所在的OSD;
    3)然后直接向每个OSD发送数据读取请求;
    4)OSD得到请求以后,判断要读取的Object,并根据此Object要求的认证方式,对客户端进行认证,如果此客户端得到授权,则将Object的数据返回给客户端;
    5)文件系统收到OSD返回的数据以后,读操作完成。

    对象存储文件系统的关键技术

    1、分布元数据 传统的存储结构元数据服务器通常提供两个主要功能。
    (1)为计算结点提供一个存储数据的逻辑视图(Virtual File System,VFS层),文件名列表及目录结构。
    (2)组织物理存储介质的数据分布(inode层)。对象存储结构将存储数据的逻辑视图与物理视图分开,并将负载分布,避免元数据服务器引起的瓶颈(如NAS系统)。元数据的VFS部分通常是元数据服务器的10%的负载,剩下的90%工作(inode部分)是在存储介质块的数据物理分布上完成的。在对象存储结构,inode工作分布到每个智能化的OSD,每个OSD负责管理数据分布和检索,这样90%的元数据管理工作分布到智能的存储设备,从而提高了系统元数据管理的性能。另外,分布的元数据管理,在增加更多的OSD到系统中时,可以同时增加元数据的性能和系统存储容量。

    2、并发数据访问 对象存储体系结构定义了一个新的、更加智能化的磁盘接口OSD。OSD是与网络连接的设备,它自身包含存储介质,如磁盘或磁带,并具有足够的智能可以管理本地存储的数据。计算结点直接与OSD通信,访问它存储的数据,由于OSD具有智能,因此不需要文件服务器的介入。如果将文件系统的数据分布在多个OSD上,则聚合I/O速率和数据吞吐率将线性增长,对绝大多数Linux集群应用来说,持续的I/O聚合带宽和吞吐率对较多数目的计算结点是非常重要的。对象存储结构提供的性能是目前其它存储结构难以达到的,如ActiveScale对象存储文件系统的带宽可以达到10GB/s。
    展开全文
  • 存储系统——基本概念

    千次阅读 2021-05-13 22:05:13
    文章目录现代计算机结构存储器的层次化结构 现代计算机结构 存储器的层次化结构

    现代计算机结构

    在这里插入图片描述

    存储器的层次化结构

    存储器的各个层次结构图:
    在这里插入图片描述
    注意:辅存中的数据要调入主存后才能被CPU访问

    *cache读音如下:https://fanyi.baidu.com/?aldtype=85#en/zh/cache
    在这里插入图片描述

    关系间解决的问题

    • 主存—辅存:实现虚拟存储系统,解决了主存容量不够的问题
    • Cache—主存:解决了主存与CPU速度不匹配的问题

    各层存储器速度容量价格对比

    在这里插入图片描述

    注:有的教材把安装在电脑内部的磁盘称为“辅存”,把U盘、光盘等称为“外存”。
    也有的教材把磁盘、U盘、光盘等统称为“辅存”或“外存”

    存储器的分类

    层次

    按层次对存储器进行划分

    在这里插入图片描述

    介质

    按存储介质分类

    1.半导体存储器(以半导体器件存储信息)
    (主存、Cache)
    在这里插入图片描述

    2.磁表面存储器:磁盘、磁带(以磁性材料存储信息)
    在这里插入图片描述

    3.光存储器(以磁性材料存储信息)
    在这里插入图片描述

    存取方式

    1. 相联存储器(Associative Memory),即可以按内容访问的存储器(ContentAddressed Memory,CAM)可以按照内容检索到存储位置进行读写,“快表”就是一种相联存储器

    2. 随机存取存储器(RandomAccess Memory, RAM):读写任何一个存储单元所需时间都相同,与存储单元所在的物理位置无关

    3. 顺序存取存储器(SequentialAccess Memory, SAM):读写一个存储单元所需时间取决于存储单元所在的物理位置

    4. 直接存取存储器(DirectAccessMemory,DAM):既有随机存取特性,也有顺序存取特性。先直接选取信息所在区域,然后按顺序方式存取。

    5. 串行访问存储器:读写某个存储单元所需时间与存储单元的物理位置有关

    信息的可更改性

    1. 读写存储器(Read/Write Memory)——即可读、也可写(如:磁盘、内存、Cache)
    2. 只读存储器(Read Only Memory)——只能读,不能写(如:实体音乐专辑通常采用 CD-ROM,实体电影采用蓝光光碟,BIOS通常写在ROM中)事实上很多ROM也可多次读写,只是比较麻烦。

    信息的可保存性

    1. 断电后,存储信息消失的存储器——易失性存储器(主存、Cache)

    2. 断电后,存储信息依然保持的存储器——非易失性存储器(磁盘、光盘)

    • 信息读出后,原存储信息被破坏——破坏性读出(如DRAM芯片,读出数据后要进行重写)
    • 信息读出后,原存储信息不被破坏——非破坏性读出(如SRAM芯片、磁盘、光盘)

    存储器的性能指标

    1. 存储容量:存储字数×字长(如1M×8位)。(MDR位数反 映存储字长)
    2. 单位成本:每位价格=总成本/总容量。
    3. 存储速度:数据传输率=数据的宽度/存储周期。(数据的宽度即存储字长)(主存带宽(Bm):主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒(B/s)或位/秒(b/s)。)

    存储时间,存储周期:

    存取时间(Ta):存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间。
    存取周期(Tm):存取周期又称为读写周期或访问周期。它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小时间间隔。

    如下图是一个存储时间与存储周期的关系图:
    在这里插入图片描述

    小结

    在这里插入图片描述

    展开全文
  • 本文按照自己的理解从硬件磁盘到文件系统的逐层网上的思路开展,从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。
    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。
    转载本文请注明出处,本文参考
         
    LINUX系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。这样带来优势也是显而易见的:
             实现了设备无关性。
             UNIX 权限模型也是围绕文件的概念来建立的,所以对设备也就可以同样处理了。
     
    一、Linux文件系统的层次
    上面的结构中,从硬盘驱动,文件系统,虚拟文件系统,以及系统调用,都属于内核空间,换言之,这些不同层次的实现,都是由内核来做的;而所谓用户空间的操作,也就是一些对磁盘的读写访问操作。

      1. 硬盘驱动

      常见的硬盘类型有PATA, SATA和AHCI等,在Linux系统中,对不同硬盘所提供的驱动模块一般都存放在内核目录树drivers/ata中,而对于一般通用的硬盘驱动,也许会直接被编译到内核中,而不会以模块的方式出现,可以通过查看/boot/config-xxx.xxx文件来确认:

      CONFIG_SATA_AHCI=y

      2. General Block Device Layer

      这一层的作用,正是解答了上面提出的第一个问题,不同的硬盘驱动,会提供不同的IO接口,内核认为这种杂乱的接口,不利于管理,需要把这些接口抽象一下,形成一个统一的对外接口,这样,不管你是什么硬盘,什么驱动,对外而言,它们所提供的IO接口没什么区别,都一视同仁的被看作块设备来处理。

      所以,如果在一层做的任何修改,将会直接影响到所有文件系统,不管是ext3,ext4还是其它文件系统,只要在这一层次做了某种修改,对它们都会产生影响。

      3. 文件系统

      文件系统这一层相信大家都再熟悉不过了,目前大多Linux发行版本默认使用的文件系统一般是ext4,另外,新一代的btrfs也呼之欲出,不管什么样的文件系统,都是由一系列的mkfs.xxx命令来创建,如:

      mkfs.ext4 /dev/sda

      mkfs.btrfs /dev/sdb

      内核所支持的文件系统类型,可以通过内核目录树 fs 目录中的内容来查看。

      4. 虚拟文件系统(VFS)

      Virtual File System这一层,正是用来解决上面提出的第二个问题,试想,当我们通过mkfs.xxx系列命令创建了很多不同的文件系统,但这些文件系统都有各自的API接口,而用户想要的是,不管你是什么API,他们只关心mount/umount,或open/close等操作。

      所以,VFS就把这些不同的文件系统做一个抽象,提供统一的API访问接口,这样,用户空间就不用关心不同文件系统中不一样的API了。VFS所提供的这些统一的API,再经过System Call包装一下,用户空间就可以经过SCI的系统调用来操作不同的文件系统。

      VFS所提供的常用API有:

      mount(), umount() …

      open(),close() …

      mkdir() …
     
    二、Linux下的文件系统分类(以存储介质)

         和文件系统关系最密切的就是存储介质,存储介质大致有RAM,ROM,磁盘磁带,闪存等。

         闪存(Flash Memory)是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器,数据删除不是以单个的字节为单位而是以固定的区块为单位(注意:NOR Flash 为字节存储。),区块大小一般为256KB到20MB。闪存是电子可擦除只读存储器(EEPROM)的变种,EEPROM与闪存不同的是,它能在字节水平上进行删除和重写而不是整个芯片擦写,这样闪存就比EEPROM的更新速度快。由于其断电时仍能保存数据,闪存通常被用来保存设置信息,如在电脑的BIOS(基本输入输出程序)、PDA(个人数字助理)、数码相机中保存资料等。
         外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢的多。内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。
         RAM又分为动态的和静态。。静态被用作cache,动态的常用作内存。。网上说闪存不能代替DRAM是因为闪存不像RAM(随机存取存储器)一样以字节为单位改写数据,因此不能取代RAM。这个以后可以了解下硬件的知识再来辨别.
     
    Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。

      Linux下的文件系统结构如下:

      Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。
      不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
      1. 基于FLASH的文件系统
      Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。
     闪存主要有NOR和NAND两种技术。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。
      在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。
      顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。
      (1) jffs2
      JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。
      Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)
      主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。
      目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。
      jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。
       (2) yaffs:Yet Another Flash File System
      yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
      yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。
      yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
      (3) Cramfs:Compressed ROM File System
      Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。
      在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
      Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。
      另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。
      由于以上特性,Cramfs在嵌入式系统中应用广泛。
      但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。?
      Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。
      (4) Romfs
      传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。
      其他文件系统:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。
      2. 基于RAM的文件系统
      (1) Ramdisk
      Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。
      在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。
      (2)ramfs/tmpfs
      Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)
      Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。
      Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。
      Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。
      3. 网络文件系统NFS (Network File System)
      NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
      以上讨论的都是基于存储设备的文件系统(memory-based file system),它们都可用作Linux的根文件系统。实际上,Linux还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)和sysfs,用于维护设备文件。
      附录:NOR闪存与NAND闪存比较
    NOR FLASH
    接口时序同SRAM,易使用
    读取速度较快
    擦除速度慢,以64-128KB的块为单位
    写入速度慢(因为一般要先擦除)
    随机存取速度较快,支持XIP(eXecute In Place,芯片内执行),适用于代码存储。在嵌入式系统中,常用于存放引导程序、根文件系统等。
    单片容量较小,1-32MB
    最大擦写次数10万次

    NAND FLASH
    地址/数据线复用,数据位较窄
    读取速度较慢
    擦除速度快,以8-32KB的块为单位
    写入速度快
    顺序读取速度较快,随机存取速度慢,适用于数据存储(如大容量的多媒体应用)。在嵌入式系统中,常用于存放用户文件系统等。
    单片容量较大,8-128MB,提高了单元密度
     
     
    三、文件存储结构
     
    介绍文件存储结构前先来看看文件系统如何划分磁盘,创建一个文件、目录、链接的过程。
     
    1.物理磁盘到文件系统
    我们知道文件最终是保存在硬盘上的。硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储128×2的N次方(N=0.1.2.3)字节信息。在DOS中每扇区是128×2的2次方=512字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用,我们知道,每个磁盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,帮这些参数可以得到硬盘的容量,基计算公式为:
    存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
    要点:
    (1)硬盘有数个盘片,每盘片两个面,每个面一个磁头
    (2)盘片被划分为多个扇形区域即扇区
    (3)同一盘片不同半径的同心圆为磁道
    (4)不同盘片相同半径构成的圆柱面即柱面
    (5)公式: 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
    (6)信息记录可表示为:××磁道(柱面),××磁头,××扇区
    那么这些空间又是怎么管理起来的呢?unix/linux使用了一个简单的方法。 
    它将磁盘块分为以下三个部分:
    1)        超级块,文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。
    2)        I-切点表。超级块的下一个部分就是i-节点表。每个i-节点就是一个对应一个文件/目录的结构,这个结构它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号
    3)        数据区。文件系统的第3个部分是数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独产的磁盘块中。
     
    Linux正统的文件系统(如ext2、ext3)一个文件由目录项、inode和数据块组成。
    目录项:包括文件名和inode节点号。
    Inode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。
    数据块:文件的具体内容存放地。


    Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。

    文件存储结构大概如下:



    其中目录项的结构如下(每个文件的目录项存储在改文件所属目录的文件内容里):


    图4:目录项结构 

    其中文件的inode结构如下(inode里所包含的文件信息可以通过stat filename查看得到):


    以上只反映大体的结构,linux文件系统本身在不断发展。但是以上概念基本是不变的。且如ext2、ext3、ext4文件系统也存在很大差别,如果要了解可以查看专门的文件系统介绍。
    2. 创建一个文件的过程

    我们从前面可以知道文件的内容和属性是分开存放的,那么又是如何管理它们的呢?现在我们以创建一个文件为例来讲解。
    在命令行输入命令:
    $ who > userlist
    当完成这个命令时。文件系统中增加了一个存放命令who输出内容的新文件userlist,那么这整个过程到底是怎么回事呢?
    文件主要有属性、内容以及文件名三项。内核将文件内容存放在数据区,文件属性存放在i-节点,文件名存放在目录中。
    创建成功一个文件主要有以下四个步骤:
    1)        存储属性 也就是文件属性的存储,内核先找到一块空的i-节点。例如,内核找到i-节点号921130。内核把文件的信息记录其中。如文件的大小、文件所有者、和创建时间等。
    2)        存储数据 即文件内容的存储,由于该文件需要3个数据块。因此内核从自由块的列表中找到3个自由块。如600、200、992,内核缓冲区的第一块数据复制到块600,第二和第三分别复制到922和600.
    3)        记录分配情况,数据保存到了三个数据块中。所以必须要记录起来,以后再找到正确的数据。分配情况记录在文件的i-节点中的磁盘序号列表里。这3个编号分别放在最开始的3个位置。
    4)        添加文件名到目录,新文件的名字是userlist 内核将文件的入口(47,userlist)添加到目录文件里。文件名和i-节点号之间的对应关系将文件名和文件和文件的内容属性连接起来,找到文件名就找到文件的i-节点号,通过i-节点号就能找到文件的属性和内容。
    代码具体实现过程参考:
    3.创建一个目录的过程

    前面说了创建一个文件的大概过程,也了解文件内容、属性以及入口的保存方式,那么创建一个目录时又是怎么回事呢?
    我现在test目录使用命令mkdir 新增一个子目录child:

    从用户的角度看,目录child是目录test的一个子目录,那么在系统中这层关系是怎么实现的呢?实际上test目录包含一个指向子目录child的i-节点的链接,原理跟普通文件一样,因为目录也是文件。

    目录其实也是文件,只是它的内容比较特殊。所以它的创建过程和文件创建过程一样,只是第二步写的内容不同。
    1)      系统找到空闲的i-节点号887220,写入目录的属性
    2)      找到空闲的数据块1002来存储目录的内容,只是目录的内容比较特殊,包含文件名字列表,列表一般包含两个部分:i-节点号和文件名,这个列表其实也就是文件的入口,新建的目录至少包含三个目录”.”和”..”其中”.”指向自己,”..”指向上级目录,我们可以通过比较对应的i-节点号来验证,887270 对应着上级目录中的child对应的i-节点号
    3)      记录分配情况。这个和创建文件完全一样
    4)      添加目录的入口到父目录,即在父目录中的child入口。

    一般都说文件存放在某个目录中,其实目录中存入的只是文件在i-节点表的入口,而文件的内容则存储在数据区。我们一般会说“文件userlist在目录test中”,其实这意味着目录test中有一个指向i-节点921130的链接,这个链接所附加的文件名为userlist,这也可以这样理解:目录包含的是文件的引用,每个引用被称为链接。文件的内容存储在数据块。文件的属性被记录在一个被称为i-节点的结构中。I-节点的编号和文件名关联起来存在目录中。
    注意:其中“.”表示是当前目录。而“..”是当前目录的父目录。但也有特殊情况:如我们查看根目录/的情况:

    发现“.”和“..”都指向i-节点2。实际上当我们用mkfs创建一个文件系统时,mkfs都会将根目录的父目录指向自己。所以根目录下.和..指向同一个i-节点也不奇怪了。
    代码具体实现参考:

    4. 理解链接

    我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。图 1.展示了程序通过文件名获取文件内容的过程。
    图 1. 通过文件名打开文件

    图 1. 通过文件名打开文件

    清单 3. 移动或重命名文件
    复制代码
    # stat /home/harris/source/glibc-2.16.0.tar.xz
      File: `/home/harris/source/glibc-2.16.0.tar.xz'
      Size: 9990512        Blocks: 19520      IO Block: 4096   regular file
    Device: 807h/2055d      Inode: 2485677     Links: 1
    Access: (0600/-rw-------)  Uid: ( 1000/  harris)   Gid: ( 1000/  harris)
    ...
    ...
    # mv /home/harris/source/glibc-2.16.0.tar.xz /home/harris/Desktop/glibc.tar.xz
    # ls -i -F /home/harris/Desktop/glibc.tar.xz
    2485677 /home/harris/Desktop/glibc.tar.xz
    复制代码

     


    在 Linux 系统中查看 inode 号可使用命令 stat 或 ls -i(若是 AIX 系统,则使用命令 istat)。清单 3.中使用命令 mv 移动并重命名文件 glibc-2.16.0.tar.xz,其结果不影响文件的用户数据及 inode 号,文件移动前后 inode 号均为:2485677。
    为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。
    具体关系可以看下图:
    链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名(见 图 2.hard link 就是 file 的一个别名,他们有共同的 inode)。硬链接可由命令 link 或 ln 创建。如下是对文件 oldfile 创建硬链接。
    link oldfile newfile
    ln oldfile newfile
    由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:
    文件有相同的 inode 及 data block;
    只能对已存在的文件进行创建;
    不能交叉文件系统进行硬链接的创建;
    不能对目录进行创建,只可对文件创建;
    删除一个硬链接文件并不影响其他有相同 inode 号的文件。
     
    创建一个链接的步骤大概如下:
    1)  通过原文件的文件名找到文件的i-节点号
    2)  添加文件名关联到目录,新文件的名字是mylink 内核将文件的入口(921130,mylink)添加到目录文件里。
    和创建文件的过程比较发现,链接少了写文件内容的步骤,完全相同的是把文件名关联到目录这一步
    现在.i- 节点号921130对应了两个文件名。链接数也会变成2个,文件的内容并不会发生任何变化。前面我们已经讲了:目录包含的是文件的引用,每个引用被称为链接。所以链接文件和原始文件本质上是一样的,因为它们都是指向同一个i-节点。由于此原因也就可以理解链接的下列特性:你改变其中任何一个文件的内容,别的链接文件也一样是变化;另外如果你删除某一个文件,系统只会在所指向的i-节点上把链接数减1,只有当链接数减为零时才会真正释放i-节点。
    硬链接有两个特点:
    1)不能跨文件系统
    2)不能对目录
    清单 4. 硬链接特性展示
    复制代码
    # ls -li 
     total 0 
    
     // 只能对已存在的文件创建硬连接
     # link old.file hard.link 
     link: cannot create link `hard.link' to `old.file': No such file or directory 
    
     # echo "This is an original file" > old.file 
     # cat old.file 
     This is an original file 
     # stat old.file 
      File: `old.file'
      Size: 25             Blocks: 8          IO Block: 4096   regular file 
     Device: 807h/2055d      Inode: 660650      Links: 2 
     Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root) 
     ... 
     // 文件有相同的 inode 号以及 data block 
     # link old.file hard.link | ls -li 
     total 8 
     660650 -rw-r--r-- 2 root root 25 Sep  1 17:44 hard.link 
     660650 -rw-r--r-- 2 root root 25 Sep  1 17:44 old.file 
    
     // 不能交叉文件系统
     # ln /dev/input/event5 /root/bfile.txt 
     ln: failed to create hard link `/root/bfile.txt' => `/dev/input/event5': 
     Invalid cross-device link 
    
     // 不能对目录进行创建硬连接
     # mkdir -p old.dir/test 
     # ln old.dir/ hardlink.dir 
     ln: `old.dir/': hard link not allowed for directory 
     # ls -iF 
     660650 hard.link  657948 old.dir/  660650 old.file
    复制代码

     

    软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块(见 图 2.)。因此软链接的创建与使用没有类似硬链接的诸多限制:
    软链接有自己的文件属性及权限等;
    可对不存在的文件或目录创建软链接;
    软链接可交叉文件系统;
    软链接可对文件或目录创建;
    创建软链接时,链接计数 i_nlink 不会增加;
    删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
    图 2. 软链接的访问
    软链接实际上只是一段文字,里面包含着它所指向的文件的名字,系统看到软链接后自动跳到对应的文件位置处进行处理;相反,硬链接为文件开设一个新的目录项,硬链接与文件原有的名字是平权的,在Linux看来它们是等价的。由于这个原因,硬链接不能连接两个不同文件系统上的文件。

    软连接与windows下的快捷方式类似
    至于硬连接,举个例子说吧,你把dir1/file1硬连接到dir2/file2, 就是在dir2下建立一个dir1/file1的镜像文件file2,它与file1是占用一样大的空间的,并且改动两者中的一个,另一个也会发生同样的改动.
    软连接和硬连接可以这样理解:
    硬连接就像一个文件有多个文件名,
    软连接就是产生一个新文件(这个文件内容,实际上就是记当要链接原文件路径的信息),这个文件指向另一个文件的位置,
    硬连接必须在同一文件系统中,而软连接可以跨文件系统
    硬连接 :源文件名和链接文件名都指向相同的物理地址,目录不能够有硬连接,文件在磁盘中只有一个复制,可以节省硬盘空间,由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此可以防止不必要的误删除软连接(符号连接)用ln -s命令创建文件的符号连接,符号连接是linux特殊文件的一种,作为一个文件,它的资料是它所连接的文件的路径名,类似于硬件方式,******可以删除原始文件 而连接文件仍然存在。********
    清单 5. 软链接特性展示
    复制代码
    # ls -li 
     total 0 
    
     // 可对不存在的文件创建软链接
     # ln -s old.file soft.link 
     # ls -liF 
     total 0 
     789467 lrwxrwxrwx 1 root root 8 Sep  1 18:00 soft.link -> old.file 
    
     // 由于被指向的文件不存在,此时的软链接 soft.link 就是死链接
     # cat soft.link 
     cat: soft.link: No such file or directory 
    
     // 创建被指向的文件 old.file,soft.link 恢复成正常的软链接
     # echo "This is an original file_A" >> old.file 
     # cat soft.link 
     This is an original file_A 
    
     // 对不存在的目录创建软链接
     # ln -s old.dir soft.link.dir 
     # mkdir -p old.dir/test 
     # tree . -F --inodes 
     . 
    ├── [ 789497]  old.dir/ 
    │   └── [ 789498]  test/ 
    ├── [ 789495]  old.file 
    ├── [ 789495]  soft.link -> old.file 
    └── [ 789497]  soft.link.dir -> old.dir/
    复制代码

     

     
     
    四、文件节点inode
    可以看到inode节点好比是文件的大脑,下面就详细介绍一下inode。
    1.inode是什么 
         理解inode,要从文件储存说起。
         扇区(sector):硬件(磁盘)上的最小的操作单位,是操作系统和块设备(硬件、磁盘)之间传送数据的单位。
         block由一个或多个sector组成,文件系统中最小的操作单位;OS的虚拟文件系统从硬件设备上读取一个block,实际为从硬件设备读取一个或多个sector。对于文件管理来说,每个文件对应的多个block可能是不连续的;
         block最终要映射到sector上,所以block的大小一般是sector的整数倍。不同的文件系统block可使用不同的大小,操作系统会在内存中开辟内存,存放block到所谓的block buffer中。在Ext2中,物理块的大小是可变化的,这取决于在创建文件系统时的选择,之所以不限制大小,也正体现了Ext2的灵活性和可扩充性。通常,Ext2的物理块占一个或几个连续的扇区,显然,物理块的数目是由磁盘容量等硬件因素决定的。具体文件系统所操作的基本单位是逻辑块,只在需要进行I/O操作时才进行逻辑块到物理块的映射,这显然避免了大量的I/O操作,因而文件系统能够变得高效。逻辑块作为一个抽象的概念,它必然要映射到具体的物理块上去,因此,逻辑块的大小必须是物理块大小的整数倍,一般说来,两者是一样大的。
         通常,一个文件占用的多个物理块在磁盘上是不连续存储的,因为如果连续存储,则经过频繁的删除、建立、移动文件等操作,最后磁盘上将形成大量的空洞,很快磁盘上将无空间可供使用。因此,必须提供一种方法将一个文件占用的多个逻辑块映射到对应的非连续存储的物理块上去,Ext2等类文件系统是用索引节点解决这个问题的。
       
    文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
    在Unix/Linux上,一个文件由一个inode 表示。inode在系统管理员看来是每一个文件的唯一标识,在系统里面,inode是一个结构,存储了关于这个文件的大部分信息。 
    2.inode内容
    inode包含文件的元信息,具体来说有以下内容:
    *文件的字节数
    *文件拥有者的UserID*文件的GroupID
    *文件的读、写、执行权限
    *文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
    *链接数,即有多少文件名指向这个inode*文件数据block的位置可以用stat命令,查看某个文件的inode信息:statexample.txt
    总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。
    inode中存储了一个文件的以下信息:
    3.inode结构

     

    复制代码
    struct inode {
            struct hlist_node       i_hash;              /* 哈希表 */
            struct list_head        i_list;              /* 索引节点链表 */
            struct list_head        i_dentry;            /* 目录项链表 */
            unsigned long           i_ino;               /* 节点号 */
            atomic_t                i_count;             /* 引用记数 */
            umode_t                 i_mode;              /* 访问权限控制 */
            unsigned int            i_nlink;             /* 硬链接数 */
            uid_t                   i_uid;               /* 使用者id */
            gid_t                   i_gid;               /* 使用者id组 */
            kdev_t                  i_rdev;              /* 实设备标识符 */
            loff_t                  i_size;              /* 以字节为单位的文件大小 */
            struct timespec         i_atime;             /* 最后访问时间 */
            struct timespec         i_mtime;             /* 最后修改(modify)时间 */
            struct timespec         i_ctime;             /* 最后改变(change)时间 */
            unsigned int            i_blkbits;           /* 以位为单位的块大小 */
            unsigned long           i_blksize;           /* 以字节为单位的块大小 */
            unsigned long           i_version;           /* 版本号 */
            unsigned long           i_blocks;            /* 文件的块数 */
            unsigned short          i_bytes;             /* 使用的字节数 */
            spinlock_t              i_lock;              /* 自旋锁 */
            struct rw_semaphore     i_alloc_sem;         /* 索引节点信号量 */
            struct inode_operations *i_op;               /* 索引节点操作表 */
            struct file_operations  *i_fop;              /* 默认的索引节点操作 */
            struct super_block      *i_sb;               /* 相关的超级块 */
            struct file_lock        *i_flock;            /* 文件锁链表 */
            struct address_space    *i_mapping;          /* 相关的地址映射 */
            struct address_space    i_data;              /* 设备地址映射 */
            struct dquot            *i_dquot[MAXQUOTAS]; /* 节点的磁盘限额 */
            struct list_head        i_devices;           /* 块设备链表 */
            struct pipe_inode_info  *i_pipe;             /* 管道信息 */
            struct block_device     *i_bdev;             /* 块设备驱动 */
            unsigned long           i_dnotify_mask;      /* 目录通知掩码 */
            struct dnotify_struct   *i_dnotify;          /* 目录通知 */
            unsigned long           i_state;             /* 状态标志 */
            unsigned long           dirtied_when;        /* 首次修改时间 */
            unsigned int            i_flags;             /* 文件系统标志 */
            unsigned char           i_sock;              /* 可能是个套接字吧 */
            atomic_t                i_writecount;        /* 写者记数 */
            void                    *i_security;         /* 安全模块 */
            __u32                   i_generation;        /* 索引节点版本号 */
            union {
                    void            *generic_ip;         /* 文件特殊信息 */
            } u;
    };
    复制代码
    inode就是一个文件的一部分描述,不是全部,在内核中,inode对应了这样一个实际存在的结构。
    
    
    纵观整个inode的C语言描述,没有发现关于文件名的东西,也就是说文件名不由inode保存,实际上系统是不关心文件名的,对于系统中任何的操作,大部分情况下你都是通过文件名来做的,但系统最终都要通过找到文件对应的inode来操作文件,由inode结构中 *i_op指向的接口来操作。
    文件系统如何存取文件的:
         1)、根据文件名,通过Directory里的对应关系,找到文件对应的Inodenumber
         2)、再根据Inodenumber读取到文件的Inodetable
         3)、再根据Inodetable中的Pointer读取到相应的Blocks
    这里有一个重要的内容,就是Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inodenumber。
    展开全文
  • 开源分布式存储系统的对比

    万次阅读 多人点赞 2018-04-20 16:32:49
    我们在选型开源分布式存储系统框架之前需要对不同的框架进行调研。 所有的开源存储系统介绍链接 存储系统对比 目前比较热门的分布式文件系统有如下几种: Ceph,GlusterFS,Sheepdog,Lustre,Swift,Cinder,TFS,HDFS...

    我们在选型开源分布式存储系统框架之前需要对不同的框架进行调研。

    所有的开源存储系统介绍链接

    存储系统对比

    目前比较热门的分布式文件系统有如下几种:

    Ceph,GlusterFS,Sheepdog,Lustre,Swift,Cinder,TFS,HDFS,MooseFS,FastDFS,MogileFS等

    开源协议说明
    GPL:不允许修改后和衍生的代码做为闭源的商业软件发布和销售,修改后该软件产品必须也采用GPL协议;
    GPL V2:修改文本的整体就必须按照GPL流通,不仅该修改文本的源码必须向社会公开,而且对于这种修改文本的流通不准许附加修改者自己作出的限制;
    GPL V3:要求用户公布修改的源代码,还要求公布相关硬件;
    LGPL:更宽松的GPL

    存储系统 Ceph GlusterFS Sheepdog Lustre Swift Cinder TFS HDFS MooseFS FastDFS MogileFS
    开发语言 C++ C C C Python Python C++ Java C C Perl
    开源协议 LGPL GPL V3 GPLv2 GPL Apache Apache GPL V2 Apache GPL V3 GPL V3 GPL
    数据存储方式 对象/文件/块 文件/块 对象 对象 文件 文件 文件/块 文件
    集群节点通信协议 私有协议(TCP) 私有协议(TCP)/ RDAM(远程直接访问内存) totem协议 私有协议(TCP)/ RDAM(远程直接访问内存) TCP 未知 TCP TCP TCP TCP HTTP
    专用元数据存储点 占用MDS 双MDS 未知 占用NS 占用MDS 占用MFS 占用DB
    在线扩容 支持 支持 支持 支持 支持 未知 支持 支持 支持 支持 支持
    冗余备份 支持 支持 支持 支持 未知 支持 支持 支持 支持 不支持
    单点故障 不存在 不存在 不存在 存在 不存在 未知 存在 存在 存在 不存在 存在
    跨集群同步 不支持 支持 未知 未知 未知 未知 支持 不支持 不支持 部分支持 不支持
    易用性 安装简单,官方文档专业化 安装简单,官方文档专业化 未知 复杂。而且Lustre严重依赖内核,需要重新编译内核 未知 目前来说框架不算成熟存在一些问题 安装复杂,官方文档少 安装简单,官方文档专业化 安装简单,官方文档多 安装简单,社区相对活跃 未知
    适用场景 单集群的大中小文件 跨集群云存储 弹性块存储虚拟机 大文件读写 openstack对象存储 openstack块存储 跨集群的小文件 Mapreduce使用的文件存储 单集群的大中文件 单集群的中小文件 未知
    FUSE挂载 支持 支持 支持 支持 支持 未知 未知 支持 支持 不支持 不支持
    访问接口 POSIX POSIX 未知 POSIX/MPI POSIX 未知 不支持POSIX 不支持POSIX POSIX 不支持POSIX 不支持POSIX

    选型时一定要考虑技术的热门程度,否则招不到人,找不到一起弄得同伴。

    我们的需求是支持NFS挂载的,就是可以当作本地文件系统一样的路径访问。

    满足这个需求的存储系统看看上表是否支持fuse挂载即可。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    OpenStack Swift 和Ceph对比

    我们知道,在当前的开源对象存储项目中,OpenStack Swift 和Ceph无疑是佼佼者。OpenStack Swift通过大肆宣传,在市场上知名度很高。而Ceph是作为开源对象存储竞争产品出现的,以其丰富的功能和卓越的性能见长。两者都是开源的,但都有其短板。Ceph和Swift,哪种更好?在这个问题上大家争论不休,选择Swift还是Ceph这是一个问题!
      网友qfxhz:” Ceph虽然也有一些缺点问题,但是瑕不掩瑜,还是感觉Ceph更好一点, Ceph存储集成了对象存储和块存储,而Swift系统只能处理对象存储,不支持块存储和文件存储。“
      网友momo: “还是选择Swift吧。Ceph很重要的一个短板就是安全性。云计算节点上的RADOS客户端直接与RADOS服务器交互所使用的网络与Ceph用于未加密复制流量的网络相同。如果某个Ceph客户端节点被入侵,攻击者便能得到存储网络的所有流量。“
      网友yehuafeilang:“ceph毕竟不是一个专门的对象存储系统,其对象存储服务其实是在block服务上模拟出来的,所以和专门的对象存储swift比起来,在部署规模,使用成本上会有比较大的差距;但是,因为不是所有的云都需要大规模的对象存储,考虑到跨地域场景时,swift的部署也很复杂,所以在刚开始搭建openstack云服务时,或者是对象存储业务量不是很大时,为了节省系统搭建时间,使用ceph提供S3服务也是个不错的选择。“
      网友fatelyliang:存储不像服务器,它承载的内容是企业最重要的数据和信息,对他的可靠性、完整性、可用性、安全性、运行性能、与企业中的云计算平台关系、存储特征的可定义性等各部分的要求都应该是企业信息化基础架构中最重要的一个判断。存储设备的损坏、更换等都是对企业影响非常大的一个事情!除非系统可以轻易停机!因此,在目前的状态下,开源的存储我会更建议应用在开发测试环境、容灾环境等重要性级别相对稍低的地方,充分验证在以上几个判断依据的结论之后,结合企业的实际指标判断应该选取那一个!
      Ceph这样的系统一般不支持跨机房,跨地域的大规模部署。如果部署只在单一地域,没有计划扩展到多个地域时,Ceph会是很好的选择。但是,如果要考虑大规模部署的话,Swift可能更为适合。因为它的多地域能力会胜过 Ceph。从安全角度来看,Swift封闭的复制网络更为安全,但是,如果云基础架构本身已经很安全,存储安全性优先级便会降低,这时可能Ceph更适合。其实,在同一个云基础架构里同时拥有这两种选择也是可行的。比如说,可以使用Ceph作为本地高性能存储,而Swift则作为多地域Glance后台,但是,拥有这两种选择的解决方案花费必然更多,对于资金雄厚的企业来说为了避免长时间纠结,可以一试。 对于中小企业来讲还是得悉心衡量利弊以及自身的需求,做好整体把控为妙。关于Swift和Ceph二者的选择,更重要的是要从两者的架构角度分析各自的优缺点,并且需要结合自身的应用场景、技术实力、运营实力来进行评估,具体问题具体分析,不必纠结,正所谓寸有所长,尺有所短,选择最合适的才是最好的。

    Ceph用C++编写而Swift用Python编写,性能上应当是Ceph占优。但是与Ceph不同,Swift专注于对象存储,作为OpenStack组件之一经过大量生产实践的验证,与OpenStack结合很好,目前不少人使用Ceph为OpenStack提供块存储,但仍旧使用Swift提供对象存储。

    Ceph与HDFS对比

    Ceph对比HDFS优势在于易扩展,无单点。HDFS是专门为Hadoop这样的云计算而生,在离线批量处理大数据上有先天的优势,而Ceph是一个通用的实时存储系统。虽然Hadoop可以利用Ceph作为存储后端(根据Ceph官方的教程死活整合不了,自己写了个简洁的步骤: http://www.kai-zhang.com/cloud-computing/Running-Hadoop-on-CEPH/), 但执行计算任务上性能还是略逊于HDFS(时间上慢30%左右 Haceph: Scalable Meta- data Management for Hadoop using Ceph)。

    存储系统简介

    TFS

    TFS(Taobao File System)是由淘宝开发的一个分布式文件系统,其内部经过特殊的优化处理,适用于海量的小文件存储,目前已经对外开源;

    TFS采用自有的文件系统格式存储,因此需要专用的API接口去访问,目前官方提供的客户端版本有:C++/JAVA/PHP。

    特性

    1)在TFS文件系统中,NameServer负责管理文件元数据,通过HA机制实现主备热切换,由于所有元数据都是在内存中,其处理效率非常高效,系统架构也非常简单,管理也很方便;
    2)TFS的DataServer作为分部署数据存储节点,同时也具备负载均衡和冗余备份的功能,由于采用自有的文件系统,对小文件会采取合并策略,减少数据碎片,从而提升IO性能;
    3)TFS将元数据信息(BlockID、FileID)直接映射至文件名中,这一设计大大降低了存储元数据的内存空间;
    优点

    1)针对小文件量身定做,随机IO性能比较高;
    2)支持在线扩容机制,增强系统的可扩展性;
    3)实现了软RAID,增强系统的并发处理能力及数据容错恢复能力;
    4)支持主备热倒换,提升系统的可用性;
    5)支持主从集群部署,其中从集群主要提供读/备功能;
    缺点

    1)TFS只对小文件做优化,不适合大文件的存储;
    2)不支持POSIX通用接口访问,通用性较低;
    3)不支持自定义目录结构,及文件权限控制;
    4)通过API下载,存在单点的性能瓶颈;
    5)官方文档非常少,学习成本高;
    应用场景

    1)多集群部署的应用
    2)存储后基本不做改动
    3)海量小型文件
    根据目前官方提供的材料,对单个集群节点,存储节点在1000台以内可以良好工作,如存储节点扩大可能会出现NameServer的性能瓶颈,目前淘宝线上部署容量已达到1800TB规模(2009年数据)
    安装及使用

    安装指导

    TFS_配置使用

    源代码路径:http://code.taobao.org/p/tfs/src/

    参考
    http://rdc.taobao.com/blog/cs/?p=128

    http://elf8848.iteye.com/blog/1724423

    http://baike.baidu.com/view/1030880.htm

    http://blog.yunnotes.net/index.php/install_document_for_tfs/

    FastDFS

    FastDFS是国人开发的一款分布式文件系统,目前社区比较活跃。如上图所示系统中存在三种节点:Client、Tracker、Storage,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个Storage,从而实现软RAID10,提升并发IO的性能、简单负载均衡及数据的冗余备份;同时通过线性的添加新的逻辑存储组,从容实现存储容量的线性扩容。

    文件下载上,除了支持通过API方式,目前还提供了apache和nginx的插件支持,同时也可以不使用对应的插件,直接以Web静态资源方式对外提供下载。

    目前FastDFS(V4.x)代码量大概6w多行,内部的网络模型使用比较成熟的libevent三方库,具备高并发的处理能力。

    特性

    1)在上述介绍中Tracker服务器是整个系统的核心枢纽,其完成了访问调度(负载均衡),监控管理Storage服务器,由此可见Tracker的作用至关重要,也就增加了系统的单点故障,为此FastDFS支持多个备用的Tracker,虽然实际测试发现备用Tracker运行不是非常完美,但还是能保证系统可用。
    2)在文件同步上,只有同组的Storage才做同步,由文件所在的源Storage服务器push至其它Storage服务器,目前同步是采用Binlog方式实现,由于目前底层对同步后的文件不做正确性校验,因此这种同步方式仅适用单个集群点的局部内部网络,如果在公网上使用,肯定会出现损坏文件的情况,需要自行添加文件校验机制。
    3)支持主从文件,非常适合存在关联关系的图片,在存储方式上,FastDFS在主从文件ID上做取巧,完成了关联关系的存储。
    优点

    1)系统无需支持POSIX(可移植操作系统),降低了系统的复杂度,处理效率更高
    2)支持在线扩容机制,增强系统的可扩展性
    3)实现了软RAID,增强系统的并发处理能力及数据容错恢复能力
    4)支持主从文件,支持自定义扩展名
    5)主备Tracker服务,增强系统的可用性
    缺点

    1)不支持POSIX通用接口访问,通用性较低
    2)对跨公网的文件同步,存在较大延迟,需要应用做相应的容错策略
    3)同步机制不支持文件正确性校验,降低了系统的可用性
    4)通过API下载,存在单点的性能瓶颈

    应用场景

    1)单集群部署的应用
    2)存储后基本不做改动
    3)小中型文件根据
    目前官方提供的材料,现有的使用FastDFS系统存储容量已经达到900T,物理机器已经达到100台(50个组)

    安装指导_FastDFS

    源码路径:https://github.com/happyfish100/fastdfs

    参考

    https://code.google.com/p/fastdfs/

    http://bbs.chinaunix.net/forum-240-1.html

    http://portal.ucweb.local/docz/spec/platform/datastore/fastdfs

    MooseFS

    MooseFS是一个高可用的故障容错分布式文件系统,它支持通过FUSE方式将文件挂载操作,同时其提供的web管理界面非常方便查看当前的文件存储状态。

    特性

    1)从下图中我们可以看到MooseFS文件系统由四部分组成:Managing Server 、Data Server 、Metadata Backup Server 及Client
    2)其中所有的元数据都是由Managing Server管理,为了提高整个系统的可用性,Metadata Backup Server记录文件元数据操作日志,用于数据的及时恢复
    3)Data Server可以分布式部署,存储的数据是以块的方式分布至各存储节点的,因此提升了系统的整体性能,同时Data Server提供了冗余备份的能力,提升系统的可靠性
    4)Client通过FUSE方式挂载,提供了类似POSIX的访问方式,从而降低了Client端的开发难度,增强系统的通用性

    元数据服务器(master):负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复

    元数据日志服务器(metalogger):负责备份master服务器的变化日志文件,以便于在master server出问题的时候接替其进行工作

    数据存储服务器(chunkserver):数据实际存储的地方,由多个物理服务器组成,负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输;多节点拷贝;在数据存储目录,看不见实际的数据

    优点

    1)部署安装非常简单,管理方便
    2)支持在线扩容机制,增强系统的可扩展性
    3)实现了软RAID,增强系统的 并发处理能力及数据容错恢复能力
    4)数据恢复比较容易,增强系统的可用性5)有回收站功能,方便业务定制
    缺点

    1)存在单点性能瓶颈及单点故障
    2)MFS Master节点很消耗内存
    3)对于小于64KB的文件,存储利用率较低
    应用场景

    1)单集群部署的应用
    2)中、大型文件
    参考

    http://portal.ucweb.local/docz/spec/platform/datastore/moosefsh

    http://www.moosefs.org/

    http://sourceforge.net/projects/moosefs/?source=directory

    GlusterFS

    GlusterFS是Red Hat旗下的一款开源分布式文件系统,它具备高扩展、高可用及高性能等特性,由于其无元数据服务器的设计,使其真正实现了线性的扩展能力,使存储总容量可 轻松达到PB级别,支持数千客户端并发访问;对跨集群,其强大的Geo-Replication可以实现集群间数据镜像,而且是支持链式复制,这非常适用 于垮集群的应用场景

    特性

    1)目前GlusterFS支持FUSE方式挂载,可以通过标准的NFS/SMB/CIFS协议像访问本体文件一样访问文件系统,同时其也支持HTTP/FTP/GlusterFS访问,同时最新版本支持接入Amazon的AWS系统
    2)GlusterFS系统通过基于SSH的命令行管理界面,可以远程添加、删除存储节点,也可以监控当前存储节点的使用状态
    3)GlusterFS支持集群节点中存储虚拟卷的扩容动态扩容;同时在分布式冗余模式下,具备自愈管理功能,在Geo冗余模式下,文件支持断点续传、异步传输及增量传送等特点
    Yuyj GlusterFS.png

    优点

    1)系统支持POSIX(可移植操作系统),支持FUSE挂载通过多种协议访问,通用性比较高
    2)支持在线扩容机制,增强系统的可扩展性
    3)实现了软RAID,增强系统的 并发处理能力及数据容错恢复能力
    4)强大的命令行管理,降低学习、部署成本
    5)支持整个集群镜像拷贝,方便根据业务压力,增加集群节点
    6)官方资料文档专业化,该文件系统由Red Hat企业级做维护,版本质量有保障

    缺点

    1)通用性越强,其跨越的层次就越多,影响其IO处理效率
    2)频繁读写下,会产生垃圾文件,占用磁盘空间

    应用场景

    1)多集群部署的应用
    2)中大型文件根据目前官方提供的材料,现有的使用GlusterFS系统存储容量可轻松达到PB

    术语:

    brick:分配到卷上的文件系统块;
    client:挂载卷,并对外提供服务;
    server:实际文件存储的地方;
    subvolume:被转换过的文件系统块;
    volume:最终转换后的文件系统卷。

    参考

    http://www.gluster.org/

    http://www.gluster.org/wp-content/uploads/2012/05/Gluster_File_System-3.3.0-Administration_Guide-en-US.pdf

    http://blog.csdn.net/liuben/article/details/6284551

    Ceph

    Ceph是一个可以按对象/块/文件方式存储的开源分布式文件系统,其设计之初,就将单点故障作为首先要解决的问题,因此该系统具备高可用性、高性能及可 扩展等特点。该文件系统支持目前还处于试验阶段的高性能文件系统BTRFS(B-Tree文件系统),同时支持按OSD方式存储,因此其性能是很卓越的, 因为该系统处于试商用阶段,需谨慎引入到生产环境

    特性

    1)Ceph底层存储是基于RADOS(可靠的、自动的分布式对象存储),它提供了LIBRADOS/RADOSGW/RBD/CEPH FS方式访问底层的存储系统,如下图所示
    2)通过FUSE,Ceph支持类似的POSIX访问方式;Ceph分布式系统中最关键的MDS节点是可以部署多台,无单点故障的问题,且处理性能大大提升
    3)Ceph通过使用CRUSH算法动态完成文件inode number到object number的转换,从而避免再存储文件metadata信息,增强系统的灵活性

    优点

    1)支持对象存储(OSD)集群,通过CRUSH算法,完成文件动态定位, 处理效率更高
    2)支持通过FUSE方式挂载,降低客户端的开发成本,通用性高
    3)支持分布式的MDS/MON,无单点故障
    4)强大的容错处理和自愈能力5)支持在线扩容和冗余备份,增强系统的可靠性

    缺点

    1)目前处于试验阶段,系统稳定性有待考究

    应用场景

    1)全网分布式部署的应用
    2)对实时性、可靠性要求比较高官方宣传,存储容量可轻松达到PB级别

    源码路径:https://github.com/ceph/ceph

    参考
    http://ceph.com/

    MogileFS

    开发语言:perl

    开源协议:GPL

    依赖数据库

    Trackers(控制中心):负责读写数据库,作为代理复制storage间同步的数据

    Database:存储源数据(默认mysql)

    Storage:文件存储

    除了API,可以通过与nginx集成,对外提供下载服务

    源码路径:https://github.com/mogilefs

    参考

    https://code.google.com/p/mogilefs/wiki/Start?tm=6

    其它参考
    http://blog.csdn.net/qiangweiloveforever/ariticle/details/7566779

    http://weiruoyu.blog.51cto.com/951650/786607

    http://m.blog.csdn.net/blog/junefsh/18079733

    展开全文
  • kubernetes存储系统介绍kubernetes存储系统介绍 前言 无状态服务 普通有状态服务 有状态集群服务 K8S存储系统 普通Volume persistent volume 动态存储供应dynamic provisioning References前言 在K8S运行的服务,从...
  • Ceph分布式存储系统

    千次阅读 2016-09-12 01:38:07
    Ceph是根据加州大学Santa Cruz分校的Sage Weil的博士论文所设计开发的新一代自由软件分布式文件系统,其设计目标是良好的...这些有触角的头足类动物,是对一个分布式文件系统高度并行的形象比喻。 其设计遵循了三个
  • Android存储系统及存储的挂载 Android是基于Linux内核开发的,所以它的文件系统也是跟Linux文件系统类似。 首先我们来看Android存储的分类。 内部存储和外部存储、内置SD卡和外置SD卡 一般的Android手机都有2个存储...
  • 云计算云存储的一些基本概念

    万次阅读 多人点赞 2018-04-12 20:10:04
    我们在学习云计算和云存储之前,需要先了解一些很常见的基本概念,否则在学习过程中和选型时会比较晕。 云计算的三种服务模式:IaaS,PaaS和SaaS 云的分层 任何一个在互联网上提供其服务的公司都可以叫做云计算...
  • 我们在上篇文章已经对比了不同的存储系统之间的区别,本章开始逐步深入记录Ceph的学习和运用。 开源分布式存储系统的对比 Ceph简介 Ceph是一个分布式存储系统,提供对象,块和文件存储,是一个免费开源软件的存储...
  • 计算机系统中的存储系统

    千次阅读 2018-09-27 20:49:53
    计算机系统中包含各种存储器,如CPU内部的通用寄存器组、CPU内的Cache(高速缓存)、CPU外部的Cache、主板上的主存储器、主板外的联机磁盘存储器以及脱机的磁带存储器和光盘存储器等。不同特点的存储器通过适当的...
  • 主存储器与存储系统

    千次阅读 2008-04-12 21:21:00
    主存储器与存储系统1、存储系统的组成1.1、存储器的分类按存储器在计算机系统中的作用分类:高速缓冲存储器:高速缓冲存储器(Cache)位于主存和CPU之间,用于存放正在执行的程序段和数据,以便CPU能高速地使用它们...
  • 操作系统基本概念

    千次阅读 2021-02-25 10:38:59
    正如前面操作系统概念所说的,操作系统的功能和目标为以下三点: 作为计算机系统资源的管理者: 管理CPU、存储、文件和设备等; 作为用户与计算机硬件系统间的接口: 提供用户对计算机硬件操作的命令接口和程序接口...
  • 1.2.个分布式系统构成的分布式系统的超级,可以构建云服务的分布式系统。 2.普通的分布式系统的构成 2.1简单分布式的组合构成的服务系统 一般的分布式系统都具有三层架构层次,hand,master,svr。master...
  • 操作系统概念学习笔记 5操作系统管理简述进程管理处于执行中的程序被称作进程。进程需要一定的资源(包括cpu时间、内存、文件、I/O设备)来完成任务。这些资源可以在进程创建时分配给进程,也可以在执行时分配给进程...
  • 数据库系统概念

    千次阅读 2018-06-26 21:27:13
    实例:特定时刻存储在数据库中的信息的集合称作数据库的一个实例。 模式:数据库的总体设计称作数据库模式。 物理数据独立性:应用程序如果不依赖与物理模式,它们就被称为是具有物理独立性,因此即使物理模式改变...
  • 操作系统概念 学习笔记

    万次阅读 多人点赞 2019-03-26 23:01:14
    目录 第一章、导论 ...1.2.2 存储结构 1.2.3 I/O结构 1.3 计算机系统体系结构 1.4 .操作系统结构 1.5 操作系统操作 1.5.1 操作系统的双重模式操作 1.5.2 定时器 第二章 操作系统结构 2.1 操...
  • IO子系统层次结构

    千次阅读 多人点赞 2016-10-22 14:30:54
    这些特征基本上都是层次系统通用的特性,不必说。IO系统分类的层次通常是5层。列举如下: 用户层IO软件 设备独立性软件 设备驱动程序 中断处理程序 硬件 首尾两个不用解释都能明白,最抽象的当然是用户看到的那些...
  • 存储知识学习之--IP网络存储iSCSI的概念与工作原理 本章主要介绍基于IP SAN的网络存储iSCSI。iSCSI技术以其低廉的构建成本和优秀的存储性能,博得了很CIO和存储管理员的喜爱,目前陆续进入企业应用领域,推动了...
  • 常见开源分布式存储系统

    万次阅读 2017-04-20 19:49:20
    系统整体对比 对比说明 /文件系统 TFS FastDFS MogileFS MooseFS GlusterFS Ceph 开发语言 C++ C Perl C C C++ 开源协议...
  •  分布式存储系统是大量普通 PC 服务器通过 Internet 互联,对外作为一个整体提供存储服务。  分布式存储系统有如下特征:可扩展,低成本,高性能,易用。  分布式存储系统的挑战主要在于数据、 态信息的持 ,...
  • 开源分布式存储系统介绍

    千次阅读 2014-01-10 13:45:57
    系统整体对比 对比说明\文件系统 TFS FastDFS MogileFS MooseFS GlusterFS Ceph 开发语言 C++ C Perl C C C++ 开源协议 GPL V2 GPL V3 GPL GPL V3 ...数据存储方式 块 文件/Trunk 文件 块 文件/
  • [操作系统] 文件系统基本概念

    千次阅读 2017-12-08 11:09:51
    文件系统基本概念 为什么要使用文件系统 什么是文件 文件命名 文件结构 文件类型 文件存取 文件属性 目录系统 路径名
  • 论述层次模型的概念 举例子: 满足下面的基本层次联系的集合为层次模型 1)有且只有一个节点没有双亲节点,这个结构称为根节点 (2)根以外的其他结点有且只有一个双亲节点。 层次模型的实例 (1)教员学生层次数据库模型...
  • 大话存储系列14——集群文件系统

    千次阅读 2013-03-19 22:01:10
    文件系统是操作系统的一个重要组成部分,通过对操作系统所管理的存储空间的抽象,向用户提供统一的、对象化的访问接口,屏蔽对物理设备的直接操作和资源管理。 根据计算环境和所提供功能的不同,文件系统可划分为四...
  • 数据库系统概念期中考知识点整理

    万次阅读 多人点赞 2018-11-10 16:12:09
    数据库系统概念期中考知识点整理 转眼间学期就已经过半了,也迎来了几个科目的期中考,数据库首当其冲。前几天忙着各种复习数据库,手写了一份挺详细的复习提纲,记录了比较经常考查的知识点 如有错误,欢迎指出...
  • 1. Agent系统(MAS) 1) 定义 由分布在网络上的个问题求解器松散耦合而成的大型复杂系统,这些问题求解器相互作用以解决由单一个体的能力知识所不能处理的复杂问题。   2) 特点   每一主体具有有限信息...
  • 文件系统以及硬盘分区概念

    千次阅读 2018-08-23 23:31:43
    文件系统和硬盘分区基本概念介绍 文件系统:是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。 从系统角度来看,文件...
  • 这些操作系统概念,保你没听过!

    千次阅读 多人点赞 2020-02-10 12:40:45
    操作系统概念 大部分操作系统提供了特定的基础概念和抽象,例如进程、地址空间、文件等,它们是需要理解的核心内容。下面我们会简要介绍一些基本概念,为了说明这些概念,我们会不时的从 UNIX 中提出示例,相同的...
  • 一、计算机系统结构的概念1.1 计算机系统层次结构划分为多级层次结构的优点: (1)便于理解计算机的整体工作概念及目前软硬件的作用和地位; (2)便于认识语言的实质和实现方法; (3)便于搜索虚拟机的新的实现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 141,680
精华内容 56,672
关键字:

多层次存储系统的概念