访问扇区数据的方法和系统的制作方法

文档序号:6560283阅读:178来源:国知局

专利名称::访问扇区数据的方法和系统的制作方法
技术领域
:本发明的实施例涉及利用数据存储系统实现存储管理功能。
背景技术
:存储子系统可被描述成包括一个或多个主计算机和一个或多个存储服务器。存储服务器提供对存储器,比如磁盘的主计算机访问。磁盘可被分成磁道,磁道被分成扇区。现代存储子系统用户需要高级功能,比如即时恢复,连续双向复制,加密等。较早的存储子系统支持数据压缩(用户喜欢的一种特征,但是在一些最新的存储子系统中不被支持)。另外,越来越多地在通用计算机之上建立存储子系统,从而还需要硬件和软件故障的可缩放性、可靠性和可恢复性。开发新的特征并把新特征集成到存储子系统中需要大量的时间。存储控制器是存储子系统的一部分,包括一个存储虚拟化引擎,存储虚拟化引擎从多个物理磁盘获得扇区,并使它们可供主计算机的一个或多个主处理器用作多个“虚拟”磁盘的扇区,所述“虚拟”磁盘类似于多处理主计算机的逻辑存储器。存储虚拟化引擎保持和管理扇区从物理磁盘到逻辑磁盘的映射。对逻辑磁盘扇区进行输入/输出(I/O)命令,并将其发送给存储引擎化引擎。存储虚拟化引擎把I/O命令重定向到物理磁盘上的适当扇区。在一些实现中,由存储虚拟化引擎管理的硬件高速缓存是物理磁盘的前端,可从高速缓存服务I/O命令。在IBM公司的ApplicationDevelopmentGuideProgrammingClientApplications.IBMRedbooks,2002中描述了存储虚拟化引擎,该文献在此整体引为参考。关系数据库管理系统(RDBMS)使用关系技术保存和检索关系数据库中的数据。关系数据库是计算机化的信息存储和检索系统,该系统被组织成由记录和数据栏组成的表格。记录可被称为元组或记录。数据库一般具有许多表格,每个表格一般具有多个记录和多栏。客户计算机一般向包括RDBMS的服务器发出请求。RDBMS向客户计算机提供对存储器(例如关系数据库)的访问。RDBMS软件可使用结构化查询语言(SQL)接口。SQL接口已发展成RDBMS软件用标准语言,并且已被美国国家标准协会(ANSI)和国际标准组织(ISO)采用为RDBMS软件用标准语言。在一些系统中,关系数据库引擎由下述软件组件组成(i)网络通信管理器组件,(ii)查询管理组件,(iii)记录管理组件,和(iv)页面缓冲器管理组件。在常规系统中,性能开销的来源存在于客户计算机-服务器处理中,客户计算机-服务器处理由网络通信管理器组件和查询管理组件处理。特别地,客户计算机和服务器可存在于许多操作系统和/或处理器平台上。在不同的平台上,基本数据类型(例如整数)的表征可不同。RDBMS能够同时服务来自在各种平台上运行的客户计算机的请求。从而,网络通信管理组件具有丰富的一组转换能力,从而掩蔽平台之间的变化对客户计算机或服务器进行的数据库操作的结果的影响。查询(例如以SQL语句的形式)由查询管理组件处理。在被发送给RDBMS之前,查询可被解析和记号化(tokenize)。记号被取回并被变换成用于驱动查询处理的数据结构元件。当SQL查询到达RDBMS服务器时,SQL查询被分析,确定执行SQL查询的最佳方式。随后,构成驱动RDBMS记录管理组件所需的运行时间结构。利用这些初始化的数据结构驱动记录管理组件。查询分析、查询优化和运行时间数据结构的建立消耗CPU开销。2004年10月5日提交的美国专利申请No.10/958954,“Apparatus,System,andMethodforSupportingStorageFunctionsUsinganEmbeddedDatabaseManagementSystem”(代理人档案号TUC920040046US1)(下面称为′954申请)在此整体引为参考。′954申请描述一种表模块,第一字段包含存储标识符,第二字段具有数据内容。该表模块被配置成模仿虚拟存储装置,并保持多条记录。存在于逻辑磁盘(即由逻辑单元号(LUN)识别),以及存在于物理磁盘上的数据可被表示成扇区向量。扇区向量可被描述成一组连续的扇区。扇区向量可被保存在表格中。另外,压缩和加密把定长扇区变成可变大小的压缩或加密扇区。当扇区被保存在表的记录中时,压缩和加密导致保存在表中的变长记录。解决变长记录的问题的两种技术包括日志结构数组方法和基于DBMS的方法。日志结构数组方法把每个更新的或者新创建的扇区附到扇区向量的尾部,同时收回空洞留下的空间(M.Rosenblum和J.K.Ousterhout,“TheDesignandImplementationofaLog-StructuredFileSystem”,ACMTransactiononComputerSystems,V10,No.1,第26-52页,1992,该文献在此整体引为参考)。基于DBMS的方法为一组变长扇区引入一些额外的空间,以适应扇区大小的变化。和日志结构化数组相比,这更好地保持了记录的顺序性。对于已知具有高度顺序的I/O参考模式的商业和科学研究来说,该特征是重要的(国际商用机器公司,MVS/DFPV3R3SystemProgrammingReferenceIBMRedbooks,1996;M.Poess和D.Potapov,DataCompressioninOracle,InInternationalConferenceonVeryLargeDataBases,第937-947页,2003年;该文献在此整体引为参考),通过保持顺序性,更好地维持这些应用的预期。由于压缩的扇区具有可变长度,并且扇区的位置可随着时间而变化,因此可利用间接性定位压缩的扇区。于是,利用页内间接寻址(即,数据页中的正向地址用作访问技术),基于扇区号(即,对应于逻辑存储器中的扇区的逻辑扇区号)建立索引。正向地址允许记录在页中来回移动,而不改变索引。于是,SQL操作的执行挑选通过所述索引的访问路径来访问数据。通过以B树的形式构成索引,导航B树的CPU开销可能较大。当I/O大小不大时会发生这种情况,于是和通过叶页链接的索引页访问相比,B树遍历成本高得多;或者当虚拟扇区向量的大小变化(称为LUN重定大小)时会发生这种情况。LUN大小的变化可能相当大。LUN大小的变化可能导致表记录的大量插入和删除。从而,在LUN重定大小期间会观察到大量的B树非叶节点拆分和合并。出于上面的顾虑,减小索引操作成本变得重要。从而,本领域中需要在数据储存系统,比如RDBMS中实现存储管理功能。
发明内容提供一种访问扇区数据的方法,制造产品和系统。接收嵌入式存储子例程(function)。响应收到嵌入式存储子例程,产生一个或多个数据管理子例程。所述一个或多个数据管理子例程被调用,以从扇区表取回扇区数据。现在参见附图,其中相同的附图标记表示对应的部分图1图解说明其中可实现一些实施例的计算机体系结构的细节。图2根据一些实施例,图解说明嵌入式数据管理器的更多细节。图3根据一些实施例,图解说明把存储命令组件插入嵌入式数据存储管理器的逻辑。图4根据一些实施例,图解说明iSCSI实现。图5根据一些实施例,图解说明扇区表。图6根据一些实施例,图解说明把逻辑扇区映射成物理扇区的逻辑。图7根据一些实施例,图解说明访问具有定长记录的扇区表的逻辑。图8根据一些实施例,图解说明扇区表的范围群集索引。图9根据一些实施例,图解说明利用索引访问具有定长记录的扇区表的逻辑。图10图解说明根据一些实施例可使用的计算机系统的体系结构。具体实施例方式在下面的说明中,参考了附图,附图构成所述说明的一部分,并且图解说明几个实施例。显然可以利用其它实施例,并且在不脱离本发明的实施例的范围的情况下,可做出结构和操作变化。图1图解说明其中可实现一些实施例的计算机体系结构的细节。存储子系统100a包括存储客户机110a和存储服务器120a。存储客户机110a与存储服务器120a耦接。存储客户机110a包括系统存储器114a,它可用易失性和/或非易失性装置实现。一个或多个客户机应用(clientapplication)116a(即计算机程序)被保存在系统存储器114a中,以便由处理器(例如中央处理器(CPU))(未示出)执行。存储客户机110a还包括一个或多个设备驱动程序(driver)118a。存储服务器120a包括系统存储器124a,它可用易失性和/或非易失性装置实现。一个或多个服务器应用128a(即计算机程序)被保存在系统存储器124a中,以便由处理器(例如中央处理器(CPU))(未示出)执行。存储服务器120a与嵌入式数据存储服务器130a耦接。嵌入式数据存储服务器130a包括系统存储器134a,它可用易失性和/或非易失性装置实现。嵌入式数据存储管理器138a(即计算机程序)被保存在系统存储器134a中,以便由处理器(例如中央处理器(CPU))(未示出)执行。数据存储管理器130a与本地物理I/O子系统140a耦接。本地物理I/O子系统140a可被描述成存储器。存储子系统100b包括存储客户机110b和存储服务器120b。存储客户机110b与存储服务器120b耦接。存储客户机110b包括系统存储器114b,它可用易失性和/或非易失性装置实现。一个或多个客户机应用116b(即计算机程序)被保存在系统存储器114b中,以便由处理器(例如中央处理器(CPU))(未示出)执行。存储客户机110b还包括一个或多个设备驱动程序118b。设备驱动程序118a、118b代表存储客户机110a、110b发出逻辑I/O命令。存储服务器120b包括系统存储器124b,它可用易失性和/或非易失性装置实现。一个或多个服务器应用128b(即计算机程序)被保存在系统存储器124b中,以便由处理器(例如中央处理器(CPU))(未示出)执行。存储服务器120b与嵌入式数据存储服务器130b耦接。嵌入式数据存储服务器130b包括系统存储器134b,它可用易失性和/或非易失性装置实现。嵌入式数据存储管理器138b(即计算机程序)被保存在系统存储器134b中,以便由处理器(例如中央处理器(CPU))(未示出)执行。数据存储管理器130b与远程物理I/O子系统140b耦接。远程物理I/O子系统140b可被描述成存储器。网络190连接嵌入式数据存储服务器130a和嵌入式数据存储服务器130b。网络190可包括任何类型的网络,例如存储区域网(SAN),局域网(LAN),广域网(WAN),因特网,企业内部网等。在备选实施例中,计算机程序可被实现成硬件、软件,或者硬件和软件的组合。存储客户机110a、110b,存储服务器120a、120b和嵌入式数据存储服务器130a、130b可包括本领域中已知的任何计算装置,例如服务器、大型机、工作站、个人计算机、手持式计算机、膝上型电话装置,网络设备等。存储服务器120a、120b也可被称为存储控制器。本地物理I/O子系统140a和远程物理I/O子系统140b均包括一系列的存储装置,比如直接存取存储装置(DASD),简单磁盘捆绑(JBOD),独立磁盘冗余阵列(RAID),虚拟化装置等。注意术语“本地”和“远程”指的是子系统的相对位置。例如,远程物理I/O子系统140b远离本地物理I/O子系统140a,但是可能并不远离嵌入式数据存储服务器130b。在一些实施例中,嵌入式数据存储管理器138a、138b是RDBMS。在一些实施例中,存储客户机(例如110a)向对应的存储服务器(例如120a)发出逻辑I/O命令。存储服务器调用嵌入式数据存储管理器(例如130a)来处理逻辑I/O命令。嵌入式数据存储管理器把逻辑I/O命令转换成物理I/O命令。如果I/O命令目标在于本地存储器,那么嵌入式数据存储管理器把物理I/O命令路由给本地物理I/O子系统(例如140a)以便处理该物理I/O命令。如果I/O命令目标在于远程存储器,那么嵌入式数据存储管理器把物理I/O命令路由给远程嵌入式数据存储管理器(例如130b),该远程嵌入式数据存储管理器把I/O命令路由给远程物理I/O子系统(例如140b)以便处理该物理I/O命令。虽然存储子系统100a、100b被表示成均包括一个存储客户机和存储服务器,不过每个存储子系统100a、100b可包括一个或多个客户计算机和一个或多个存储服务器。图2根据一些实施例,图解说明嵌入式数据存储管理器200的更多细节。嵌入式数据存储管理器138a、138b可实现嵌入式数据存储管理器200的体系结构。嵌入式数据存储管理器200包括网络通信管理器组件210,查询管理组件220,存储命令组件230,数据管理组件240和缓冲器管理组件250。存储命令组件230接收嵌入式存储子例程,产生一个或多个数据管理子例程,并把所述一个或多个数据管理子例程转发给数据管理组件240。数据管理组件240产生一个或多个物理I/O命令,并把物理I/O命令转发给缓冲器管理组件250。缓冲器管理组件250直接与物理存储器交换作用,并执行所述一个或多个物理I/O命令。实际上,数据管理组件240和缓冲器管理组件250把文件存储虚拟为表格记录的存储。当在“原始的”存储器(即,不包含文件系统数据的存储器)上定义表格时,嵌入式数据存储管理器200类似于存储子系统中的存储虚拟化引擎动作。把存储命令组件嵌入数据存储管理器嵌入式数据存储管理器200实现所需的存储管理特征。嵌入式数据存储管理器200可被认为“被嵌入”在存储子系统接口之后。特别地,实施例把存储命令组件230插入嵌入式数据存储管理器138a、138b之内。从而,发送给存储服务器120a、120b的存储客户机110a、110b逻辑I/O命令由存储服务器120a、120b映射成由存储命令组件230、数据管理组件240和缓冲器管理组件250处理的嵌入式存储子例程调用,从而开发和导出一些数据存储管理器子例程和特征,作为存储子系统子例程和特征。嵌入式存储子例程由本发明的实施例提供。图3根据一些实施例,图解说明把存储命令组件230插入嵌入式数据存储管理器138a、138b的逻辑。I/O命令读取或写入一个或一组顺序寻址的扇区。一个扇区由二进制未解释数据(即未被文件系统或应用解释的二进制格式的数据)组成。不同于其它数据类型(例如整数),对于这种二进制数据不需要任何转换。在所有存储客户机处理器上,二进制数据被同样地解释。在图3中,控制始于方框300,数据管理组件240把嵌入式存储子例程导出(export)给存储服务器120a、120b。当存储客户机110a、110b产生的逻辑I/O命令到达存储服务器120a、120b时,存储服务器120a、120b把逻辑I/O命令映射成嵌入式存储子例程,并把嵌入式存储子例程调用发给嵌入式数据存储管理器138a、138b内的存储命令组件230。继续图3,在方框302中,存储命令组件230从存储服务器120a、120b接收嵌入式存储子例程调用。存储命令组件230知道如何应答这样的调用。对于读取I/O子例程调用,存储命令组件230从数据存储(例如数据库)抽取所需的记录。对于写入I/O子例程调用,存储命令组件230获得子例程调用中的数据,并更新数据存储(例如数据库)中的相关记录。由于嵌入式存储子例程调用目标在于存储命令组件230,因此实施例避免调用网络通信管理器组件210和查询管理组件220,这降低了开销。这样,通过使用嵌入式数据存储管理器138a、138b支持存储虚拟化,降低了开销。在方框303,存储命令组件230把嵌入式存储子例程调用转换成一个或多个数据管理子例程。例如,对I/O读取命令的嵌入式存储子例程调用被转换成一个或多个访问正确的记录,并从记录把扇区返回给调用者的数据管理子例程。作为另一例子,对I/O写入命令的嵌入式存储子例程调用被转换成用来自发出I/O写入命令的调用者的输入数据更新对应记录的一个或多个数据管理子例程。在方框304,所述一个或多个数据管理子例程从存储命令组件230被转发给数据管理组件240。在方框306,数据管理组件240产生一个或多个物理I/O命令。在方框308,数据管理组件240把所述一个或多个物理I/O命令转发给缓冲器管理组件250。在方框310,缓冲器管理组件250把响应(例如,物理读取I/O命令的数据或物理写入I/O命令的状态)转发给数据管理组件240。在方框312,数据管理组件240把响应转发给存储命令组件230。在方框314,存储命令组件把响应返回给存储服务器120a、120b。从而,I/O命令被转换成一个或多个嵌入式数据存储管理器138a、138b内部子例程调用,并从逻辑存储子系统传送给嵌入式数据存储管理器138a、138b。嵌入式数据存储管理器138a、138b还访问物理存储器,处理数据,并答复存储服务器120a、120b(即I/O发起者)。来自存储客户机110a、110b的设备驱动程序的I/O命令由一组特殊的命令(例如在一些实施例中,它们是SCSI命令)发起。在一些实施例中,遵循在小型计算机系统接口(SCSI)标准中描述的I/O命令格式,SCSII/O命令被映射成一组嵌入式存储子例程调用。只是为了促进理解,这里将描述读取和写入子例程调用,不过实施例适用于其它子例程调用。在一些实施例中,存储命令组件230实现因特网小型计算机系统接口(iSCSI)协议。这是利用嵌入式数据存储服务器130a、130b来提供存储功能的思想的一个实例。在一些实施例中,嵌入式数据服务器130a、130b与iSCSI目标耦接,所述iSCSI目标充当存储服务器120a、120b。图4根据一些实施例,图解说明iSCSI实现。如图4中所示,iSCSI目标被紧密结合到嵌入式数据存储服务器中,iSCSI目标和嵌入式数据存储服务器被图解表示成具有iSCSI目标410的嵌入式数据存储服务器。iSCSI目标被描述成存储服务器。iSCSI发起者400可被描述成与具有iSCSI目标410的嵌入式数据存储服务器耦接的存储客户机。具有iSCSI目标410的嵌入式数据存储服务器包括两个代理iSCSI和数据存储服务器监听器(listener)过程代理420,和iSCSI和数据存储服务器工作器(worker)过程代理430。在方框450中,当第一数据存储服务器代理(例如420)被激活时,iSCSI目标被初始化,数据存储服务器监听器过程在一个端口上等待将要到来的会话请求。iSCSI发起者400向监听器过程420的iSCSI部分发送会话请求。当收到新的会话请求时,从工作器过程的池中分派工作器过程(方框452),会话句柄(即套接字描述符)通过特殊的套接字消息被引向新的数据存储服务器代理(方框454)。在收到会话的套接字描述符之后,嵌入数据存储服务器代理的iSCSI工作器负责iSCSI发起者和工作器过程的iSCSI部分之间的通信(方框456),而数据存储服务器代理的工作器过程的数据存储服务器部分从在图5中描述的扇区表中取回数据/对所述扇区表更新数据(方框458)。下面的伪代码提供iSCSI协议实现的一个例子1)初始化iSCSI目标监听器过程Initialize_memory();Dispatch_DB_process(...,“iscsi_target_listener”...);//调用具有iSCSI目标监听器的新的数据存储服务器进程Destruct_memory();//在新的数据存储服务器过程中,启动新的iSCSI目标监听器,在等待连接的端口上监听。2)分派iSCSI/数据存储服务器工作器过程iscsi_sock_accept(...)Initialize_memory();Dispatch_DB_process(...,“iscsi_target_worker”,...)//调用具有iSCSI目标工作器的新的数据存储服务器进程Destruct_memory();在数据存储服务器工作器过程中,iSCSI目标工作器接管套接字句柄,并处理来自iSCSI发起者的I/O。套接字描述符从监听器过程420的iSCSI部分被传送给工作器过程(来自工作器过程430的池)的iSCSI部分。监听器过程420的iSCSI部分利用send_connection调用,发送套接字描述符,工作器过程的iSCSI部分利用receive_fd调用,等待套接字描述符。send_connection子例程把会话套接字句柄作为输入,构成包含套接字id的特殊消息,并把该消息传送给在监听器过程420的iSCSI部分和工作器过程的iSCSI部分之间的套接字。receive_fd子例程在监听器过程420的iSCSI部分和工作器过程的iSCSI部分之间的套接字上等待,直到该例程收到消息为止。receive_fd子例程打开(unwrap)该消息,并返回会话套接字句柄。下面的伪代码提供一个例证实现staticintsend_connection(intfd){structmsghdrmsg;  charccmsg[CMSG_SPACE(sizeof(fd))];  structcmsghdr*cmsg;  structiovecvec;  char*str="x";  intrv;  msg.msg_name=(structsockaddr*)&amp;unix_socket_name;  msg.msg_namelen=sizeof(unix_socket_name);  vec.iov_base=str;vec.iov_len=1;msg.msg_iov=&amp;vec;  msg.msg_iovlen=1;  msg.msg_control=ccmsg;  msg.msg_controllen=sizeof(ccmsg);  cmsg=CMSG_FIRSTHDR(&amp;msg);  cmsg->cmsg_level=SOL_SOCKET;<!--SIPO<DPn="11">--><dpn="d11"/>  cmsg->cmsg_type=SCM_RIGHTS;  cmsg->cmsg_len=CMSG_LEN(sizeof(fd));  *(int*)CMSG_DATA(cmsg)=fd;  msg.msg_controllen=cmsg->cmsg_len;  msg.msg_flags=0;  rv=(sendmsg(unix_socket_fd,&amp;msg,0)!=-1);  if(rv){  if(close(fd)!=0){  }  }  returnrv;  }  staticintreceive_fd(intfd)  {  structmsghdrmsg;  structioveciov;  charbuf[1];  intrv;  intconnfd=-1;  charccmsg[CMSG_SPACE(sizeof(connfd))];  structcmsghdr*cmsg;  iov.iov_base=buf;  iov.iov_len=1;  msg.msg_name=0;  msg.msg_namelen=0;  msg.msg_iov=&amp;iov;<!--SIPO<DPn="12">--><dpn="d12"/>  msg.msg_iovlen=1;  msg.msg_control=ccmsg;  msg.msg_controllen=sizeof(ccmsg);  rv=recvmsg(fd,&amp;msg,0);  cmsg=CMSG_FIRSTHDR(&amp;msg);  if(!cmsg->cmsg_type=SCM_RIGHTS){  fprintf(stderr,"gotcontrolmessageofunknowntype%d\n",  cmsg->cmsg_type);  return-1;  }  retum*(int*)CMSG_DATA(cmsg);  }利用到数据管理组件的接口访问数据由于I/O命令实质上读取或写入一个或一组顺序寻址的扇区,因此通过回避网络通信管理器组件210和查询管理组件220,并使存储命令组件230代码直接对数据管理组件240发出调用,消除了一些开销。在一些实施例中,遵循在小型计算机系统接口(SCSI)标准中描述的I/O命令格式,SCSI命令被映射成一个或多个嵌入式存储子例程调用。只是为了促进理解,这里将描述读取和写入子例程调用,但是实施例适用于其它子例程调用。逻辑I/O命令由5个参数(T,i,s,n,C)描述。T描述访问类型是读取还是写入。第二个参数i是逻辑扇区向量号,逻辑扇区向量是一组连续的逻辑扇区。第三个参数s识别逻辑扇区向量i中将被访问的起始扇区。第四个参数n指示将被访问的连续扇区的数目。对于写入I/O命令,参数C包含将针对写访问被更新的扇区的内容。对于读取I/O命令,参数C是包含正被读取的扇区的返回参数。由于SCSI命令集包括一个SCSI读取命令和一个SCSI写入命令,因此访问类型参数不和这些SCSI命令一起使用。SCSI读取命令由四个参数组成byteoffset(起始字节);numofbytes(要取回的字节的总数);databuff(保存从磁盘读取的数据的缓冲器);和扇区表标识符。首先,byteoffset和numofbytes被用于计算扇区表中将被访问的第一条记录和最后一条记录。扇区表标识符被转换成表名称。在表可被访问之前,ScanOpen子例程被调用,以打开用于索引扫描的指针,接下来是一系列的RowFetch子例程调用。RowFetch子例程每次把一条记录取到数据缓冲器中。在到达最后一行之后,关闭表指针。下面是把SCSI读取命令转换成数据管理子例程的伪代码  Read(intbyteoffset,intnumofbytes,char*databuff,char*LUN)  {  intmystartkey=byteoffset/size_of_1_row;  intmyendkey=(byteoffset+numofbytes-1)/size_of_1_row;  ……  IndexStartkey=&amp;mystartkey;  IndexEndkey=&amp;myendkey;  ……  //preparetoaccesstable  TableOpen(……,  IndexInfo,//firstscaninformationwithindexrangeinformation  TableInfo,//secondscaninformationwithtableinformation  ……);  for(inti=mystartkey;i<=myendkey;i++){  ……  RowFetch(……,databuff,……);//retrieveonerecordintodatabuff  databuff+=size_of_1_row;  ……  }  TableClose(……);//donewiththetableaccessandclosecursor  }当收到嵌入式存储子例程时,存储命令组件230调用读取命令,数据管理组件240执行读取子例程。SCSI写入命令和数据管理组件调用之间的转换类似于参考SCSI读取命令讨论的转换,除了SCSI写入命令更新记录,和所述更新被提交之外。在表格可被访问之前,ScanOpen子例程被调用,以打开用于索引扫描的指针,接下来是一系列的RowFetch和RowUpdate子例程调用。RowFetch子例程每次把一条记录取到写入缓冲器中。新数据从数据缓冲器复制到写入缓冲器中。RowUpdate子例程被调用,以便用写入缓冲器中的新的记录数据更新记录。在到达最后一行之后,通过调用TableClose子例程,关闭表指针。最后更新被提交。下面是把SCSI写入命令转换成数据管理子例程调用的伪代码。  Write(intbyteoffset,intnumofbytes,char*databuff,char*tablename)  {  intmystartkey=byteoffset/size_of_1_row;  intmyendkey=(byteoffset+numofbytes-1)/size_of_1_row;  ……  IndexStartkey=&amp;mystartkey;  IndexEndkey=&amp;myendkey;  ……  //preparetoaccesstable  TableOpen(……,  IndexInfo,//firstscaninformationwithindexrangeinformation  TableInfo,//secondscaninformationwithtableinformation  ……);  for(inti=mystartkey;i<=myendkey;i++){  RowFetch(……,writebuff,……);//retrieveonerecordintowritebuff  Copy(writebuff,databuff,size_of_1_row);//copynewdataintowritebuffer  databuff+=size_of_1_row;  RowUpdate(……,writebuff,……);//updatetherecordwithnewdata  }  TableClose(……);//donewiththetableaccessandclosecursor  Commit();//commiteachupdate  }当收到嵌入式存储子例程时,存储命令组件230调用读取命令,数据管理组件240执行读取子例程。扇区累积数据管理组件240招致每条记录的计算开销。特别地,读取和写入I/O的读取和写入子例程调用的数目正比于访问的记录的数目。如果I/O命令处理的记录的数目被减小,那么计算成本被降低。为了实现这点,实施例提供一种新的扇区表方案,其中多个连续的逻辑扇区被一起保存在单一记录内。这可被称为扇区累积。图5根据一些实施例图解说明扇区表500。该扇区表可位于物理I/O子系统140a、140b中。扇区表500包括两栏,扇区标识符栏510和扇区数据栏520。扇区表的一条记录包含由多个连续逻辑扇区组成的扇区数据和第一个扇区的扇区标识符。利用扇区表500可实现空间效率,因为对多个扇区只保存一个扇区标识符。扇区表500被配置成模仿虚拟存储装置,并且保持多条记录。在存储虚拟化系统中,利用逻辑扇区的地址指定逻辑I/O命令。虚拟化引擎的任务是把这些逻辑扇区地址转换成实际的物理扇区地址。特别地,逻辑扇区常常被建模成三元组<LUNid,bnum,数据>,其中LUNid是逻辑磁盘ID1,bnum表示逻辑磁盘中的扇区数目,数据是bnum涉及的扇区数据。在一些实施例中,物理扇区向量由出自相同物理装置的一组512字节的连续物理扇区组成。整个物理存储器(它可由几个物理装置组成)可被建模成r个物理扇区向量。实施例利用嵌入式数据存储管理器对象定义r个物理扇区向量,n个逻辑扇区向量和它们的映射。图6根据一些实施例,图解说明由数据管理组件240执行的把逻辑扇区映射成物理扇区的逻辑。具体地说,逻辑扇区被映射成扇区表中的一条记录,随后,数据管理组件240把扇区表中的该记录映射到表空间中的一个物理扇区。控制始于方框600,数据管理组件240创建逻辑扇区向量的扇区表,并把逻辑扇区映射成扇区表中的记录。具体地说,对于每个逻辑扇区向量BVi,定义一个表扇区向量TBVi,其表方案为(扇区标识符,扇区数据)。扇区标识符字段是整数,它唯一地识别扇区向量中的第一扇区。扇区数据字段保存扇区的内容。当创建了扇区表时,逻辑扇区被映射到扇区表的记录。在方框602,数据管理组件240为物理I/O子系统存储器中的表空间中的物理扇区向量创建容器。具体地说,每个物理扇区向量PVj由一个容器CPVj表示。容器可存在于文件或原始装置上。部署容器以便允许嵌入式数据存储管理器138a、138b直接管理存储子系统。在一些实施例中,容器由页面组成。每个页面包含多条记录,每条记录代表一个物理扇区。在方框604中,数据管理组件240通过利用容器存在于其中的表空间,把与逻辑扇区向量相关的扇区表中的每条记录映射到一个物理扇区向量,建立逻辑扇区向量和物理扇区向量之间的关系。具体地说,表空间是跟踪逻辑扇区向量和物理扇区向量之间的映射的嵌入式数据存储管理器对象。表空间由一组容器组成,每个表空间专用于一个TBV表。在一些实施例中,表空间可以是磁盘或磁盘分区。在方框606中,数据管理组件240使用表空间图来跟踪逻辑扇区向量和物理扇区向量之间的映射。即,在通过表空间建立了逻辑扇区向量和物理扇区向量之间的关系之后,利用表空间图保持从逻辑扇区到物理扇区的映射。当逻辑扇区向量改变其驻留(residential)物理扇区向量时,表空间图被更新以反映新的布局。在块608中,表空间图用于在逻辑扇区向量和物理扇区向量之间进行转换。借助扇区累积,通过组合<j,bij>,<j+1,bij+1>,...,<j+k-1,bij+k-1>,TBVi中的三元组变成<j,bijbij+1...bij+k-1>。同样,TBV表包含两个字段,识别一行中的第一个扇区的扇区标识符,和由k个连续的逻辑扇区组成的扇区数据。实施例确定k的最佳值。数据存储管理器138a、138b以数据页为单位读取或写入记录,数据页的大小通常是4KB的倍数。数据页由页面报头(pageheader),页中的记录的指针和数据记录(每行一条数据记录)组成。前两个数据结构构成页元数据。在一些实施例中,假定记录不能跨页,为了使数据页利用率最大化,尽可能多的扇区被置于一页中,并被合并成一行。于是,k的值由等式(1)给出k=(页面大小-页元数据大小)/扇区大小(1)例如,如果页面大小为8K字节,页元数据为400字节,扇区大小为512字节,那么k等于15。注意由于表中关键字(key)的数目减少,扇区累积还节省索引空间成本和数据页中的记录报头的数量。注意对于对一页中的许多记录的数据访问来说,I/O成本是一页。于是,在一些实施例中(例如在不考虑数据登录(logging)的实施例中,扇区累积并不引入额外的I/O成本。另外,在一些实施例中,由于嵌入式数据存储管理器I/O访问基于页(例如4KB,8KB,16KB或32KB),并且一条记录不能跨页,因此累积的扇区的数目是能够放入一页的数目(即512字节二进制值)。对扇区数据的访问可使用不同的技术来保存数据。在一种技术中,数据被保存在表的记录中。对于定长记录,通过使用扇区标识符来查找扇区表中记录的位置,对记录定位。图7根据一些实施例,图解说明访问具有定长记录的扇区表的逻辑。控制始于方框700,接收对提供扇区标识符的扇区向量的请求。在方框702,通过比较接收的扇区标识符和扇区标识符栏中的值,确定扇区表中的记录的位置。在方框704,所识别的记录的一个或多个逻辑扇区的扇区数据被用于映射到一个或多个物理扇区。在方框706,访问一个或多个物理扇区。所述映射使用参考图6说明的表空间图。对于变长扇区(即,已被压缩或加密的扇区向量的那些扇区),实施例利用索引。对于扇区表,可在扇区标识符栏建立索引,通过遍历索引来查找所需的扇区,可访问扇区。实施例利用保存在逻辑磁盘表格中的记录的标识性质(即,关键字)来提供特殊的优化。首先,扇区编号字段被赋予一个整数的固定大小。其次,更新并不移动索引记录,因为扇区标识符保持不变。即,当一个扇区被更新时,扇区表的扇区数据字段被修改,扇区标识符字段(它是索引中的关键字)不被修改。根据这两个性质,以这样的方式布置索引记录,以致通过利用等式(2)和(3)可计算它们的地址利用等式3和4直接定位每个索引记录。已知索引记录的关键字的值,r(即,这里关键字是扇区表的扇区标识符),那么利用等式(2)和(3)计算索引页的页码(pagenumber),PageNum(r),和索引页中的偏移量Offset(r)PageNum(r)=r/l+metapage;(2)Offset(r)=(rmodl)×sizeof(record)+header;(3)在等式(2)和(3)中,l是索引页中的索引记录的数目,metapage代表用于保存索引的元数据的页的数目,header是由索引页的报头消耗的空间。从而,通过利用扇区表的扇区标识符作为关键字,创建索引。随后,通过把关键字除以索引页中的索引记录的数目,产生第一结果,并把用于保存索引的元数据的页的数目和第一结果相加,确定特定关键字的索引的页码。随后,通过把关键字以索引页中的索引记录的数目为模,产生第二结果,把第二结果乘以记录的大小,从而产生第三结果,把索引页的报头消耗的空间和第三结果相加,确定关键字的偏移量。一旦索引记录被识别,那么索引记录中的信息就被用于访问扇区表。图8根据本发明的实施例,图解说明了扇区表810的范围群集索引800。通过构成单级索引布局,消除了B树。分析建立在扇区标识符上的索引中的记录结果,发现叶级的索引记录由两个字段组成关键字扇区标识符,和指向数据页及与对应记录(例如814)链接的槽(例如812)的行标识符(RID)(例如802)。在叶级上,关键字扇区标识符和RID具有定长的唯一值,并且提出介于关键字的最大值和最小值之间的值。依据等式(2)和(3)可得到索引条目的访问,索引结构只是表格式的。于是,消除了二分搜索,所需的索引页和索引条目被直接访问。该索引结构可被称为范围群集索引(RCI),该访问技术可被称为索引直接访问(IDA)。借助这种方法,索引记录访问变得不太昂贵,因为可避免一般的B树遍历。图9根据一些实施例,图解说明使用索引访问扇区表的逻辑。控制始于方框900,接收对提供扇区标识符的扇区向量的请求,扇区标识符是扇区表的索引的关键字。在方框902,利用等式PageNum(r)=r/l+metapage和Offset(r)=(rmodl)×sizeof(record)+header识别索引中的索引记录。在方框904,索引记录被用于访问扇区表。在方框906,一个或多个逻辑扇区的扇区数据用于映射到一个或多个物理扇区。在方框908,访问一个或多个物理扇区。所述映射使用参考图6描述的表空间图。对于范围群集索引,假定索引高度为h。和B树中的O(h)相比,因SQL执行的第一个RID读取操作涉及RCI中的O(l)索引页访问。O(x)可被描述成提供“O”级的复杂性,这里括号中的计算“x”描述复杂性。LUN调整大小操作既包括LUN大小的增大,又包括LUN大小的降低。对这两种情况,B树索引逐一插入或删除记录,这是非常昂贵的。虽然在自底向上法中存在建立索引记录的批量装入实用程序,于是和单独插入相比,整个过程要廉价得多,不过仍然要构成中间节点。对于RCI,新的索引记录被附到当前的索引结构上,或者从索引结构的尾部除去删除的索引记录。如果表大小的变化为x%,那么LUN调整大小的索引操作成本仅为O(x%×c)。与某些商业虚拟化软件相比,依据追踪驱动测试的测量,实施例把商业虚拟化软件的CPU路径长度的总量降低了90%。另外的实施例细节通过利用标准的编程和/或工程技术来产生软件、固件、硬件或者它们的任意组合,所描述的操作可被实现成一种方法、设备或制造产品。这里使用的术语“制造产品”指的是在介质中实现的代码或逻辑,这里这种介质可包括硬件逻辑(例如集成电路芯片,可编程门阵列(PGA),专用集成电路(ASIC)等)或者计算机可读介质,比如磁性存储介质(例如硬盘驱动器、软盘、磁带等),光学存储器(CD-ROM、光盘等),易失性和非易失性内存(memory)装置(例如EEPROM、ROM、PROM、RAM、DRAM、SRAM、固件、可编程逻辑等)。计算机可读介质中的代码由处理器访问和执行。其中代码或逻辑被编码的介质还可包含通过空间或传输介质,比如光纤、铜导线等传播的传输信号。其中代码或逻辑被编码的传输信号还可包含无线信号、卫星传输、无线电波、红外信号、蓝牙等。其中代码或逻辑被编码的传输信号能够由发射站发射并由接收站接收,在传输信号中编码的代码或逻辑可被解码并保存在接收和发射站或设备的硬件或计算机可读介质中。另外,“制造产品”可包括其中包含、处理和执行所述代码的硬件和软件组件的组合。当然,本领域的技术人员会认识到可对这种构造进行许多修改,而不脱离本发明的范围,并且制造产品可包含本领域中已知的任何信息承载介质。举例来说,术语逻辑可包括软件或硬件和/或软件和硬件的组合。图3、6、7和9的逻辑描述了按照特定顺序发生的具体操作。在备选实施例中,一些逻辑操作可按照不同的顺序执行,被修改或除去。此外,可向上述逻辑增加步骤,并且仍然符合描述的实施例。此外,这里描述的操作可顺序发生,或者一些操作可并行处理,或者,描述成由单一进程执行的操作可由分布式进程执行。图3、6、7和9的例证逻辑可用软件、硬件、可编程和不可编程门阵列逻辑实现,或者用硬件、软件或门阵列逻辑的某种组合来实现。图10图解说明根据一些实施例可使用的计算机系统的体系结构1000。存储客户机110a、110b、存储服务器120a、120b和/或嵌入式数据存储服务器130a、130b可实现体系结构1000。计算机体系结构1000可实现处理器1002(例如,微处理器),内存1004(例如,易失性内存装置),和存储器1010(例如,非易失性存储区,例如磁盘驱动器,光盘驱动器,磁带驱动器等)。操作系统1005可在内存1004中执行。存储器1010可包含内部存储装置或附加的或网络可访问的存储器。存储器1010中的计算机程序1006可被装入内存1004中并由处理器1002按照本领域中已知的方式执行。该体系结构还包括使得能够与网络通信的网卡1008。输入装置1012被用于把用户输入提供给处理器1002,可包括键盘、鼠标、指示笔、麦克风、触敏显示屏、或者本领域中已知的任何其它激活或输入机构。输出装置1014能够再现来自处理器1002或者其它组件的信息,比如显示监视器、打印机、存储装置等。计算机系统的计算机体系结构1000可包括比图解说明少的组件,这里未图解说明的其它组件,或者图解说明的组合和另外组件的一些组合。计算机体系结构1000可包含本领域中已知的任何计算装置,比如大型机、服务器、个人计算机、工作站、膝上型计算机、手持式计算机、电话设备、网络设备、虚拟化装置、存储控制器等。可以使用本领域中已知的任何处理器1002和操作系统1005。出于举例说明的目的,给出了实施例的上述说明。上述说明并不是详尽的,也不打算把本发明局限于公开的具体形式。鉴于上述教导,许多修改和变化是可能的。本发明的范围不受该详细说明限制,而是由附加的权利要求限定。上述说明,例子和数据提供了本发明的组成物的制造和使用的完整描述。由于在不脱离本发明的精神和范围的情况下,可做出本发明的许多实施例,因此本发明由附加的权利要求或者任何后续提出的权利要求,以及它们的等同物限定。权利要求1、一种访问扇区数据的方法,包括接收嵌入式存储子例程;响应收到嵌入式存储子例程,产生一个或多个数据管理子例程;和调用一个或多个数据管理子例程,以从扇区表取回扇区数据。2、按照权利要求1所述的方法,其中扇区表包括保存多个连续的逻辑扇区的扇区数据栏,和保存相关的多个连续逻辑扇区中的第一扇区的扇区标识符的扇区标识符栏。3、按照权利要求1所述的方法,还包括把一个或多个逻辑扇区向量中的每个映射成扇区表中的记录。4、按照权利要求1所述的方法,其中嵌入式存储子例程识别一个逻辑扇区,其中所述一个或多个数据管理子例程识别对应的物理扇区。5、按照权利要求1所述的方法,还包括创建一个或多个逻辑扇区向量的扇区表;把每个逻辑扇区向量映射成扇区表中的记录;为表空间中的一个或多个物理扇区向量创建一个或多个容器;利用表空间,建立一个或多个逻辑扇区向量和一个或多个物理扇区向量之间的一个或多个关系;和创建表空间,以能够实现一个或多个逻辑扇区向量和一个或多个物理扇区向量之间的映射。6、按照权利要求1所述的方法,其中扇区表包含定长记录,其中嵌入式存储子例程提供扇区标识符,还包括使用扇区标识符来定位扇区表中的记录。7、按照权利要求1所述的方法,其中扇区表包含变长记录,还包括在扇区表的扇区标识符上创建索引;接收对提供扇区标识符的扇区向量的请求,其中扇区标识符是进入索引中的关键字;通过把关键字除以索引页中的索引记录的数目以产生第一结果并把用于保存索引元数据的页数和第一结果相加,确定在索引中的索引记录的关键字的页码;和通过把关键字以索引页中的索引记录的数目为模以产生第二结果、把第二结果乘以记录的大小以产生第三结果并把索引页的报头消耗的空间和第三结果相加,确定关键字的偏移量;使用所述偏移量来定位索引中的记录。8、按照权利要求1所述的方法,还包括导出嵌入式存储子例程。9、一种访问扇区数据的制造产品,其中所述制造产品包含包括指令的代码,其中所述制造产品可实现按照前述任意权利要求所述的方法。10、一种访问扇区数据的系统,包括能够使操作被执行的逻辑,所述操作包括接收嵌入式存储子例程;响应收到嵌入式存储子例程,产生一个或多个数据管理子例程;和调用一个或多个数据管理子例程,以从扇区表取回扇区数据。11、按照权利要求10所述的系统,其中扇区表包括保存多个连续的逻辑扇区的扇区数据栏,和保存相关的多个连续逻辑扇区中的第一扇区的扇区标识符的扇区标识符栏。12、按照权利要求10所述的系统,所述操作还包括把一个或多个逻辑扇区向量中的每个映射成扇区表中的记录。13、按照权利要求10所述的系统,其中嵌入式存储子例程识别逻辑扇区,其中所述一个或多个数据管理子例程识别对应的物理扇区。14、按照权利要求10所述的系统,所述操作还包括创建一个或多个逻辑扇区向量的扇区表;把每个逻辑扇区向量映射成扇区表中的记录;为表空间中的一个或多个物理扇区向量创建一个或多个容器;利用表空间,建立一个或多个逻辑扇区向量和一个或多个物理扇区向量之间的一个或多个关系;和创建表空间,以能够实现一个或多个逻辑扇区向量和一个或多个物理扇区向量之间的映射。15、按照权利要求10所述的系统,其中扇区表包含定长记录,其中嵌入式存储子例程提供扇区标识符,所述操作还包括使用扇区标识符来定位扇区表中的记录。16、按照权利要求10所述的系统,其中扇区表包含变长记录,所述操作还包括在扇区表的扇区标识符上创建索引;接收对提供扇区标识符的扇区向量的请求,其中扇区标识符是进入索引中的关键字;通过把关键字除以索引页中的索引记录的数目以产生第一结果并把用于保存索引元数据的页数和第一结果相加,确定在索引中的索引记录的关键字的页码;和通过把关键字以索引页中的索引记录的数目为模以产生第二结果、把第二结果乘以记录的大小以产生第三结果并把索引页的报头消耗的空间和第三结果相加,确定关键字的偏移量;使用所述偏移量来定位索引中的记录。17、按照权利要求10所述的系统,所述操作还包括导出嵌入式存储子例程。18、按照权利要求10所述的系统,其中所述逻辑驻留于包括存储命令组件、数据管理组件和缓冲器管理组件的嵌入式数据存储服务器上。19、按照权利要求18所述的系统,其中存储命令组件接收嵌入式存储子例程,产生一个或多个数据管理子例程,并调用所述一个或多个数据管理子例程,其中数据管理组件执行数据管理子例程以从由缓冲器管理组件访问的扇区表中取回扇区数据。全文摘要提供访问扇区数据的技术。接收嵌入式存储子例程。响应收到嵌入式存储子例程,产生一个或多个数据管理子例程。调用所述一个或多个数据管理子例程,以从扇区表取回扇区数据。文档编号G06F9/46GK1900935SQ200610105850公开日2007年1月24日申请日期2006年7月13日优先权日2005年7月14日发明者巴拉克里斯纳·艾耶,林·S.·乔,阿莫·萨切迪纳申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1