基于对象的存储设备.docx
- 文档编号:7221583
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:29
- 大小:440.48KB
基于对象的存储设备.docx
《基于对象的存储设备.docx》由会员分享,可在线阅读,更多相关《基于对象的存储设备.docx(29页珍藏版)》请在冰豆网上搜索。
基于对象的存储设备
参考(
介绍
有两种类型的网络存储系统,以不同的命令集加以区分:
∙存储区域网络(SAN)中使用的SCSI块I/O的命令集,它通过直接访问在磁盘驱动器或光纤通道层次的数据提供了较高的随机I/O和数据吞吐性能。
∙网络附加存储(NAS)系统使用网络文件系统(NFS)或通用互联网文件系统(CIFS)的命令集访问数据。
因为在媒介上的元数据是共享的,多个节点可以同时访问数据。
相反,对象存储是基于封装了用户数据的数据对象,包括数据的属性和元数据。
数据,属性和元数据的结合,使对象存储得以确定数据的布局或每个对象的基础上的服务质量,这就提高了灵活性和可管理性。
对象存储的独特设计,不同于传统的基于块接口的标准存储设备。
对象存储是一个磁盘驱动器的智能进化,它可以存储和提供对象而不仅仅是简单地将数据存放于磁道和扇区。
这个任务的完成是通过将底层存储功能移动到存储设备中,并通过对象接口来访问设备实现的。
使用对象存储的系统提供以下好处,这是在典型的IT存储应用范围内是广泛可取的:
∙存储层的智能空间管理
∙数据感知的预取和缓存
∙健壮性,多个客户端的共享访问
∙使用卸载的数据路径的可扩展
∙可靠的安全保障
OSD历史
在1983年推出第一小型计算机系统接口(SCSI)光盘驱动器,SCSI标准是由美国国家标准学会(ANSI)于1986年批准的。
从那时起的未来数年,这一基本协议已没有显著改变。
在存储设备和主机电脑之间的物理接口却有过从宽SCSI到快速SCSI再到光纤通道SCSI(FCP)、串行连接SCSI(SAS)的巨大变化。
在1983年初始的接口速度为5MB/秒。
如今,接口速度可达320MB/秒。
第一个SCSI磁盘的容量为5MB。
今天,SCSI逻辑接口用到了300GB的磁盘驱动器上。
纵向记录的面密度已达到约200GB/ in2,新兴的垂直记录技术和热辅助磁记录(HAMR)技术将是这一数值达到1TB/in 2。
然而,逻辑接口,或者说命令集,在此期间只有少量的增加。
今天的接口作为ANSIT10SCSIOSDV1标准化了,ANSIT10SCSIOSDV1由卡内基·梅隆大学在始于1994年被称为网络连接的安全磁盘(NASD)的政府资助研究项目中完成。
在接下来的几年中,这一工作仍将得到一组由国家存储工业协会(NSIC)组织的业界合作者的支持和提倡。
这项工作促成了草案接口标准化的ANSIT10规范的提交,该委员会负责SCSI接口标准,并将其命名为项目T10/1355-D。
在接下来的几年中,这个接口由具有各种工业界和学术界的贡献者的全球网络存储工业协会(SNIA)的OSD技术工作组进行了修改和扩展,并促成了在2004年T10标准草案的完成。
该标准于2004年9月被批准,并成为了ANSIT10SCSIOSD的V1的命令集,作为INCITS400-2004公布。
SNIA继续致力于接口的进一步扩展,如ANSIT10SCSIOSD的V2的命令集。
OSD功能:
基本概念
与传统的数据访问方法,包括基于块的方法(并行SCSI、SAS、FCP,ATA,SATA)和基于文件的方法(NFS和CIFS)相比,基于对象的数据访问模型是一个新兴的技术。
一个OSD类似于一个逻辑单元。
不同于传统的面向块的设备提供作为无关联块阵列组织的数据的访问方式,对象存储允许以存储对象的方式来访问数据。
存储对象是一个组织数据的虚拟个体,该虚拟个体通过用户以逻辑上相关的方式进行制定。
存储对象的空间是由OSD的本身进行分配而不是一个基于主机的文件系统。
OSDs对所有必要的底层存储设备进行管理,包括空间管理和提供安全功能。
因为对于对象没有基于主机的元数据(如inode信息),那么对于应用程序而言获取一个对象的唯一方法就是通过它的对象标识符(OID)。
下图将传统的基于块的磁盘数据结构与基于对象的磁盘数据结构进行了对比。
图1基于块的磁盘与基于对象的磁盘的对比
OSD中对象的集合,形成一个单一的OID的平坦空间。
虚拟文件的层次结构可以通过重新排列对象的指针来模拟,如下所示。
图2传统的层次,平坦模型和虚拟的数据访问模型
对象是在OSD中数据存储的基本单位。
每个对象是完备的,它由用户数据、一个OID、元数据(构成对象的块的物理位置)和属性构成,如下所示。
图3包含数据、OID、元数据和属性的对象
ANSIT10SCSIOSD标准定义了四种不同的对象:
∙根对象 -OSD本身
∙用户对象 –由来自应用程序或客户端的SCSI命令创建
∙集合对象 –一组用户对象,如所有的.mp3对象或所有属于同一个项目的对象
∙分区对象 -为一组用户对象和集合对象的容器,这些用户对象和集合对象具有相同的安全和空间管理的特点,如配额和密钥值
这些对象,如下图所示。
图4对象类型:
根对象,分区对象,用户对象,集合对象
因为每个对象是完备的,这样不同对象的迁移和共享是可能的。
文件系统和其他基于主机的数据管理应用程序同时存储用户数据和元数据。
OSD的对象属性保证了OSD对象上应用程序的关联性,如根对象、分区对象、集合对象或用户对象。
属性可以用来描述一个OSD对象的具体特点,如OSD的对象所占用的总字节数,OSD的对象的逻辑大小,或OSD对象的最后修改时间。
属性页的编号表明了该属性页所关联的OSD对象类型,据ANSIT10SCSIOSD标准的定义对于每个对象有232种属性页,而每个属性页有232种属性。
只有小范围的属性命名空间是由标准预定义的。
最主要的部分可以由应用程序定义,这就提供了很好的数据服务和有助于改善服务质量(QoS)。
两类属性包括:
∙存储属性(类似的inode) -OSD使用来管理对于数据的块的分配,如OID、数据块的指针、逻辑长度、使用的容量。
∙用户属性 -用于应用程序和元数据管理者存储对象相关的更高层次的信息,如密度、容量、性能、成本、适应性、权能、可管理性、可靠性、可用性、可维护性、互操作性、安全性、用电量、配额
数据对象的属性和元数据的存储是直接的,并在层与层之间和跨设备自动进行的。
当对象通过某个系统层或设备,该系统层能根据它所理解的属性值产生反应。
忽略其他属性,不修改也没有动作。
因此,标记为高可靠性的对象与标记为临时的对象是区别对待的。
数据的存储属性将高服务级别与数据关联起来,以获得更好的数据缓存、预取和迁移等,如本图所示。
图5属性层服务级别
SCSI架构模型
SCSI架构模型(SAM)的扩展OSD定义了这些OSD特定命令和扩展的SCSI命令描述块(CDB):
∙APPEND(writewithoutoffset)
∙CREATE(object),REMOVE(object)
∙CREATECOLLECTION,REMOVECOLLECTION,LISTCOLLECTION,FLUSHCOLLECTION
∙CREATEPARTITION,REMOVEPARTITION,FLUSHPARTITION
∙FLUSH(forceobjecttomedia),FLUSHOSD,LIST(objects)
∙FORMAT(OSD)
∙GETATTR(ofanobject),SETATTR
∙PERFORMSCSICOMMAND(suchasaSCSIINQUIRY)
∙READ(objectwithOID),WRITE
∙SETKEY(sharedsecretforasingleobject)
∙SETMASTERKEY(sharedsecretforOSD)
图6SCSI标准架构图
OSD的安全
在ANSIT10SCSIOSD标准为基于权能的协议定义了强安全性,该协议强制性地保证SCSI请求的完整性和客户端的合法使用。
每个命令必须附有哈希码(HMAC-SHA1算法的160位密钥的哈希消息认证码),它标识一个特定的对象以及针对该对象执行的操作列表。
在下面的步骤和图的过程中详细介绍。
1.安全管理端与一个OSD交换共享密钥。
2.客户端必须从安全管理端发出请求获取一个权能并对访问的对象指定OSD的名称、分区ID和OID。
3.安全管理端来决定客户端通过LDAP,NIS或Kerberos的方法发出请求是否被授权。
4.因为这种身份认证的方法是超出了ANSIT10SCSIOSD协议的范围之外,安全管理端与策略管理端交互来确定客户端是否被授权来对指定的对象执行请求操作。
如果操作是允许的,安全管理端将生成证书,包括所请求的权能和CAP_key(完整性校验值)。
CAP_key是通过使用一个OSD的密钥和权能的伪随机函数产生的。
5.证书从安全管理端发送到客户端。
6.客户端发出请求、权能以及对每个OSD命令验证标签。
验证标签是由客户端使用CAP_key计算出来的。
在处理命令之前,OSD验证了以下内容:
o验证标签,基于密钥和权能信息
o该功能尚未以任何方式修改
o该功能允许对指定对象的请求的操作
如果通过测试,OSD允许基于权能中编码的权利的操作。
一个客户端可以请求允许多种类型的操作的证书,如读、写或删除。
这允许客户端主动缓存和重用凭证,最大限度地减少安全管理的信息数量。
证书可以被缓存、传播、阻塞、撤销或过期。
图7OSD安全过程流图
权能
SCSI命令描述块(CDB)的字段,指定命令可以请求的命令功能(哪个OSD对象可以被访问)。
权能的内容,可以由策略管理端管理用于应用程序客户端,也可以由安全管理端通过证书进行保护。
证书
一个由安全管理端准备的数据结构,由完整性检查值(CAP_key)进行保护。
此证书被发送到应用程序客户端来定义对某个OSD逻辑单元的访问用于指定OSD对象上指定命令的执行。
证书包括由策略管理端准备并由应用程序客户端复制到每个CDB来请求指定的命令功能的一种权能。
OSD的共享密钥层次结构
共享密钥的层次结构如图8所示。
从最高到最低,密钥包括以下内容:
1.主密钥 –层次结构中位于最高层次密钥,可以允许对驱动器不受限制的访问。
主密钥的丢失被认为是一个灾难性的事件。
因为主密钥的这种重要性,该协议限制了它的使用仅仅局限于设置的根密钥这种罕见事件。
主密钥仅仅在驱动器的所有者发生改变的情况下才能修改。
2.根密钥-与主密钥类似,根密钥提供对驱动器不受限制的访问。
然而,根密钥不能被用来初始化驱动器或设置一个新的主密钥或密钥。
根密钥设置后,它可以用来设置分区密钥。
根密钥是可以根据需要或者作为一个用于维护安全的预定的更新操作的一部分被修改的。
3.分区密钥 -用于为每个分区产生工作密钥。
对象存储分为多个分区,每个分区都有一个唯一的分区密钥和工作密钥。
4.工作密钥-用于生成客户端用于访问单个对象的权能密钥。
由于它们的频繁使用,工作密钥应经常刷新,如每隔一小时。
不幸的是,一密钥刷新就会立即导致该密钥所产生的所有证书的失效,当所有的客户端必须与安全管理端通信以获得新的凭据时也可能会导致性能的显着下降。
由于所有证书在被对象存储缓冲之前必须进行验证,这也就增加了OSD上的负载。
为了解决这些问题,对象存储可以将最多16更新版本的工作密钥声明为可用。
这将有效地定义多个工作密钥同时可用。
因此,一个密钥的刷新会影响到有限数量的权能。
为了支持这一功能,该协议需要一个被纳入到特定的权能中的密钥版本,那些权能标示了哪些密钥在验证过程中可用。
。
图8OSD的共享密钥层次
总结
感谢李思阳同学的作图
Linux下的访问接口
这一章主要介绍Linux下OSD所提供的访问接口以及与之相关的数据结构。
数据结构篇
osd设备信息描述符:
./include/scsi/osd_initiator.h
structosd_dev{
structscsi_device*scsi_device;
unsigneddef_timeout;
#ifdefOSD_VER1_SUPPORT
enumosd_std_versionversion;
#endif
};
这并不是一个完全的linux设备,它仅仅是一个挂linux请求相关联的资源以及默认属性的地方。
请求队列描述符(用户态):
./include/open-osd/linux/blkdev.h
structrequest_queue{
intfd;
volatileintnum_requests;
};
scsi设备描述符(用户态):
./include/open-osd/scsi/scsi_device.h
structscsi_device{
structrequest_queue*request_queue;
};
OSD设备标志信息描述符:
./include/scsi/osd_initiator.h
structosd_dev_info{
unsignedsystemid_len;
u8systemid[OSD_SYSTEMID_LEN];
unsignedosdname_len;
u8*osdname;
};
OSD命令描述符格式:
./include/open-osd/scsi/scsi.h
structscsi_varlen_cdb_hdr{//10字节的命令描述块头部
u8opcode;/*opcodealways==VARIABLE_LENGTH_CMD*///操作码,统一定义为0x7F
u8control;//控制码
u8misc[5];
u8additional_cdb_length;/*totalcdblength-8*///CDB附加部分的长度200-8=192
__be16service_action;//服务动作,表示用户请求的动作。
每个服务动作都有特定的附加域与之关联
/*servicespecificdatafollows*///后面是190字节的附加域,为特殊服务数据
};
structosd_cdb_head{//命令描述块的头部
structscsi_varlen_cdb_hdrvarlen_cdb;
/*10*/u8options;
u8command_specific_options;
u8timestamp_control;
/*13*/u8reserved1[3];
/*16*/__be64partition;//此次命令所针对的分区ID号
/*24*/__be64object;//此次命令所针对的对象ID号,分区ID和对象ID可以唯一地标志一个用户对象
/*32*/union{/*V1vsV2alignmentdifferences*/
struct__osdv1_cdb_addr_len{
/*32*/__be32list_identifier;/*Rarelyused*/
/*36*/__be64length;//读写操作需要传送的字节数
/*44*/__be64start_address;//用户对象上的偏移量,说明读/写命令操作的开始位置。
}__packedv1;
struct__osdv2_cdb_addr_len{
/*calledallocation_lengthinsomecommands*/
/*32*/__be64length;//读写操作需要传送的字节数
/*40*/__be64start_address;//用户对象上的偏移量,说明读/写命令操作的开始位置。
union{
/*48*/__be32list_identifier;/*Rarelyused*/
/*OSD2r055.2.5CDBcontinuationlength*/
/*48*/__be32cdb_continuation_length;
};
}__packedv2;
};
/*52*/union{/*selectedattributesmodePage/List/Single*/
structosd_attributes_page_mode{
/*52*/__be32get_attr_page;
/*56*/__be32get_attr_alloc_length;
/*60*/osd_cdb_offsetget_attr_offset;
/*64*/__be32set_attr_page;
/*68*/__be32set_attr_id;
/*72*/__be32set_attr_length;
/*76*/osd_cdb_offsetset_attr_offset;
/*80*/}__packedattrs_page;
structosd_attributes_list_mode{
/*52*/__be32get_attr_desc_bytes;
/*56*/osd_cdb_offsetget_attr_desc_offset;
/*60*/__be32get_attr_alloc_length;
/*64*/osd_cdb_offsetget_attr_offset;
/*68*/__be32set_attr_bytes;
/*72*/osd_cdb_offsetset_attr_offset;
__be32not_used;
/*80*/}__packedattrs_list;
/*osd2r03:
5.2.4.2SetoneattributevalueusingCDBfields*/
structosd_attributes_cdb_mode{
/*52*/__be32set_attr_page;
/*56*/__be32set_attr_id;
/*60*/__be16set_attr_len;
/*62*/u8set_attr_val[18];
/*80*/}__packedattrs_cdb;
/*52*/u8get_set_attributes_parameters[28];
};
}__packed;
/*80*/
structosdv1_cdb{
structosd_cdb_headh;
u8caps[OSDv1_CAP_LEN];
structosdv1_security_parameterssec_params;
}__packed;
structosdv2_cdb{//v2版本的命令描述块
structosd_cdb_headh;
u8caps[OSD_CAP_LEN];//用户获得的权能描述,表示命令的操作权限
structosdv2_security_parameterssec_params;
}__packed;
structosd_cdb{
union{
structosdv1_cdbv1;
structosdv2_cdbv2;
u8buff[OSD_TOTAL_CDB_LEN];
};
}__packed;
OSD标准定义了由CDB成员指向的IO段的复杂的数据结构。
在IN-Buffer中用到了3个段,在OUT-buffer中用到了4个段。
下图描述了一个管理attributes-lists中的get+set的安全读(secure-read),从不使用段到使用所有的段都是基于同一个基本主题。
一个块设备请求通过将bidi_read请求与主要写请求关联能支持双向有效负载(bidirectionalpayload)。
每个IO请求都由一个与该请求关联的bio链表进行描述。
根据OSD标准,每个段的起始位置都必须严格对齐。
在结构体structosd_request的代码中,有两个_osd_io_info结构体来描述上述的In-buffer和OUT-Buffer。
OSD命令列表:
./include/scsi/osd_protocol.h
enumosd_service_actions{
OSD_ACT_V2(OBJECT_STRUCTURE_CHECK,0x00)
OSD_ACT___(FORMAT_OSD,0x01)
OSD_ACT___(CREATE,0x02)//创建并初始化一个到多个用户对象。
不能在0号分区上创建对象。
在Create命令中可以为新用户对象指定ID号,也可以让设备服务器为新用户对象分配ID号。
该ID号不能与分区中任何其它用户对象的ID号相同,也不与任何集合对象的ID号相同
OSD_ACT___(LIST,0x03)
OSD_ACT_V2(PUNCH,0x04)
OSD_ACT___(READ,0x05)
OSD_ACT___(WRITE,0x06)
OSD_ACT___(APPEND,0x07)//将指定数量的数据写到指定用户对象的尾部,写入的字节数由structosd_cdb_head中的length指定,写入的内容在structosd_cdb_head的?
,Append命令执行完之后,用户对象的逻辑长度属性会增加(在用户对象信息属性页中)。
如果增加后的逻辑长度超过该对象的配额,该命令会产生配额错误。
Append命令会消耗分区的容量,如果导致已用分区容量超过分区的配额限制,也会产生配额错误。
OSD_ACT___(FLUSH,0x08)
OSD_ACT_V2(CLEAR,0x09)
OSD_ACT___(REMOVE,0x0A)
OSD_ACT___(CREATE_PARTITION,0x0B)
OSD_ACT___(REMOVE_PARTITION,0x0C)
OSD_ACT___(GET_ATTRIBUTES,0x0E)
OSD_ACT___(SET_ATTRIBUTES,0x0F)
OSD_ACT___(CREATE_AND_WRITE,0x12)
OSD_ACT___(CREATE_COLLECTION,0x15)
OSD_ACT___(REMOVE_COLLECTION,0x16)
OSD_ACT___(LIST_COLLECTION,0x17)
OSD_ACT___(SET_KEY,0x18)
OSD_ACT___(SET_MASTER_KEY,0x19)
OSD_ACT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 对象 存储 设备