精华内容
下载资源
问答
  • AWS S3(对象存储)基本操作
    万次阅读 热门讨论
    2018-06-14 20:28:43

    平台:linux
    语言:node


    本文档只是记录一些S3的基本操作(基于AWS Node SDK),整体使用上看还是比较轻松好用的,比较复杂的特性请参见官方文档:
    Restful API:
    https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html
    Node SDK文档:
    https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

    1 AWS S3对象存储

    Amazon Simple Storage Service (Amazon S3) 是一种面向 Internet 的存储服务。您可以通过 Amazon S3 随时在 Web 上的任何位置存储和检索的任意大小的数据。

    1.1 基本概念

    Amazon S3将数据作为对象存储在存储区中。一个对象由一个文件和可选的描述该文件的任何元数据组成。在S3里面实质上是没有目录和文件夹的概念,即目录概念实质只是对象的前缀,并不存在实体。

    ###1.1.1 存储桶(bucket)
    我们的数据都是存储在AWS 的存储桶中,我们可以把桶理解为磁盘分区,不过它是由一个桶名(字符串)唯一标识,即你不能创建别人已经创建过的桶。

    1.1.2 对象

    (1)对象键 (或键名称) 在存储桶中唯一地标识对象。(Key)
    (2)对象元数据是一组名称值对。您可以在上传对象元数据时对其进行设置。上传对象后,您将无法修改对象元数据。修改对象元数据的唯一方式是创建对象的副本并设置元数据。对象元数据又分为系统元数据和用户自定义元数据。
    (3) 数据

    1.1.3 对象标签(tag)

    使用存储对象打标签对存储进行分类。每个标签都是一个键-值对。
    您可以将标签添加到新对象 (当您上传新对象时),也可以将标签添加到现有对象。请注意以下几点:

    • 您最多可以将 10 个标签与对象关联。与对象关联的标签必须具有唯一的标签键。
    • 标签键的长度最大可以为 128 个 Unicode 字符,标签值的长度最大可以为 256 个 Unicode 字符。
    • 键和值区分大小写。

    标签对于对象管理相当好用所以重点说明
    利用标签,您现在获得了另一个维度。如果您希望 photo1 属于项目 x 类别,则可以相应地标记该对象。除了数据分类之外,标签还提供其他好处。例如:

    • 对象标签支持权限的精细访问控制。例如,您可以向一个 IAM 用户授予仅读取带有特定标签的对象的权限。
    • 对象标签支持精细的对象生命周期管理,在其中,除了在生命周期规则中指定键名称前缀之外,还可以指定基于标签的筛选条件。
    • 使用 Amazon S3 分析时,您可以配置筛选条件,以便按对象标签、键名称前缀或前缀和标签的组合对对象进行分组以进行分析。
    • 您还可以自定义 Amazon CloudWatch 指标以按特定标签筛选条件显示信息。以下各节提供了详细信息。

    1.2 S3存储类型

    Amazon S3 中的每个对象都有与之关联的存储类别
    这里写图片描述
    对于经常访问的存储类均为STANDARD,我们默认也是该存储类

    创建对象时,要指定键名称(Key),它在存储桶中唯一地标识该对象。可以理解为存储文件相对于当前桶的路径。

    2 使用

    2.1 安装AWS SDK

    新建立一个文件夹,并下载AWS SDK

    npm install aws-sdk
    

    2.2 编写基础配置文件

    var AWS = require('aws-sdk');
    AWS.config.loadFromPath('./config/models/aws_config.json');
    //加载访问密匙 密匙在AWS后台用户管理中得到
    var s3 = new AWS.S3({signatureVersion: 'v4', region:'ap-northeast-2'});
    //初始化SDK S3操作对象
    //关于AWS服务区可参见:https://blog.csdn.net/m0_37263637/article/details/79226121
    let targetBucket = "xxxxxbucket";
    let targetKey =  "test/files/da123cadfeadfe/helloworld.jpg";
    letbitmap = fs.readFileSync('./helloworld.jpg');
    

    3 基础功能

    下面的代码均基于2.2中代码

    3.1 桶操作

    3.1.1 创建桶

    一个账户最多可以创建100个存储桶

    var bucketParams = {
        Bucket: "xxxxtestbucket", //待创建的桶名
        CreateBucketConfiguration: {
         LocationConstraint: "ap-northeast-2"//桶所在服务区
        }
       };
    s3.createBucket(bucketParams, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
    });
    

    3.1.2 桶的生命周期

    往往实际应用中存在这样一种需求,我们希望云对象存储能自动管理一些文件,比如定时过期删除一些文件,或者将存储类型转换成更便宜的类型。
    AWS 存储桶提供了生命周期这个功能。生命周期是针对储存桶而言的。
    一个生命周期配置最多可以有 1000 个规则。 元素唯一地标识规则。ID 长度最多为 255 个字符。

    下面代码只是针对过期操作

    var lifecycleparams = {
        Bucket: targetBucket, //要配置生命周期的桶名
        LifecycleConfiguration: {
         Rules: [//规则组
            {
                Expiration: {
                    Days:10//过期时间
                }, 
                Filter: {
                    Prefix: "test/files/da123cadfeadfe/",//筛选器 针对该路径下的对象有效 该接口也提供tag 作为标识, 如果Prefix为空 为所有参数均有效
    		  /*              
    		 Tag: {//以标签精确管理过期时间
                              Key: 'STRING_VALUE', /* required */
                              Value: 'STRING_VALUE' /* required */
                      }*/
                }, 
                ID: "TestOnly", 
                Status: "Enabled", 
            }
         ]
        }
    };
    s3.putBucketLifecycleConfiguration(lifecycleparams, function(err, data) {
        console.info(data);
        if (err) console.log(err, err.stack); // an error occurred
        else   console.log(data);           // successful response
    });
    

    关于Filter参数,支持3种 ,但三种只能存在一种

    • Prefix:路径前缀
    • Tag:对象标签
    • And: 混合条件,即前缀标签均支持

    And的形式为:

    And: {
                Prefix: 'STRING_VALUE',
                Tags: [
                  {
                    Key: 'STRING_VALUE', /* required */
                    Value: 'STRING_VALUE' /* required */
                  },
                  /* more items */
                ]
            },
    

    同样s3 提供getBucketLifecycleConfiguration查看桶生命周期配置,deleteBucketLifecycle API删除桶生命周期配置。

    3.1.3 删除桶

    var deleteBucketParams = {
        Bucket: targetBucket
    };
    
    s3.deleteBucket(deleteBucketParams, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
    });
    

    桶不为空 SDK会报错

    3.2 对象操作

    3.2.1 上传对象

    let putParams = {
        Bucket: targetBucket, 
        Key: targetKey, 
        Body: bitmap
    };
    s3.putObject(putParams, function(err, data) {
        if (err){
            console.error("put object error");
        }
        console.info(data);
    });
    

    3.2.2 获取对象

    let getParams = {
        Bucket: targetBucket, 
        Key: targetKey
    };
    
    s3.getObject(getParams, function(err, data) {
        if (err){
            console.error("put object error");
        }
        console.info(data);
    });
    

    以http形式获取对象内容,返回为:

    { AcceptRanges: 'bytes',
      Expiration: 'expiry-date="Sun, 24 Jun 2018 00:00:00 GMT", rule-id="TestOnly"',
      LastModified: 2018-06-13T06:35:41.000Z,
      ContentLength: 94156,
      ETag: '"ec79ec01697b7a7f9e423108089c7c6f"',
      ContentType: 'application/octet-stream',
      Metadata: {},
      TagCount: 2,
      Body: <Buffer ff d8 ff e1 9b 2c 45 78 69 66 00 00 49 49 2a 00 08 00 00 00 0b 00 0f 01 02 00 06 00 00 00 92 00 00 00 10 01 02 00 1a 00 00 00 98 00 00 00 12 01 03 00 ... > }
    }
    

    3.2.3 复制对象

    var copyParams = {
        Bucket: "xxx", //复制目标桶
        CopySource: "/xxx/test/files", //待复制资源位置:  /原桶/原桶对象键形式组成
        Key: "xxx"//复制目标对象键
    };
    
    s3.copyObject(copyParams, function(err, data) {
        if (err){
            console.info(err);
            console.error("put object error");
        }
        console.info(data);
    });
    

    3.2.4 删除对象

    var deleteparams = {
        Bucket: targetBucket, 
        Key: targetKey
       };
       s3.deleteObject(deleteparams, function(err, data) {
         if (err) console.log(err, err.stack); // an error occurred
         else     console.log(data);           // successful response
    });
    

    3.2.5 删除文件夹

    在AWS S3 实质上是没有文件夹的概念,文件夹可以理解为仅是对象名的前缀,S3可操作实体只有桶 和对象。
    所以删除文件夹有两个方法:

    1. 在桶上为文件夹添加生命周期,匹配文件夹前缀,到期后48小时内将会被删除
    2. 利用S3批量操作接口先遍历文件夹,在批量删除。下面是这种方法 sample code。批量接口一次操作只支持1000,要更高需要对接口二次封装。

    使用到了两个S3接口:
    listObjects
    deleteObjects

    sample Code

    const s3 = new AWS.S3({ accessKeyId: '', secretAccessKey: '', region: 'cn-north-1' });
    
    function deleteS3Folder(BucketName, prefix, callback) {
      const getObjecsParam = {
        Bucket: BucketName,
        Prefix: prefix,
      }
      s3.listObjects(getObjecsParam, (err, data) => {  
        if (err) {
          console.error(err);
        }
        console.info(data);
        if (data.Contents.length === 0) {
          return callback(null);
        }
        if (data.Contents.length > 1000) {
          return callback('ths sample code does`t support 1000');
        }
        let deleteOnceArray = [];
        data.Contents.forEach((item) => {
          deleteOnceArray.push({ Key: item.Key });
        });
        console.info(deleteOnceArray);
        const deleteObjectsParam = {
          Bucket: BucketName,
          Delete: {
            Objects: deleteOnceArray,
          },
        };
        s3.deleteObjects(deleteObjectsParam, (deleteerr, deleteres) => {
          if (deleteerr) {
            console.error(deleteerr);
          }
          console.info(deleteres);
        });
      });
    }
    
    deleteS3Folder('BucketName', 'folderName', () => {
    	console.info("delete success");
    })
    

    3.3 标签(tag)

    3.3.1 为对象添加标签

    var tagParams = {
        Bucket: targetBucket, 
        Key: targetKey, 
        Tagging: {
         TagSet: [
            {
           Key: "user", 
           Value: "testuser"
          }, 
            {
           Key: "vip", 
           Value: "Value4"
          }
         ]
        }
       };
       s3.putObjectTagging(tagParams, function(err, data) {
         if (err) console.log(err, err.stack); // an error occurred
         else     console.log(data);           // successful response
       });
    

    3.3.2 获取对象标签内容

    { 
    TagSet:
       [ { Key: 'vip', Value: 'Value4' },
         { Key: 'user', Value: 'testuser' } ]
     }
    
    3.3.3 删除标签
     var deletTagparams = {
        Bucket: targetBucket, 
        Key: targetKey, 
       };
       s3.deleteObjectTagging(deletTagparams, function(err, data) {
         if (err) console.log(err, err.stack); // an error occurred
         else     console.log(data);           // successful response
       });
    

    ##3.4 预签名分享存储对象
    如果要将对象短时间分享出去我们可以使用预签名,

    let getSignedparams = {Bucket: targetBucket, Key: targetKey, Expires:60*30};//30 min
    s3.getSignedUrl('getObject', getSignedparams, function(err, url){
        console.info(url);
    });
    

    返回为一个URL ,可以直接用浏览器通过访问这个URL下载存储对象。
    虽然也可以通过这个API获取到putObject 的URL 但V4版签名需要在http header添加很多参数校验,不建议直接使用restful API 的方式操作。

    4 使用中遇到的问题:

    4.1 关于签名版本不正确的报错

    The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.
    因为SDK默认 还使用的是V2版签名,所以需要手动配置V4签名
    var s3 = new AWS.S3({signatureVersion: ‘v4’, });

    4.2 关于使用S3服务区配置错误的报错

    Error parsing the X-Amz-Credential parameter; the region ‘us-east-1’ is wrong; expecting ‘ap-northeast-2’
    新建的桶在首尔 而不是在美国,所以我们也应该配置地区为首尔。
    var s3 = new AWS.S3({signatureVersion: ‘v4’, region:‘ap-northeast-2’});

    4.3 关于S3目录(文件夹)的问题

    S3目录 在S3里面是一个意思的东西。实质上S3中并没有目录的概念,可以目录理解为对象的key属性,仅是一串字符串,是对象前缀而已。
    在我们使用PutObject 上传 Key 为 image/09/25/haha.jpg 。
    该文件在S3控制台 可以看到 在image/ 09 / 25 的文件夹下。 如果仅通过这种方式 我们listObjectsV2 是list不到目录对象的。
    但这里有一个非常有迷惑性的行为:
    S3 控制台创建文件夹行为 实质上是使用PutObject API KEY: image/09/25/ 无Body字段,创建内容为空Object。
    所以这种情况下去listObjects 是会list 得到这个空的目录对象的。

    更多相关内容
  • 种存储类型:块存储、文件存储、对象存储

    千次阅读 多人点赞 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)进行云端的数据处理。

    典型设备

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

    典型存储方式

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

    三种存储类型的差异:

     

    展开全文
  • 种存储类型比较-文件、块、对象存储

    万次阅读 多人点赞 2016-07-26 09:09:28
    块存储和文件存储是我们比较熟悉的两主流的存储类型,而对象存储(Object-based Storage)是一新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。  首先...
         块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。
         首先,我们介绍这两种传统的存储类型。通常来讲,所有磁盘阵列都是基于Block块的模式(DAS),而所有的NAS产品都是文件级存储

    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 三种技术的比较



            针对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的开销。

    传统模型 VS OSD模型

            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文件方式进行的,对象存储系统提供给用户的也是标准的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。
     

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

        20世纪电子与信息技术迅速发展,机器计算迅速普及,冯·诺依曼在1945年6月30日,提出了存储程序逻辑架构,即现有的计算机都遵循的“冯·诺依曼体系架构”,具体如下图:

      我们可以看出,冯诺依曼体系结构与人脑(生物)计算模型匹配度相当准确。我们通常把运算器和控制器合并成中央 处理器(CPU),内部小容量的存储提供快速的访问,外部存储器提供大容量的存储空间。在不同的计算机时代,我们可以按照不同的角度来理解冯诺依曼体系结构。在单机计算时代(包括 大型机小型机、微机)内部存储器可理解为内存(即Memory),外部存储器可理解为物理硬盘(包括本地硬盘和通过网络映射的逻辑卷)。 在本地硬盘空间不足,可靠性无法满足业务需求的情况下,SAN存储出现了,通过网络映射的逻辑卷(即SAN存储提供的LUN)成为增强版的硬盘。为了解决数据共享的问题,NAS存储随之诞生。
          但冯诺依曼体系架构没有考虑并行计算和数据共享情形,在如今的网络时代,大量计算设备通过网络形成一个庞大、相互独立但又逻辑统一的计算系统,因此我们可以总结出一个数据存储的通用模型,这个模型包括两级存储,其存储容量差距约1000倍:

      如果将上图中每一个计算模块理解为一个计算内核,那么高速存储单元则是CPU内的缓存(单位为KB~MB),海量存储单元则是内存(单位为GB);如果把每一个计算模块理解为一个CPU,那么高速存储单元则是内存(单位为GB~TB),海量存储是物理硬盘或通过网络映射给服务器的逻辑卷(或网络文件系统,单位为TB~PB);如果把计算模块理解为针对某一项任务或某一组任务提供计算能力的服务器集群,把SAN或NAS等拥有TB~PB级存储规模的网络存储设备理解为高速存储单元,那么具备PB~EB级存储容量的海量存储单元将基于什么技术和产品构建呢?

      SAN和NAS技术已经出现了数十年,目前单台SAN或NAS设备最大容量已经达到PB级别,但在应对EB级数据挑战时,还是显得有些力不从心。这主要由于其架构和服务接口决定的。
            SAN使用SCSI协议作为底层协议,SCSI协议管理的粒度非常小,通常以字节(byte)或千字节(KB)为单位;同时SCSI协议没有提供读写锁机制以确保不同应用并发读写时的数据一致性,因此难以实现EB级存储资源管理和多个服务器/服务器集群之间数据共享。
            NAS使用文件协议访问数据,通过文件协议存储设备能够准确识别数据内容,并提供了非常丰富的文件访问接口,包括复杂的目录/文件的读写锁。文件和目录采用树形结构管理,每个节点使用一种叫做inode的结构进行管理,每一个目录和文件都对应一个iNode。目录深度或同一目录下的子节点数随着整体文件数量的增加而快速增加,通常文件数量超过亿级时,文件系统复杂的锁机制及频繁的元数据访问将极大降低系统的整体性能。
         传统的 RAID技术和Scale-up架构也阻止了传统的SAN和NAS成为EB级高可用,高性能的海量存储单元。传统的RAID基于硬盘,通常一个RAID组最多包含20+块硬盘,即使PB级规模的SAN或NAS也将被分割成多个存储孤岛,增加了EB级规模应用场景下的管理复杂度;同时Scale-up架构决定了即使SAN和NAS存储容量达到EB级,性能也将成为木桶的短板。
         那么如何才能应对信息爆炸时代的数据洪流呢? 我们设想能否有一种“超级数据图书馆”,它提供海量的、可共享的存储空间给很多用户(服务器/服务器集群)使用,提供超大的存储容量,其存储容量规模千倍于当前的高速存储单元(SAN和NAS),用户或应用访问数据时无需知道图书馆对这些书如何摆放和管理(布局管理),只需要提供唯一编号(ID)就可以获取到这本书的内容(数据)。如果某一本书变得老旧残破,系统自动地将即将失效或已经失效的书页( 存储介质)上的数据抄写(恢复/重构)到新的纸张(存储介质)上,并重新装订这本书,数据使用者无需关注这一过程,只是根据需要去获取数据资源。这种“超级数据图书馆”是否真的存在呢?
      分布式对象存储的诞生
         对象存储技术的出现和大量自动化管理技术的产生,使得“超级数据图书馆”不再是人类遥不可及的梦想。对象存储系统(Object-Based Storage System)改进了SAN和NAS存储的劣势,保留了NAS的数据共享等优势,通过高级的抽象接口替代了SCSI存储块和文件访问接口(不同地区的用户访问不同的POSIX文件系统,不仅浪费时间,而且让运维管理变的更复杂。相对而言,分布式存储系统的优势明显。在分布式存储系统上做应用开发更便利,易维护和扩容,自动负载平衡。以 RESTful HTTP接口代替了POSIX接口和 QEMU Driver 接口 ),屏蔽了存储底层的实现细节,将NAS垂直的树形结构改变成平等的扁平结构,从而提高了扩展性、增强了可靠性、具备了平台无关性等重要存储特性。(Erasure Code: 是将文件转换成一个碎片集合,每一个碎片很小,碎片被打散分布到一组服务器资源池里。只要存留的碎片数量足够,就可以合成为原本的文件。这可以在保持原本的数据健壮性的基础上大大减少需要的存储空间。 不过Erasure Code并非适应所有的场景,尤其不适合网络延迟敏感的业务( 不过Erasure Code并非适应所有的场景,尤其不适合网络延迟敏感的业务))
      SNIA(网络存储工业协会)定义的对象存储设备是这样的:
    Ø 对象是自完备的,包含元数据、数据和属性
          n 存储设备可以自行决定对象的具体存储位置和数据的分布
         n 存储设备可以对不同的对象提供不同的QoS
    Ø 对象存储设备相对于块设备有更高的“智能”,上层通过对象ID来访问对象,而无需了解对象的具体空间分布情况
          换句话说对象存储是智能化、封装得更好的块,是“文件”或其他应用级逻辑结构的组成部分,文件与对象的对应关系由上层直接控制,对象存储设备本身也可能是个分布式的系统——这就是分布式对象存储系统了。
      用对象替代传统的块的好处在于对象的内容本身来自应用,其具有内在的联系,具有“原子性”,因此可以做到:
    Ø 在存储层进行更智能的空间管理
    Ø 内容相关的数据预取和缓存
    Ø 可靠的多用户共享访问
    Ø 对象级别的安全性
         同时,对象存储架构还具有更好的可伸缩性。一个对象除了ID和用户数据外,还包含了属主、时间、大小、位置等源数据信息,权限等预定义属性,乃至很多自定义属性
         具备EB级规模扩展性的分布式对象存储,通过对应用提供统一的命名空间,构建EB级统一、可共享数据的存储资源池,有效地填补上述通用计算模型中“网络计算”场景海量存储单元空白,通过高层次的数据模型抽象,可以简化应用对数据访问,同时使得海量存储更加智能。
        对象是数据和自描述信息的集合,是在磁盘上存储的基本单元。对象存储通过简化数据的组织形式(如将树形的“目录”和“文件”替换为扁平化的“ID”与“对象”)、降低协议与接口的复杂度(如简化复杂的锁机制,确保最终一致性),从而提高系统的扩展性以应对信息爆炸时代海量数据的挑战。同时对象的智能自管理功能也能有效降低系统维护复杂度,帮助用户降低整体拥有成本(TCO)。
    展开全文
  • 前两篇介绍了对象存储的基础,包括存储类型,常用存储分类和分类方法。 SCSI,TCP/IP,FC等存储介质以及DAS\NAS\SAN等存储网络,请参考:对象存储1:传统存储类型和分类。 文件存储,块存储以及对象存储等数据存储...

    前两篇介绍了对象存储的基础,包括存储类型,常用存储分类和分类方法。

    SCSI,TCP/IP,FC等存储介质以及DAS\NAS\SAN等存储网络,请参考:对象存储1:传统存储类型和分类

    文件存储,块存储以及对象存储等数据存储格式,请参考: 对象存储2:云平台数据存储类型

     

    1.对象存储基础

    对象存储的命名,是由其存储数据的格式来的,它的数据是以对象object的形式存储。

    文件存储的数据存储单位为文件;块存储的数据存储单位为数据块;块存储的存储单位为对象。

    1.1 数据格式

    一个文件包含了两部分内容,属性和内容(即数据);属性又称元数据metadata,是指数据的属性内容,比如文件大小、创建时间、修改时间、存储路径等。

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

    块存储与对象存储
    块存储与对象存储
    传统数据访问层次、虚拟数据访问模型

     

     

    1.2 对象存储原理

    对象存储将元数据独立了出来,元数据里写明了数据的所有属性,包括打散后的每个块所存储的位置。对象存储将元数据和数据进行了分开存储,这样只要读取到了元数据,就能找到所有的数据块,并可以同时对数据块进行读取,大大提高了数据处理的效率。

    对象存储中用来存储元数据的节点是控制节点,称为元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息);负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。

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

    1.3 对象

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

    什么是对象存储?OSD架构及原理
    对象的构成

     

    2.对象存储的结构

    根据对象存储原理所讲的,核心是将数据通路(数据读或写)和控制通路(元数据)分离,并且基于对象存储设备(Object-based Storage Device,OSD)构建存储系统。每个对象存储设备具有一定的智能,能够自动管理其上的数据分布。对象存储的结构包括元数据服务器(控制节点MDS)和数据存储服务器(OSD),两者进行数据的存储,还需要客服端client进行存储的服务访问和使用。架构如下图:

    对象存储架构图

     

    2.1 对象存储设备OSD

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


    2.2 元数据服务器(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不一致引发的问题。

    2.3 对象存储系统的客户端Client

    为了有效支持Client支持访问OSD上的对象,需要在计算节点实现对象存储系统的Client,通常提供POSIX文件系统接口,允许应用程序像执行标准的文件系统操作一样。
     

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

    3.1 分布元数据

    传统的存储结构元数据服务器通常提供两个主要功能。

    (1)为计算结点提供一个存储数据的逻辑视图(Virtual File System,VFS层),文件名列表及目录结构。

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

    3.2 并发数据访问

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

     

     

     

    3.对象存储常用场景

     

     

    展开全文
  • 展开全部一、 把图片直接以二进制形式存储在数据库中一般数据库提供一个e68a84e8a2ad...1、BINARY 数据类型用于存储二进制数据。其定义形式为BINARY( n), n 表示数据的长度,取值为1 到8000 。...
  • 存储类型: https://www.bilibili.com/video/BV1WE41177Kp?from=search&seid=1887114199876544924 存储分类2: 块存储: 文件存储: 对象存储
  • Java操作Redis存储对象类型数据

    千次阅读 2018-12-24 11:41:15
     关于JAVA去操作Redis时,如何存储一个对象的数据,这是大家非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用。存储一个对象是非常常见的。经过网上查找资料以及参考其他...
  • 种存储类型和三存储方式

    万次阅读 多人点赞 2019-01-22 17:07:39
    块存储和文件存储是我们比较熟悉的两主流的存储类型,而对象存储(Object-based Storage)是一新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。 本质是一样...
  • Redis存储对象的三方式

    万次阅读 2020-05-14 18:45:36
    实际开发中可能经常遇到需要将对象存储到Redis的情况, 这里简单介绍下将对象序列化、使用FastJSON转换对象、使用Hash存储对象三方式
  • 首先简单了解一下一些ceph对象存储的基本知识: Ceph: 起始于2006年 开发语言:C 强一致性 块存储 对象存储 Swift: 起始于2008年 开发语言:Python 最终一致性 对象存储 真正的大型公用云服务产品中...
  • 阿里云对象存储OSS计费模式分为包年包月和按量付费两,按量付费是指用户开通OSS后,根据实际使用量按每小时产生费用;包年包月是指用户通过先购买资源包,OSS会在每个计费周期,将产生的使用量使用
  • 对象存储(云存储)概述

    万次阅读 多人点赞 2019-03-08 17:54:09
    文章目录三存储形态1、块存储2、文件存储3对象存储对象存储对象存储需求对象存储含义对象存储与传统网络存储的区别扩展知识:NAS与SAN概述1、NAS(Network Attached Storage)优点局限2、SAN(Storage Area ...
  • 从应用角度看块存储、文件存储、对象存储 产品和市场需求有各种相互影响的关系,但不管是哪一,最终呈现都是产品和应用需求需要对应匹配。应用需求越多样化,市场也就划分得更加细,产品种类也就更加丰富。在...
  • 计算机存储的发展(块存储,文件存储,对象存储

    万次阅读 多人点赞 2018-09-15 15:04:08
    对象存储 1、对象 2、对象存储设备 3、元数据服务器(Metadata Server,MDS) 4、对象存储系统的客户端Client 三者之间异同比较 参考文献 如果要实现一个计算机,那么这个计算机一定要有以下的三个部分构成:...
  • 开源对象存储MinIO技术白皮书

    万次阅读 多人点赞 2019-09-27 13:38:36
     MinIO对象存储系统主要有两部署方式, 一是常见的本地分布式集群部署,一是联盟模式部署。 本地分布式集群部署方式即在多个本地服务器节点部署MinIO软件,并将其组件成单套分布式存储集群,并提供统一命名...
  • 对象存储(OSD)及架构原理

    千次阅读 2020-06-30 16:11:50
    存储局域网(SAN)和网络附加存储(NAS)是我们比较熟悉的两主流网络存储架构,而对象存储(Object-based Storage)是一新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)...
  • OBS即对象存储服务(Object Storage Service),是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,包括:创建、修改、删除桶,上传、下载、删除对象等。 OBS系统和单个桶都没有...
  • 存储分类及对象存储osd的技术原理

    万次阅读 2018-11-07 11:23:24
    存储局域网(SAN)和网络附加存储(NAS)是我们比较熟悉的两主流网络存储架构,而对象存储(Object-based Storage)是一新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)...
  • COS对象存储

    千次阅读 2018-11-28 20:19:21
    1、为什么需要对象存储 随着移动互联网的快速发展,数据量出现了井喷式的增长,数据的类型也越来越丰富。 在这样的状况下,传统存储已经体现出了一些弊端: 原来的传统存储在容量上已经不能满足存储的需求。 数据...
  • 【Redis】redis 存储对象 的三方式

    千次阅读 2020-09-22 21:56:37
    1.概述 ...2.方式一:序列化操作 public class SerializeUtil { /* * 序列化 * */ public static byte[] serizlize(Object object){ ObjectOutputStream oos = null; ByteArrayOutputStream b
  • ceph存储种类型

    千次阅读 2018-04-28 16:07:45
    (1)提供块存储,可以直接以逻辑卷的方式对外提供块设备服务。(2)通过集群的对象存储网关,对外同时提供swift和S3风格的对象存储服务。(3)提供可供挂载的类POSIX文件存储。...
  • 阿里云oss对象存储使用详细步骤

    万次阅读 2019-12-11 11:18:16
    作为一个开发人员,怎么能没有一个属于一个自己的网站,如果你打算做一个图片和视频展示或者其他网站,如果下面这篇文章能帮助到你,帮忙点击赞,欢迎大家评论交流。...地域:华北 1,华北 2,华北 3,华北 5,...
  • 常见存储类型

    千次阅读 2021-01-11 18:55:33
    iSCSI则依靠以太网上,更类似于NAS 三者区别如下: 常见的存储类型 常见的存储类型有块存储、文件存储、对象存储等。其中块存储的存储对象是磁盘阵列、硬盘等块设备,文件存储的存储对象是文件系统,如ftp、nfs...
  • Java操作Redis存储HashMap对象类型数据

    万次阅读 2018-12-24 17:34:23
     关于JAVA去操作Redis时,如何存储一个对象的数据,这是大家非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用。存储一个对象是非常常见的。经过网上查找资料以及参考其他...
  • swift对象存储

    万次阅读 2016-05-23 12:18:50
    对象存储,用于永久类型的静态数据的长期存储。 Swift 最初是由 Rackspace 公司开发的高可用分布式对象存储服务,并于 2010 年贡献给 OpenStack 开源社区作为其最初的核心子项目之一,为其 Nov
  • redis 存储对象 的三方式

    万次阅读 2019-03-26 21:36:45
    方式二:使用fastjson将对象转为json字符串后存储 public class RedisOps { public static void setJsonString(String key,Object object){ Jedis jedis = RedisConnection.getJedis(); jedis.set(key, JSON...
  • HDFS对象存储--Ozone架构设计

    千次阅读 2016-03-06 12:01:39
    他们都提供了一个叫做**对象存储**的服务,就是目标数据是从Object中进行读写的,然后可以通过key来获取对应的Object,就是所谓的key-object的存储.这样的好处就在于用户使用起来很方便的,不需要走冗杂的操作流程.但是...
  • 对象存储、块存储、文件系统存储概念与区别 https://www.cnblogs.com/zxiner/p/7141861.html 一、概念及区别 针对不同的应用场景,选择的分布式存储方案也会不同,因此有了对象存储、块存储、文件系统存储。这三...
  • 1. AWS S3对象存储 Amazon Simple Storage Service (Amazon S3) 是一面向 Internet 的存储服务。您可以通过 Amazon S3 随时在 Web 上的任何位置存储和检索的任意大小的数据。 Amazon S3将数据作为对象存储在存储区...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,583,381
精华内容 633,352
关键字:

对象存储3种类型