精华内容
下载资源
问答
  • 计算机存储的发展(块存储,文件存储,对象存储)

    万次阅读 多人点赞 2018-09-15 15:04:08
    文件存储 块存储和文件存储异同: 对象存储 1、对象 2、对象存储设备 3、元数据服务器(Metadata Server,MDS) 4、对象存储系统的客户端Client 三者之间异同比较 参考文献 如果要实现一个计算机,那么这个...

    如果要实现一个计算机,那么这个计算机一定要有以下的三个部分构成:计算、存储和网络。计算一般指的是CPU和内存的搭配,存储一般就是指硬盘了,网络指的是网卡的管理和配置。

    本篇文章,主要讲解有关块存储、文件存储、对象存储这三者之间的对比。每一种存储都有对应的实现方法。

    块存储

    块存储又有两种常见的形式,DAS和SAN。DAS即直接连接存储(Direct Attached Storage),SAN即存储区域网络(Storage Area Network)。

    DAS

    块存储是我们最常用的一种存储模式。比如个人PC上的硬盘,服务器上的硬盘,外置设备通过SCSI或者FC接口直接连接到电脑上的。

    这种存储方式有一种很大的缺陷,其存储性能瓶颈来自于自家PC电脑或者服务器的卡槽的多少。比如我们的笔记本一般只能装一个硬盘+SSD基本上已经没有位置再做扩展了。也就是DAS的性能瓶颈来自于主板的卡槽数量。很难做scale out扩展(即横向扩展)。

    这里写图片描述

    事实上,这种DAS存储模式,一般在中小型企业汇总应用十分广泛。它更依赖主机的操作系统来实现数据的IO读写、数据管理、数据备份等工作。

    但是这种存储模式也存在一定的缺点。比如可管理性差、弹性扩展能力弱,难以跟上IT发展趋势等问题。举例来讲,一台服务器/电脑只会配备固定容量的DAS存储,那么如果容量不够用,存储空间太小,就很难从内部着手实现弹性扩展(外部扩展容量也存在弊端),如果存储空间太大还会导致资源浪费,这一点在服务器领域尤为明显。

    补充知识点:SCSI接口是什么


    SCSI(Small Computer System Interface)小型计算机系统接口,一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。 SCSI是一种智能的通用接口标准。

    SCSI是一种计算机系统接口的标准

    SCSI是一种I/O技术

    SCSI规范了一种并行的I/O总线和相关的协议

    SCSI的数据传输方式是以块的方式进行的

    SAN

    对于用户来说,SAN好比是一块大磁盘,用户可以根据需要随意将SAN格式化成想要的文件系统来使用。SAN在网络中通过iSCSI(IPSAN)协议连接,属block及存储,但可扩展性较差。

    根据SAN的实现形式来看,其实是通过光交换机,将各块硬盘连接起来,然后通过ISCSI协议来传递数据。

    在我看来,其实是通过FC交换机解决了机器主板只有几个卡槽的问题,利用FC交换机,就仿佛实现了这样一种机制,即我们拥有一个无限卡槽的主板,上面都是接口,你可以通过这个接口插上你的硬盘。

    SAN是一个采用网状通道(简称FC)技术,通过FC交换机连接存储阵列和服务器主机,建立专用于数据存储的区域网络。

    我们可以从定义中看出,这是一个专用于企业级应用的存储方式。可以简单理解为一个在高度网络中,提供在计算机与存储系统之间的数据传输。
    这里写图片描述

    从理论上来讲,SAN支持数以百计的磁盘,提供了海量的存储空间,解决了大容量存储问题;从逻辑层面,这个海量空间可以按需要分成不同大小的LUN,再分配给服务器,也解决了只需要小容量存储的问题。

    可以说,SAN的出现,适应了信息化发展的大趋势,它将计算与存储分离,增强了存储扩张的弹性。毕竟如今联网设备越来越多,数据量越来越大,我们对存储需求也越来越强。SAN“拉帮结伙”的特性让存储弹性更大,更方便扩展容量。

    同时,介于独特的存储结构,SAN需要通过光纤交换机连接存储阵列和服务器,建立专用数据存储的网络。

    文件存储

    再说说文件集存储,典型代表–NAS。对于用户来说,NAS好比是一个共享文件夹,文件系统已经存在,用户可以直接将自己的数据存放在NAS上。NAS以文件为传输协议,开销很大,不利于在高性能集群中使用。

    NAS是一种通过网络达成存储目的的设备,NAS传输数据依靠的是TCP/IP网络协议栈,这是NAS存储于上文的DAS和SAN存储最大的不同之处。

    NAS是标准的文件级存储方法,采用网络技术(TCP/IP、ATM、FDDI),通过网络交换机连接存储系统和服务器主机来建立存储私网。其主要特征是把存储设备、网络接口和以太网技术集成在一起,直接通过以太网网络存取数据。能够快速实现部门级存储容量需求与文件传输需求。

    这里写图片描述

    实现文件存储的方式有很多,其中比较常用的有以下的几种,并且经常运用在企业运用中。ftp协议、nfs协议、samba协议等。

    比较下块存储和文件存储的异同,举个例子而言,有三块硬盘,使用光交换机连接之后,把光交换机和服务器进行直接连接,服务器就会单纯的以为自己是有一块儿这么大的硬盘的,要使用的话,需要对这块硬盘进行分区,格式化为某种文件系统,然后就可以使用了;同样是三块硬盘,我分别把这三块硬盘装在主机A,B,C上,分区、格式化为某种文件系统,比如格式化为XFS文件系统,然后我以共享文件夹的形式把主机A的/data目录使用NFS共享给B和C,这就是文件存储。

    块存储和文件存储异同:

    • 数据传输方式不同:块存储依靠SCSI或者ISCSI接口,以块方式交换数据,数据传输速度快;文件存储依靠TCP/IP协议栈进行数据传输,网络带宽是I/O的性能瓶颈。

    • 文件系统的位置:NAS和SAN最本质的区别就是文件管理系统在哪里,如图所示,SAN结构中,文件管理系统(FS)分别在每一个应用服务器上面,而NAS则是每个应用服务器通过网络共享协议,使用同一个文件管理系统。即NAS和SAN存储系统的区别就是NAS有自已的文件管理系统。

    • 使用方式不同:块存储设备使用的时候,还需要进一步进行分区,将设备格式为某种文件系统才可以继续使用;而文件存储就相当于你多了一个共享文件夹,文件存储带着自己本身的文件系统。

    对象存储

    总体上来讲,对象存储同兼具SAN高速直接访问磁盘特点及NAS的分布式共享特点。

    • SAN(Storage Area Network)结构
      采用SCSI 块I/O的命令集,通过在磁盘或FC(Fiber Channel)级的数据访问提供高性能的随机I/O和数据吞吐率,它具有高带宽、低延迟的优势,在高性能计算中占有一席之地,如SGI的CXFS文件系统就是基于SAN实现高性能文件存储的,但是由于SAN系统的价格较高,且可扩展性较差,已不能满足成千上万个CPU规模的系统。
    • NAS(Network Attached Storage)结构
      它采用NFS或CIFS命令集访问数据,以文件为传输协议,通过TCP/IP实现网络化存储,可扩展性好、价格便宜、用户易管理,如目前在集群计算中应用较多的NFS文件系统,但由于NAS的协议开销高、带宽低、延迟大,不利于在高性能集群中应用。

    对象存储结构:

    核心是将数据通路(数据读或写)和控制通路(元数据)分离,并且基于对象存储设备(Object-based Storage Device,OSD)构建存储系统,每个对象存储设备具有一定的智能,能够自动管理其上的数据分布。

    对象存储结构组成部分(对象、对象存储设备、元数据服务器、对象存储系统的客户端):

    这里写图片描述

    1、对象

    对象是系统中数据存储的基本单位,一个对象实际上就是文件的数据和一组属性信息(Meta Data)的组合,这些属性信息可以定义基于文件的RAID参数、数据分布和服务质量等,而传统的存储系统中用文件或块作为基本的存储单位,在块存储系统中还需要始终追踪系统中每个块的属性,对象通过与存储系统通信维护自己的属性。在存储设备中,所有对象都有一个对象标识,通过对象标识OSD命令访问该对象。通常有多种类型的对象,存储设备上的根对象标识存储设备和该设备的各种属性,组对象是存储设备上共享资源管理策略的对象集合等。

    这里写图片描述

    对象的层次理解:
    这里写图片描述

    2、对象存储设备

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

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

    MDS控制Client与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文件系统接口,允许应用程序像执行标准的文件系统操作一样。

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

    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。

    三者之间异同比较

    存储类型 数据传输方式 适应场景 优点
    块存储 SCSI/ISCSI接口 小型机房 速度快
    文件存储 NFS/FTP等 局域网环境 可扩展性高
    对象存储 http协议 互联网环境,异地存储 速度快,且扩展性高,高可用

    对象存储相比块存储、文件存储的一个最本质的区别是无层次结构。我们都知道,一般的存储(比如你自己的PC的文件系统)是有一个目录树概念的,要找到一个文件需要先找到这个文件所属的目录。而对象存储是没有文件目录树这个概念的,所有的数据都在同一个层次中,仅仅通过数据的唯一地址标识来识别并查找数据。

    块存储: 是和主机打交道的, 如插一块硬盘
    文件存储: NAS, 网络存储, 用于多主机共享数据
    对象存储: 跟你自己开发的应用程序打交道, 如网盘

    参考文献

    NFS深入了解
    SI/iSCSI及SAS、NAS、SAN的基本介绍
    NAS网络存储与SAN、DAS的区别
    NFS工作原理
    什么是对象存储

    展开全文
  • 彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑 1、Android中内部存储,外部存储的概念 2、清除数据和清除缓存到底清除了什么数据 3、/storage/sdcard,/sdcard,/mnt/sdcard,/storage/...

    前言:

    对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定是必不可少的。对于很多做Android开发的同学来说,可能认为文件存储很简单,调用一些诸如getFilesDir,getExternalStorageDirectory方法行了,但是虽然说它们会调用相应的方法来实现简单的数据存储。但是他们未必就搞懂了他的数据到底存在了哪里,以及他的数据是否存对了地方,或者是否做好了版本兼容。下面我将从这几个地方来解答大家常见的困惑:
    1、Android中内部存储,外部存储的概念
    2、不同安卓版本下getDataDirectory,getFilesDir,getCacheDir,getDir,getExternalStorageDirectory,getExternalStoragePublicDirectory,getExternalFilesDir,getExternalCacheDir,getExternalCacheDir,getRootDirectory等方法的区别和联系
    3、清除数据和清除缓存到底清除了什么数据
    4、/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0之间的关系
    5、一张图看懂Ram,Rom,以及扩展存储(TF卡)的区别;内部存储,外部存储的区别。

    一、Android中内部存储,外部存储的概念

    内部存储
    概念:注意内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
    访问内部存储的API方法:
    1、Environment.getDataDirectory()
    2、getFilesDir().getAbsolutePath()
    3、getCacheDir().getAbsolutePath()
    4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath()
    外部存储
    概念:最容易混淆的是外部存储,因为老的Android系统的跟新的Android系统是有差别的,很多人去网上查找资料,看了一下以前的资料,又看了一下现在的资料,但是发现它们说法不一样然后就困惑了。首先说一个大家普遍的概念“如果在pc机上是区分外部存储和内部存储的话,那么电脑自带的硬盘算是内部存储,U盘或者移动硬盘就是外部存储了。”因此很多人带着这样的理解去看待安卓手机,把内置存储(机身存储)当做内部存储,而把扩展的SD卡当做是外部存储。这么认为确实没错,因为在4.4(API19)以前的手机上确实是这样的,手机自身带的存储卡就是内部存储,而扩展的SD卡就是外部存储。但是从4.4的系统开始,很多的中高端机器都将自己的机身存储扩展到了8G以上,比如有的人的手机是16G的,有的人的手机是32G的,但是这个16G,32G是内部存储吗,不是的!!!,它们依然是外部存储,也就是说4.4系统及以上的手机将机身存储存储(手机自身带的存储叫做机身存储)在概念上分成了”内部存储internal” 和”外部存储external” 两部分。既然16G,32G是外部存储,那有人又有疑惑了,那4.4系统及以上的手机要是插了SD卡呢,SD卡又是什么呢,如果SD卡也是外部存储的话,那怎么区分机身存储的外部存储跟SD卡的外部存储呢?对,SD卡也是外部存储,那怎么区分呢,在4.4以后的系统中,API提供了这样一个方法来遍历手机的外部存储路径:

    File[] files;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
        for(File file:files){
            Log.e("main",file);
        }
    }

    如果你的手机插了SD卡的话,那么它打印的路径就有两条了,例如我的华为荣耀7插了SD卡,它的结果如下:
    /storage/emulated/0/Android/data/packname/files/mounted
    /storage/B3E4-1711/Android/data/packname/files/mounted
    其中/storage/emulated/0目录就是机身存储的外部存储路径
    而/storage/B3E4-1711/就是SD卡的路径
    他们统称为外部存储
    访问外部存储的API方法:
    1、Environment.getExternalStorageDirectory().getAbsolutePath()
    2、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath()
    3、getExternalFilesDir(“”).getAbsolutePath()
    4、getExternalCacheDir().getAbsolutePath()
    大家对Android的外部存储会产生疑问,主要是现在很多的手机已经从物理上看不到外部存储了,以前的手机都有,就是那种黑色的内存卡,8G,16G,32G的,可以像U盘一样插拔,以前很流行,存储空间不够了,就去买个内存卡(准确说是SD卡,说成内存卡又会引起误解)回来,后来的手机比如现在我用的华为荣耀7,厂家已经把机身存储扩展到了16G了,只是在存储概念上了分为了内部存储(内部internal)和外部存储(外部external),其实它们都集成在一起了。当然如果你觉得16G不够用,那他支持通过插SD卡来扩充容量吗?支持的,荣耀7为例,它是三合二卡槽。卡槽1:Nano SIM卡;卡槽2:Nano SIM卡或Micro SD卡。默认卡槽1为4G主卡,可以在设置中更改4G主卡卡槽;不支持热插拔,插拔卡托后需重启手机。这样插入的SD卡也属于外部存储。所以手机的外部存储可能包含两部分,一是机身存储的外部存储部分,还有一个是SD卡部分

    二、不同Android版本下getDataDirectory,getFilesDir,getCacheDir,getDir,getExternalStorageDirectory,getExternalStoragePublicDirectory,getExternalFilesDir,getExternalCacheDir,getExternalCacheDir,getRootDirectory的区别和联系

    上面这些方法,我们可能似曾相识,但是对于有些同学来说却又很难分清出,主要还是不同的Android版本的问题。为了方便大家理解,我先简要介绍以上各个方法,为方便大家理解我把这些方法的结果打印出来(以下的打印结果是基于荣耀7的(系统版本6.0):
    1、Environment.getDataDirectory() = /data
    这个方法是获取内部存储的根路径
    2、getFilesDir().getAbsolutePath() = /data/user/0/packname/files
    这个方法是获取某个应用在内部存储中的files路径
    3、getCacheDir().getAbsolutePath() = /data/user/0/packname/cache
    这个方法是获取某个应用在内部存储中的cache路径
    4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() = /data/user/0/packname/app_myFile
    这个方法是获取某个应用在内部存储中的自定义路径
    方法2,3,4的路径中都带有包名,说明他们是属于某个应用
    …………………………………………………………………………………………
    5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0
    这个方法是获取外部存储的根路径
    6、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = /storage/emulated/0
    这个方法是获取外部存储的根路径
    7、getExternalFilesDir(“”).getAbsolutePath() = /storage/emulated/0/Android/data/packname/files
    这个方法是获取某个应用在外部存储中的files路径
    8、getExternalCacheDir().getAbsolutePath() = /storage/emulated/0/Android/data/packname/cache
    这个方法是获取某个应用在外部存储中的cache路径
    注意:其中方法7和方法8如果在4.4以前的系统中getExternalFilesDir(“”)和getExternalCacheDir()将返回null,如果是4.4及以上的系统才会返回上面的结果,也即4.4以前的系统没插SD卡的话,就没有外部存储,它的SD卡就等于外部存储;而4.4及以后的系统外部存储包括两部分,getExternalFilesDir(“”)和getExternalCacheDir()获取的是机身存储的外部存储部分,也即4.4及以后的系统你不插SD卡,它也有外部存储,既然getExternalFilesDir(“”)和getExternalCacheDir()获取的是机身存储的外部存储部分,那么怎么获取SD卡的存储路径呢,还是通过上面提到的getExternalFilesDirs(Environment.MEDIA_MOUNTED)方法来获取了,不知道Android有没有提供相关的API接口来获取SD卡的存储路径,大家可以去查资料。又重复了上面的话,主要是提醒大家要注意不同的Android版本是有差别的,这个最坑了。
    …………………………………………………………………………………………
    Environment.getDownloadCacheDirectory() = /cache
    Environment.getRootDirectory() = /system
    这两个方法没什么说的了,每个版本的android系统都一样
    …………………………………………………………………………………………
    从上面我们很清楚的可以看到上面的方法可以分为三类,我用横线隔开了。第一类是位于根目录/data下;还有一类是位于根目录/storage下,可以看到调用它们的API方法都带了一个External;另外一类不在/data下也不再/storage下,比如系统文件/system,或者缓存文件/cache。
    /data目录下的文件物理上存放在我们通常所说的内部存储里面
    /storage目录下的文件物理上存放在我们通常所说的外部存储里面
    /system用于存放系统文件,/cache用于存放一些缓存文件,物理上它们也是存放在内部存储里面的
    下面来看一下大家常见的疑问
    疑问1、那getFilesDir().getAbsolutePath()和getCacheDir().getAbsolutePath()有什么区别呢?
    其实是没有什么区别的,我们可以看下面一张图:
    这里写图片描述
    getFilesDir获取的是files目录,getCacheDir获取的是cache目录,它们位于同一级目录,只是为了用来存放不同类型的数据的,由文件名不难看出:cache下存放缓存数据,databases下存放使用SQLite存储的数据,files下存放普通数据(log数据,json型数据等),shared_prefs下存放使用SharedPreference存放的数据。这些文件夹都是由系统创建的。
    疑问2、getFilesDir().getAbsolutePath()和getExternalFilesDir(“”).getAbsolutePath()有什么区别呢?
    我们先看它们的路径:
    /data/user/0/packname/files
    /storage/emulated/0/Android/data/packname/files
    很显然这两个的区别是一个在内部存储里面,一个在外部存储里面,这是它们的区别。它们的共同点呢,就是它们的路径都带有包名,表明是这个APP的专属文件,这类文件应该是随着app卸载而一起被删除的,并且我们在设置里面清除该应用的数据时,这两个文件夹下的数据都会被清除。
    疑问3、什么是APP专属文件?
    上面疑问2我们提到了专属文件,所谓专属文件就是它是属于某个具体的应用的,他的文件路径都带有相应的包名,当APP卸载时,它们会随应用一起删除,当我们在设置里面手动清除某个应用数据时(不是清除缓存),它们也会一起被清掉。Android使用这种专属文件的目的就是为了方便文件管理,避免文件随意存储,显得很乱,另一个目的就是为了当应用被卸载时不会留下很多垃圾文件。
    疑问4、既然内部存储与外部存储都有APP专属文件,那么我们该使用哪个呢?
    内部存储与外部存储都有APP专属文件,我们该用哪个呢,很显然应该用外部存储的,因为内部存储本身就比较小,而且已经存储了一些系统的文件,因此内部存储我们尽量不要去使用。但是当手机没有外部存储时,我们还是得使用内部存储,一般程序员会做判断是否有外部存储,没有再使用内部存储,代码如下:

    public static String getFilePath(Context context,String dir) {
        String directoryPath="";
        if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {//判断外部存储是否可用 
            directoryPath =context.getExternalFilesDir(dir).getAbsolutePath();
            }else{//没外部存储就使用内部存储  
            directoryPath=context.getFilesDir()+File.separator+dir;
            }
            File file = new File(directoryPath);
            if(!file.exists()){//判断文件目录是否存在
            file.mkdirs();
            }
        return directoryPath;
    }

    为了让大家更好地理解不同版本的Android系统的存储差异我做了下列一份说明表:
    比较的是我向getFilesDir().getAbsolutePath()路径下和getExternalFilesDir(“”).getAbsolutePath()路径各写入19.48M数据前后的差别
    表一、4.1.1系统,带有SD卡 (真机)

    存储位置 获取路径的方法 容量(写入前) 容量(写入后) 备注
    /data/data/packname/files getFilesDir() 1.59GB 1.57GB 内部存储
    /storage/sdcard0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    1.47GB 1.45GB 外部存储(SD卡)

    表二、4.1.1系统,不带有SD卡 (真机)

    存储位置 获取路径的方法 容量(写入前) 容量(写入后) 备注
    /data/data/packname/files getFilesDir() 1.59GB 1.47GB 内部存储
    路径不存在 getExternal
    StorageDirectory()
    ~~~ ~~~ 没插SD卡

    表三、4.2.1系统,带有SD卡 (模拟器)

    存储位置 获取路径的方法 容量(写入前) 容量(写入后) 备注
    /data/data/packname/files getFilesDir() 1.85GB 1.83GB 内部存储
    /mnt/sdcard/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    98.42MB 78.93MB 外部存储(SD卡)

    表四、4.4.2系统,带有SD卡 (真机)

    存储位置 获取路径的方法 容量(写入前) 容量(写入后) 备注
    /data/data/packname/files getFilesDir() 2.22GB 2.18GB 内部存储
    /storage/emulated/0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    2.20GB 2.16GB 机身外部存储
    /storage/sdcard1 getExternalFilesDirs 1.47GB 1.47GB 外部存储(SD卡
    没有向其写数据,只是读取)

    表五、4.4.2系统,不带有SD卡 (真机)

    存储位置 获取路径的方法 容量(写入前) 容量(写入后) 备注
    /data/data/packname/files getFilesDir() 2.22GB 2.18GB 内部存储
    /storage/emulated/0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    2.20GB 2.16GB 机身外部存储

    表六、6.0.0系统,带有SD卡 (真机)

    存储位置 获取路径的方法 容量(写入前) 容量(写入后) 备注
    /data/user/0/packname/files getFilesDir() 11.94GB 11.90GB 内部存储
    /storage/emulated/0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    11.92GB 11.88GB 机身外部存储
    /storage/B3E4-1711 getExternalFilesDirs 1.47GB 1.47GB 外部存储(SD卡)
    没有向其写数据,只是读取

    表七、6.0.0系统,不带有SD卡 (真机)

    存储位置 获取路径的方法 容量(写入前) /storage/容量(写入后) 备注
    /data/user/0/packname/files getFilesDir() 11.93GB 11.89GB 内部存储
    /storage/emulated/0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    11.91GB 11.87GB 机身外部存储

    注:上述容量指的是该路径所在根路径的可用容量,比如/data/data/packname/files的容量是指/data的可用容量,/storage/sdcard0/Android/data/packname/files指的是/storage/sdcard0的可用容量,而一般在4.4及以上的系统中,我们很少操作SD

    三、清除数据和清除缓存到底清除了什么数据

    这个很容易搞混,为什么呢?通过上面我们知道:
    /data/user/0/packname/files它是用来存储普通数据的
    /data/user/0/packname/cache它是用来存储缓存数据的
    所以很多人就以为我清除数据时清除的肯定就是files下的数据,而我清除缓存数据时清除的肯定就是cache下的数据,但是事实却不是这样的。正确应该是:
    清除缓存:我们知道应用程序在运行过程中需要经过很多过程,比如读入程序,计算,输入输出等等,这些过程中肯定会产生很多的数据,它们在内存中,以供程序运行时调用。所以清除缓存清除的是APP运行过程中所产生的临时数据。
    清除数据:清除数据才是真正的删除了我们保存在文件中的数据(永久性数据,如果不人为删除的话会一直保存在文件中)例如当我们在设置里面清除了某个应用的数据,那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。

    四、/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0之间的关系

    从上面的表中我们可以发现,在4.1系统中,getExternalStorageDirectory方法获取到的路径为/storage/sdcard0;4.2系统中getExternalStorageDirectory方法获取到的路径为/mnt/sdcard,因为4.2是模拟器打印的结果,如果是真机的话也是/storage/sdcard0;4.4的getExternalStorageDirectory方法获取到的路径为/storage/emulated/0,它的SD卡存储路径为/storage/sdcard1;6.0的getExternalStorageDirectory方法获取到的路径为/storage/emulated/0,它的SD卡存储路径为/storage/B3E4-1711;另外根据测试在4.0上getExternalStorageDirectory方法获取到的路径为/mnt/sdcard。所以在真机上,getExternalStorageDirectory获取到的路径如下表所示:

    系统版本 结果
    4.0 /mnt/sdcard
    4.1 /storage/sdcard0
    4.2 /storage/sdcard0
    4.4 /storage/emulated/0
    6.0 /storage/emulated/0

    要理解/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0之间的关系,我们需要先要了解一下linux文件挂载的概念,关于挂载大家可以自行去百度。还有我们不明白为什么会有有/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0这么多目录,让人看起来眼花缭乱,要详细了解请仔细看下面的文章,下面的文章是我摘自关于android的4.2的0文件夹的详解
    —- android 4.0 —-
    在galaxy nexus(GN)手机上userdata分区很大,被挂在/data目录,用户的数据通常是放在sd卡上,然而gn是没有sd卡的,所以google想了一个办法,就是虚拟一个。
    所以,在userdata分区下有个目录叫media,是内置sd卡的数据存储位置,使用fuse技术将/data/media虚拟成为一个叫做/dev/fuse的设备,为了让程序能认出来,被同时挂载在 /mnt/sdcard 目录,又为了兼容以前的程序,做了一个快捷方式(linux系统里叫软连接) /sdcard 指向的是 /mnt/sdcard .
    当然,这些都是4.0的做法。
    —- android 4.1 —-
    在4.1里,同样也会使用fuse技术,/dev/fuse 会被同时挂载到/storage/sdcard0 目录,这个sdcard0表示第一个sd卡(如果有外置sd卡,那会多一个 /storage/sdcard1,比如我的xoom), /sdcard 软连接会指向 /storage/sdcard0 ,此时/mnt/sdcard 也是个软连接,会指向/storage/sdcard0。
    如果你通过otg线接U盘,会被挂载到 /storage/usb0目录,stickmount这个软件为了让图库、快图、mx player等软件,能看到u盘里的数据,又同时挂载到 /storage/sdcard0/usStorage/sda1.
    也许你会问,为什么不是usb0,而是sda1,这是linux的对硬盘的命名方式,如果你的u盘有多个分区,就分别是sda1,sda2这样一直排下去了。
    —- android 4.2 —-
    好了,我们开始说4.2系统。
    谷歌是不是没事干啊,非要给android搞个多用户,你想想啊,在中国,可能因为经济问题,家里不是每人一个电脑,在美国,几乎需要用电脑的人,都会自己有一台或多台,一台电脑多人用的情况少之又少,这就是为什么叫PC了,顾名思义,个人电脑。像手机和平板这些东西,更加私人化了,很少公用了吧,我想在中国也是如此吧。
    当然,谷歌也不完全是抽风,因为他有更大的战略部署,而且平板也的确有多人用的可能。
    所以谷歌搞出来一个多用户,那每个人的应用、数据、个性配置都要分开吧。 应用和个性配置好弄,想想啊,通过权限控制,每人只能看自己的应用就行了,桌面也可以用自己的。
    那数据怎么办????
    好吧,调整用户数据的挂载结构。android 4.2,同样也会使用fuse技术/dev/fuse 会被挂载到/storage/emulated/0 目录,为什么是0呢,你还记得上边的sdcard0吧,第一个的意思。(如果有第二个,应该就是/storage/emulated/1,我们的三儿子没有外置sd卡,所以没法验证)
    为了兼容以前,同时挂载到 /storage/emulated/legacy (故名思议,传统的),还建立三个软连接 /storage/sdcard0 ,/sdcard,/mnt/sdcard ,都指向 /storage/emulated/legacy
    很多同学可能不会认真看上面,这里我就简单总结一下:
    1、其中sdcard/、mnt/sdcard、storage/sdcard0、storage/emulated/0、storage/emulated/legacy都是同一个路径的不同”指针“,指向的是同一个地方,只是不同Android版本的叫法不一样。
    2、如果大家想了解每个版本的外部存储路径,同学们可以通过获取getExternalStorageDirectory方法的打印结果进行对比

    五、一张图看懂Ram,Rom,以及扩展存储(TF卡)的区别;内部存储,外部存储的区别。

    这里写图片描述
    1、首先我们来弄清几个概念,内存,内部存储,外部存储,机身存储(内置存储)。
    1.1内存;我们在英文中称作memory,内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,所以说它是用于计算机运行时的,它不是用来存储数据的。
    1.2内部存储,外部存储;内部存储我们称为InternalStorage,外部我们称为ExternalStorage,这两个概念来自于早期的Android智能机,4.4以前,内置存储就是内部存储,外置SD卡就是外置存储。我们通过getDataDirectory就可以获取内置存储根路径,通过getExternalStorageDirectory就可以获取外置SD卡根路径。4.4以后外部存储就包含两部分了,其中通过getExternalStorageDirectory获取的是机身存储的外部存储,而外置SD卡我们则需要通过getExternalDirs遍历来获取了。
    1.3机身存储;机身存储是指手机自身携带的存储空间,出厂时就已经有了,4.4以前机身存储就是内部存储,4.4及以后机身存储包含了内部存储和外部存储。
    2、Ram,Rom,以及扩展存储(TF卡)的概念。从图中我们可以看到,一个手机里面有内存,手机内置存储,以及SD卡, 它们分别是Ram,Rom,以及TF卡,这三种卡的性能,材质及价格都不一样,都有各自的用处。
    3、内部存储,外部存储的概念。很多人对这个存在误解,认为机身存储就是内存,而SD卡才叫外部存储,这其实是不对的,不同的Android版本是有差别的,请看第1条。
    最后附上我的例子:
    http://download.csdn.net/download/u010937230/9930396

    展开全文
  • 本次代码的环境: 运行平台: Windows Python版本: Python3.x IDE: PyCharm 一 概述 数据存储是爬虫的一个很重要的部分,爬虫爬出来的数据要不存到...基于这两个存储思想,保存形式可以动作多样,文件存储有:T...

    原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080
    本次代码的环境:
    运行平台: Windows
    Python版本: Python3.x
    IDE: PyCharm

    一 概述

    数据存储是爬虫的一个很重要的部分,爬虫爬出来的数据要不存到文件中,要不就存到数据库中。基于这两个存储思想,保存形式可以动作多样,文件存储有:TXT、JSON、CSV等;数据库存储,如关系型数据库SQLService,非关系型数据库MongoDB、Redis等。这篇文章要介绍的内容是文件存储的TXT存储。其实这部分内容在爬虫中最基本的存储方式,因为把数据保存到TXT文件中的方法非常简单,并且TXT文件几乎在任何平台上都兼容。当然,它的缺点就是:内容都存到一个文本文件中,不利于检索,如果对检索要求不高的内容,可以采取此方式进行存储。
    在这里插入图片描述

    详细讲解

    比如这篇博文的内容:Python爬虫之BeautifulSoup+Requests爬取喜欢博主的全部博文(七)前面先是通过requests将源代码down下来,然后通过BeautifulSoup把相关的文本信息找到,其中写为TXT文件的函数代码如下:

    def write(self):
           folder_path = './CSDN'
           i = 0
           if os.path.exists(folder_path) == False:
               os.makedirs(folder_path)
           for herf in self.href_list:
               path = folder_path+'/{}'.format(i+1)
               txtPath = path + '/{}'.format(i + 1) + '.txt'
               if os.path.exists(path) == False:
                   os.makedirs(path)
                   open(txtPath, 'w')
               print(herf)
               with open(txtPath, 'a', encoding='utf-8') as f:
                   f.write(self.article_content)
                   f.close()
    

    写到TXT文件的示意图如图1所示:
     


    在这里插入图片描述
    图1

    因为主要为 了演示文件保存的方式,所以大部分内容都已经省略,保存为TXT文件,这个例子是利用Python提供的open()方法打开一个文本文件,用的是一个简化写法,如果是不简化是file = open("XX.txt","a",encoding = "utf-8") file.write() file.close(),获取一个 文件操作对象,这里赋值为file,接着利用file对象的write()方法将提取的内容写人文件,最后调用close()方法将其关闭,这样抓取的内容即可成功写人文本中了。open()方法的第一个参数即要保存的目标文件名称,第二个参数为a,代表以追加方式写人到文本。另外,还指定了文件的编码为utf-8最后,写人完成后,还需要调用close()方法来关闭文件对象。

    三 打开方式

    在刚才的实例中,open()方法的第二个参数设置成了a,这样在每次写人文本时不会清空源文件而是在文件末尾写人新的内容,这是一种文件打开方式。 关于文件的打开方式,其实还有其他几种,这里简要介绍一下。

    打开方式 描述
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式
    rb 以二进制只读方式打开一个文件。文件指针将会放在文件的开头。
    r+ 以读写方式打开一个文件。文件指针将会放在文件的开头。
    rb+ 以二进制读写方式打开-一个文件。文件指针将会放在文件的开头
    w 以写人方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
    wb 以二进制写人方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
    W+ 以读写方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
    wb+ 以二进制读写格式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
    a 以追加方式打开一个文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写人到已有内容之后。如果该文件不存在,则创建新文件来写人
    ab 以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾。也就是说,新的内容将会被写人到已有内容之后。如果该文件不存在,则创建新文件来写人
    a+ 以读写方式打开一个文件。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,则创建新文件来读写。
    ab+ 以二进制追加方式打开一 个文件。如果该文件已存在,则文件指针将会放在文件结尾。

    四 总结

    这篇文章是数据存储的引子,主要就是讲了TXT文件的存储以及一些文件的打开方式。在开始介绍了数据存储的基本内容,以及TXT文件的基本内容,内容相对简单。以上内容参考资料:崔庆才《Python3 网络爬虫开发实战》,夏敏捷《Python程序设计-从基础到开发》,[挪]芒努斯·利·海特兰德(Magnus Lie Hetland)《Python基础教程第3版 Python编程从入门到实践 》,并对以上作者表示感谢。这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。


    在这里插入图片描述

    展开全文
  • https://blog.csdn.net/enweitech/article/details/51445087 块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象...

    https://blog.csdn.net/enweitech/article/details/51445087

     块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。

            首先,我们介绍这两种传统的存储类型。通常来讲,所有磁盘阵列都是基于Block块的模式,而所有的NAS产品都是文件级存储。


    首先我们先来了解一下,什么叫做块级?什么叫文件级?

    1.块级概念:

    块级是指以扇区为基础,一个或我连续的扇区组成一个块,也叫物理块。它是在文件系统与块设备(例如:磁盘驱动器)之间。

    2.文件级概念:

    文件级是指文件系统,单个文件可能由于一个或多个逻辑块组成,且逻辑块之间是不连续分布。逻辑块大于或等于物理块整数倍,

    3.物理块与文件系统之间的关系图:

    映射关系:扇区→物理块→逻辑块→文件系统

    文件级备份:

    文件级备份是指在指定某些文件进行备份时,首先会查找每个文件逻辑块,其次物理块,由于逻辑块是分散在物理块上,而物理块也是分散在不同扇区上。需要一层一 层往下查找,最后才完成整个文件复制。文件级备份时比较费时间,效率不高,实时性不强,备份时间长,且增量备份时,单文件某一小部份修改,不会只备份修改 部份,而整个文件都备份。

    块级备份:

    块级备份是指物理块复制,效率高,实时性强,备份时间短,且增量备份时,只备份修改过的物理块。

    目前文件级备份工具:

    Symantec NBU/BE 备份软件、Commvault、CA、Networker

    目前块级备份工具:

    飞康CDP、Recoverpoint、杭州信核CDP、Novell CDP

    备份时间点保留周期:

    传统备份软件(文件级备份),可以保留备份时间点多,恢复颗粒度大

    CDP备份(块级备份),可以保留备份时间点少,恢复颗粒度小


    【块存储】

    典型设备:磁盘阵列,硬盘,虚拟硬盘

    【文件存储】
    典型设备:FTP、NFS服务器,SamBa

    【对象存储】
    典型设备:内置大容量硬盘的分布式服务器

    分布式存储的应用场景相对于其存储接口,现在流行分为三种:
    对象存储: 也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL和其他扩展,如七牛、又拍、Swift、S3

    块存储: 

    这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口,如Sheepdog,AWS的EBS,青云的云硬盘和阿里云的盘古系统,还有Ceph的RBD(RBD是Ceph面向块存储的接口)


    文件存储: 

    通常意义是支持POSIX接口,它跟传统的文件系统如Ext4是一个类型的,但区别在于分布式存储提供了并行化的能力,如Ceph的CephFS(CephFS是Ceph面向文件存储的接口),但是有时候又会把GFS,HDFS这种非POSIX接口的类文件存储接口归入此类。

    1、块存储

            以下列出的两种存储方式都是块存储类型:

            1) DAS(Direct Attach STorage):是直接连接于主机服务器的一种储存方式,每一台主机服务器有独立的储存设备,每台主机服务器的储存设备无法互通,需要跨主机存取资料时,必须经过相对复杂的设定,若主机服务器分属不同的操作系统,要存取彼此的资料,更是复杂,有些系统甚至不能存取。通常用在单一网络环境下且数据交换量不大,性能要求不高的环境下,可以说是一种应用较为早的技术实现。

            2)SAN(Storage Area Network):是一种用高速(光纤)网络联接专业主机服务器的一种储存方式,此系统会位于主机群的后端,它使用高速I/O 联结方式, 如 SCSI, ESCON 及 Fibre- Channels。一般而言,SAN应用在对网络速度要求高、对数据的可靠性和安全性要求高、对数据共享的性能要求高的应用环境中,特点是代价高,性能好。例如电信、银行的大数据量关键应用。它采用SCSI 块I/O的命令集,通过在磁盘或FC(Fiber Channel)级的数据访问提供高性能的随机I/O和数据吞吐率,它具有高带宽、低延迟的优势,在高性能计算中占有一席之地,但是由于SAN系统的价格较高,且可扩展性较差,已不能满足成千上万个CPU规模的系统。

    2、文件存储

            通常,NAS产品都是文件级存储。  NAS(Network Attached Storage):是一套网络储存设备,通常是直接连在网络上并提供资料存取服务,一套 NAS 储存设备就如同一个提供数据文件服务的系统,特点是性价比高。例如教育、政府、企业等数据存储应用。

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

         下面,我们对DAS、NAS、SAN三种技术进行比较和分析:

    表格 1 三种技术的比较

    三种存储类型比较-文件、块、对象存储 - 笨笨blog - 亮丽

    三种存储类型比较-文件、块、对象存储 - 笨笨blog - 亮丽

            针对Linux集群对存储系统高性能和数据共享的需求,国际上已开始研究全新的存储架构和新型文件系统,希望能有效结合SAN和NAS系统的优点,支持直接访问磁盘以提高性能,通过共享的文件和元数据以简化管理,目前对象存储系统已成为Linux集群系统高性能存储系统的研究热点,如Panasas公司的Object Base Storage Cluster System系统和Cluster File Systems公司的Lustre等。下面将详细介绍对象存储系统。

    3、对象存储

            总体上来讲,对象存储同兼具SAN高速直接访问磁盘特点及NAS的分布式共享特点。

            核心是将数据通路(数据读或写)和控制通路(元数据)分离,并且基于对象存储设备(Object-based Storage Device,OSD)构建存储系统,每个对象存储设备具有一定的智能,能够自动管理其上的数据分布。
            对象存储结构组成部分(对象、对象存储设备、元数据服务器、对象存储系统的客户端):
            3.1、对象
            对象是系统中数据存储的基本单位,一个对象实际上就是文件的数据和一组属性信息(Meta Data)的组合,这些属性信息可以定义基于文件的RAID参数、数据分布和服务质量等,而传统的存储系统中用文件或块作为基本的存储单位,在块存储系统中还需要始终追踪系统中每个块的属性,对象通过与存储系统通信维护自己的属性。在存储设备中,所有对象都有一个对象标识,通过对象标识OSD命令访问该对象。通常有多种类型的对象,存储设备上的根对象标识存储设备和该设备的各种属性,组对象是存储设备上共享资源管理策略的对象集合等。 
           3.2、对象存储设备
            对象存储设备具有一定的智能,它有自己的CPU、内存、网络和磁盘系统,OSD同块设备的不同不在于存储介质,而在于两者提供的访问接口。OSD的主要功能包括数据存储和安全访问。目前国际上通常采用刀片式结构实现对象存储设备。OSD提供三个主要功能:
          (1) 数据存储。OSD管理对象数据,并将它们放置在标准的磁盘系统上,OSD不提供块接口访问方式,Client请求数据时用对象ID、偏移进行数据读写。
          (2) 智能分布。OSD用其自身的CPU和内存优化数据分布,并支持数据的预取。由于OSD可以智能地支持对象的预取,从而可以优化磁盘的性能。
          (3) 每个对象元数据的管理。OSD管理存储在其上对象的元数据,该元数据与传统的inode元数据相似,通常包括对象的数据块和对象的长度。而在传统的NAS系统中,这些元数据是由文件服务器维护的,对象存储架构将系统中主要的元数据管理工作由OSD来完成,降低了Client的开销。
             3.3、元数据服务器(Metadata Server,MDS)
              MDS控制Client与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不一致引发的问题。
           3.4、对象存储系统的客户端Client
            为了有效支持Client支持访问OSD上的对象,需要在计算节点实现对象存储系统的Client,通常提供POSIX文件系统接口,允许应用程序像执行标准的文件系统操作一样。
     4、GlusterFS 和对象存储

           GlusterFS是目前做得最好的分布式存储系统系统之一,而且已经开始商业化运行。但是,目前GlusterFS3.2.5版本还不支持对象存储。如果要实现海量存储,那么GlusterFS需要用对象存储。值得高兴的是,GlusterFS最近宣布要支持对象存储。它使用openstack的对象存储系统swift的上层PUT、GET等接口,支持对象存储。

    http://www.openstack.org/blog/2011/07/announcing-the-gluster-connector-for-openstack/

    ——详细介绍

    【块存储】

    典型设备:磁盘阵列,硬盘

    块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘、做Raid、或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘。(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了。例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘。)

    接着块存储会采用映射的方式将这几个逻辑盘映射给主机,主机上面的操作系统会识别到有5块硬盘,但是操作系统是区分不出到底是逻辑还是物理的,它一概就认为只是5块裸的物理硬盘而已,跟直接拿一块物理硬盘挂载到操作系统没有区别的,至少操作系统感知上没有区别。

    此种方式下,操作系统还需要对挂载的裸硬盘进行分区、格式化后,才能使用,与平常主机内置硬盘的方式完全无异。

    优点:

    1、 这种方式的好处当然是因为通过了Raid与LVM等手段,对数据提供了保护。

    2、 另外也可以将多块廉价的硬盘组合起来,成为一个大容量的逻辑盘对外提供服务,提高了容量。

    3、 写入数据的时候,由于是多块磁盘组合出来的逻辑盘,所以几块磁盘可以并行写入的,提升了读写效率。

    4、 很多时候块存储采用SAN架构组网,传输速率以及封装协议的原因,使得传输速度与读写速率得到提升。

    缺点:

    1、采用SAN架构组网时,需要额外为主机购买光纤通道卡,还要买光纤交换机,造价成本高。

    2、主机之间的数据无法共享,在服务器不做集群的情况下,块存储裸盘映射给主机,再格式化使用后,对于主机来说相当于本地盘,那么主机A的本地盘根本不能给主机B去使用,无法共享数据。

    3、不利于不同操作系统主机间的数据共享:另外一个原因是因为操作系统使用不同的文件系统,格式化完之后,不同文件系统间的数据是共享不了的。例如一台装了WIN7/XP,文件系统是FAT32/NTFS,而Linux是EXT4,EXT4是无法识别NTFS的文件系统的。就像一只NTFS格式的U盘,插进Linux的笔记本,根本无法识别出来。所以不利于文件共享。

    【文件存储】

    典型设备:FTPNFS服务器

    为了克服上述文件无法共享的问题,所以有了文件存储。

    文件存储也有软硬一体化的设备,但是其实普通拿一台服务器/笔记本,只要装上合适的操作系统与软件,就可以架设FTP与NFS服务了,架上该类服务之后的服务器,就是文件存储的一种了。

    主机A可以直接对文件存储进行文件的上传下载,与块存储不同,主机A是不需要再对文件存储进行格式化的,因为文件管理功能已经由文件存储自己搞定了。

    优点:

    1、造价交低:随便一台机器就可以了,另外普通以太网就可以,根本不需要专用的SAN网络,所以造价低。

    2、方便文件共享:例如主机A(WIN7,NTFS文件系统),主机B(Linux,EXT4文件系统),想互拷一部电影,本来不行。加了个主机C(NFS服务器),然后可以先A拷到C,再C拷到B就OK了。(例子比较肤浅,请见谅……)

    缺点:

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

    【对象存储】

    典型设备:内置大容量硬盘的分布式服务器

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

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

    首先,一个文件包含了了属性(术语叫metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。

    以往像FAT32这种文件系统,是直接将一份文件的数据与metadata一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(如4M的文件,假设文件系统要求一个块4K,那么就将文件打散成为1000个小块),再写进硬盘里面,过程中没有区分数据/metadata的。而每个块最后会告知你下一个要读取的块的地址,然后一直这样顺序地按图索骥,最后完成整份文件的所有块的读取。

    这种情况下读写速率很慢,因为就算你有100个机械手臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有1个机械手臂在实际工作。

    而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。

    这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。

    另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。

    所以对象存储的出现,很好地结合了块存储与文件存储的优点。

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

    1、有一类应用是需要存储直接裸盘映射的,例如数据库。因为数据库需要存储裸盘映射给自己后,再根据自己的数据库文件系统来对裸盘进行格式化的,所以是不能够采用其他已经被格式化为某种文件系统的存储的。此类应用更适合使用块存储。

    2、对象存储的成本比起普通的文件存储还是较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。


    展开全文
  • Kafka文件存储

    千次阅读 2018-05-25 22:30:12
    参考 : Kafka文件存储机制那些事 1、topic 按照partition存储,每个partition为一个目录,partiton命名规则为topic名称+有序序号 2、partition中的存储–分段(segment) 下面是segment存储方式: &...
  • Android文件存储

    千次阅读 2015-08-14 11:42:03
    Android文件系统跟其他平台基于磁盘的文件系统类似,这篇教程描述了如何使用文件相关的API在Android文件系统上进行读写操作。 File对象适合读写大量的流式数据,如图片文件或其他...所有的Android设备都将文件存储区域
  • 记住:修改的是docker从服务器上拉下来的镜像文件存储位置(本地),是不是镜像源地址(服务器) 首先 win10下的docker有可视化操作界面和命令行操作,下载了docker-ce.exe双击后就自己开始到结束自动完成,默认...
  • 文件存储方案对比

    千次阅读 2019-04-15 14:26:39
    文件存储方案对比 需求 对海量文件(图片、文档等)进行存储,系统间共享。 数据安全 需要实现数据冗余,避免数据的单点故障 可线性扩展 当数据增长到TB、甚至PB以上时,存储方案需要支持可线性扩展 存储高可用 某个...
  • 文件存储 设备:FTP、NFS服务器 特点:一个大文件夹,大家都可以获取文件 优点:可以共享 缺点:传输速率低 块存储 设备:cinder,硬盘 特点:分区、格式化后,可以使用,与平常主机内置硬盘的方式完全...
  • 盘点分布式文件存储系统

    千次阅读 2021-02-08 22:14:23
    在项目的数据存储中,结构化数据通常采用关系型数据库,非结构化数据(文件)的存储就有很多种方式,服务器本地存储、Nas挂载、ftp等等,今天就来盘点一下,分布式文件存储系统。
  • 文件存储适用于HPC、企业OA等需要存储数据被多个计算机点共享的场景,具备PB级别的容量,ms级别的时延。 对象存储适用于大数据、IOT、备份归档等场景,具有EB级别的容量和3大存储中最高的数据可靠性。 不熟悉存储...
  • Android Q(10) 文件存储适配

    万次阅读 多人点赞 2019-09-29 18:05:03
    Android Q文件存储机制修改成了沙盒模式,和IOS神似 应用只能访问自己沙盒下的文件和公共媒体文件 对于Android Q以下,还是使用老的文件存储方式 权限 Android Q不再需要申请文件读写权限,默认可以读写自己沙盒...
  • 时隔一天,上一篇文章《文件存储》刚一停笔,今天上午就解决了困扰我已久的文件上传问题。 站在一个已实现功能的角度来重新看待这个文件上传的业务:编辑页面选择jar包,然后通过form表单提交,上传到后台程序,...
  • Android studio-文件存储

    千次阅读 2018-05-01 11:46:26
    文件存储文件存储是Android中最基本的一种数据存储方式,它与Java中的文件存储类似,都是通过I/O流的形式把数据原封不动的存储到文档中。–Android中的文件存储分为内部存储和外部存储。内部存储:指将应用程序中...
  • 《分布式文件存储选型考虑点》 专题分析: 1、SeaweedFS 参见我的这篇文章《分布式文件存储SeaweedFS试用对比总结》。 2、MinIO 参见我的这篇文章《分布式文件存储MinIO试用对比总结》 3、FastDFS 参见我的...
  • Android之FileOutputStream文件存储

    千次阅读 2016-10-07 16:14:10
    文件存储是Android中最基本的一种数据存储方式,它与Java中的文件存储类似,都是通过I/O流的形式把数据原封不动的存储到文档中。 文件存储核心代码 保存文件 FileOutputStream fileOutputStream; ...
  • 存储一:文件存储+Java流

    千次阅读 2018-07-21 12:00:50
    文件存储+Java流 路径:/data/data/<package name>/files/目录下 核心技术: 上下文类中提供的openFileOutput()和openFileInput(),之后就是利用Java的的的各种流来进行读写操作。 一、将...
  • android 文件存储

    千次阅读 2012-06-18 00:50:45
    1.文件存储,将文件存储在手机自带的内存中 示例: /** * 保存文件 * @param name 文件名 * @param content 文件内容 */ public void save(String name, String content) throws Exception{ Log.d(TAG,...
  • Django 的文件存储

    千次阅读 2016-05-30 17:39:24
    起因由于老师项目的需要,要在服务器端存储生成的文件,用Python的File虽然能够实现,但是Django这么大的框架肯定支持文件存储的,所以我认真读了一下官方文档,把所得记下来。相关链接Django官方文档Stroage API ...
  • 阿里云目前主要提供三种数据存储产品,分别是:块存储、文件存储(NAS)和 对象存储(OSS) 三者区别如下: 块存储:是阿里云为ECS云服务器提供的块设备,高性能、低时延,满足随机读写,可以像使用物理硬盘一样...
  • 分布式文件存储—fastDFS

    千次阅读 2018-01-30 11:22:16
    •解决了大容量文件存储和高并发访问的问题,文件存取时实现了负载均衡 •FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储 •支持存储服务器在线扩容 •支持相同内容的文件只保存一份,节约磁盘空间...
  • Android文件存储位置简述

    千次阅读 2015-12-12 17:16:07
    最近一段时间,工作和学习方面都比较忙,所以,博客方面有一段时间没有投入时间啦,今天学习了一下android文件存储方面的知识,主要是Internal Storage和External Storage的相关特性.主要知识来自android的官方文档和其他...
  • 块储存、对象存储、文件存储的区别和联系

    万次阅读 多人点赞 2017-04-18 21:08:41
    块储存、对象存储、文件存储的区别和联系 通常来讲,队友磁盘阵列都是基于Block块的存储,而所有的NAS产品都是文件级存储。 1. 块存储:DAS SAN a) DAS(Direct Attach Storage): 是直接连接于主机服务器的一种存储...
  • 微信文件的保存路径虽然我们有更方便快捷的办法,但是咱们还是得先把手机微信文件存储的路径介绍一下。值得注意的是旧版的微信与新版的微信保存文件的路径是不同的,小编先详细介绍一下新版微信。1. 打开手机自带的...
  • 块存储、对象存储、文件存储这三个就不多说了,不知道的自己去搜,重点在NAS、文件存储和NFS之间的关系 一、NAS NAS被定义为一种特殊的专用数据存储服务器,包括存储器件(例如磁盘阵列、CD/DVD驱动器、磁带驱动器...
  • Facebook于是提出了集行存储和列存储的优点于一身的RCFile文件存储格式,据说当前在Facebook公司内部,其数据仓库的文件存储格式都是RCFile,另外盛大内部的数据仓库使用的也是RCFile文件存储格式。   我们现在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 285,071
精华内容 114,028
关键字:

文件存储