专利名称:适用于对象网络存储的分布式多级缓存系统的制作方法
技术领域:
本发明属于计算机存储技术领域,具体涉及一种适用于对象网络存储的分布式多级缓存系统。
背景技术:
下一代互联网速度更快、规模更大、安全性与服务质量更高,从而要求基于下一代互联网的网络存储系统具有与之适应的高效性、可扩展性、安全性和高服务质量。传统的以块和文件为基础构建的存储系统(如NAS、SAN等)已经不能满足上述要求。美国加州大学Berkeley分校的Paterson教授、卡内基梅隆大学等多所大学及研究机构提出了一种基于对象(Object-Based)的网络存储接口协议,以此方便构建高效的大型网络存储系统。
中国发明专利公开号为CN 1728665A的发明公开了一种组建基于对象的存储系统的方法。该发明所述基于对象的网络存储系统,包括由计算机网络连接的I个元数据服务器、N个对象存储节点和M个客户端,其对象文件系统是基于标准Linux的ext2文件系统,带有日志文件系统特性。
大型网络存储系统需要设计一个高效的并行文件系统与之相匹配,才能实现存储系统的高带宽、高扩展性、高安全性、智能化等。文件系统作为系统的I/O子系统,在很多情况下会成为系统性能进一步提高的瓶颈。设计一个高性能的并行文件系统需要从两个方面进行考虑一方面尽可能减少对磁盘的访问次数,另一方面尽可能简化网络访问协议,减少网络协议开销。文件系统缓存技术是一种尽量减少文件系统访问磁盘次数的机制,用提高文件系统性能的方法来弥补磁盘性能的不足;同时,好的缓存系统设计还可以简化网络访问协议。
目前,基于对象存储文件系统已成为高性能网络存储文件系统的研究热点,产生了如Cluster File Systems公司的Lustre、Panasas公司的ActiveScale文件系统、加州大学圣克鲁兹分校开发的面向对象的文件系统OBFS等。这些文件系统都各有特点,在文件系统缓存方面也都有所提及,但主要集中在某个方面缓存策略的研究,缓存系统缺乏整体性,造成缓存系统访问控制协议复杂、访问请求响应时间较大等不足。还有一种实现缓存的方法是把缓存作为一个独立的设备运行,此种方案对缓存进行集中管理,方便实现某些替换、查找策略,但独立的设备增加了成本,同时也是系统的单一故障点。
发明内容
本发明的目的在于提供一种适用于对象网络存储的分布式多级缓存系统,该系统克服了现有缓存系统访问控制协议复杂、访问请求延迟较大的不足,在客户端、对象存储节点设立三级缓存提供完整的缓存系统及其缓存策略,简化节点间网络访问协议、降低元数据服务器负载、减少数据访问请求响应时间、提高系统I/O处理能力、降低系统构建成本。
本发明提供的一种适用于对象网络存储的分布式多级缓存系统,其特征在于该系统包括位于客户端中的零级缓存和一级缓存,以及位于对象存储节点中的二级缓存;零级缓存用于对源自元数据服务器中元数据的缓存,一级缓存为直接服务于应用进程的数据缓存,二级缓存为直接服务于客户端的数据缓存;零级缓存管理模块负责零级缓存中元数据的查找、替换以及按照网络访问控制协议进行元数据的访问;一级缓存管理模块用于控制一级缓存,负责共享内存空间的申请、分配、回收以及缓存单元的置换;二级缓存管理模块负责对对象存储节点间二级缓存进行多队列统一置换。
本发明具有如下特点
(1)零级元数据缓存设在客户端,在缓存命中情况下比采用PVFS结构并行文件系统减少一次元数据服务器的访问,降低了网络通信量;设计了一种简化的元数据访问协议,解决了多个客户端元数据缓存一致性问题;加快了元数据的访问速度,降低了服务请求响应时间;提高了整个文件系统的I/O吞吐量;(2)一级数据缓存采用共享内存方式实现,减少了进程通信时内存拷贝次数,实现应用进程间数据共享;一级缓存采用基于hash的LFU-DA算法,保留了LFU-DA算法命中率高的特点,同时极大降低了缓存对象的平均查找时间;(3)对象存储节点中的二级缓存能推迟并减少对磁盘的直接访问,根据对象存储节点对象访问特性,提出了访问组的概念,同时设计的多队列统一置换算法,综合考虑了访问时间和访问频率,使各对象存储节点缓存命中率趋于均匀,提高存储节点缓存整体命中率;(4)三级缓存共同组成适用于对象网络存储的分布式多级缓存系统,极大的提高了存储系统的效率,减少了系统延迟,提高了系统数据传输率。
图1是本发明适用于对象网络存储的分布式多级缓存系统示意图;图2.1是改进前文件系统读文件过程示意图;图2.2是本发明在客户端设立元数据缓存后读文件过程示意图;图3.1是本发明在客户端设立一级缓存后缓存块分配前缓存状态示意图;图3.2是本发明在客户端设立一级缓存后缓存块分配后缓存状态示意图;图3.3是本发明在客户端设立一级缓存后缓存块释放前缓存状态示意图;图3.4是本发明在客户端设立一级缓存后缓存块释放后缓存状态示意图;图4是本发明数据访问控制流程图。
具体实施例方式
如图1所示,基于对象网络存储系统中,元数据服务器1、对象存储节点2和客户端3由计算机网络连接在一起。数据访问过程如下由客户端3向元数据服务器1发送访问请求;元数据服务器1验证客户身份,确认后查询本地元数据,如果存在,则元数据服务器1给相应对象存储节点2发送访问请求测试包,对象存储节点2确认对象打开后向元数据服务器1返回授权及客户所请求的存储对象映射表;客户端3收到元数据服务器1的信息后与对象存储节点建立连接,进行数据传输。
本发明的分布式多级缓存系统包括客户端3中的零级缓存6、一级缓存8和对象存储节点2中的二级缓存4。三级缓存均在主存中实现。零级缓存6设立在客户端3中,是对来源于元数据服务器1的元数据缓存,在缓存命中情况下能够减少一次元数据服务器1的访问,元数据缓存的高命中率极大地降低了网络通讯量;一级缓存8是直接服务于应用进程的数据缓存,它的命中直接消除了客户端3到对象存储节点2的网络消耗,提高了系统性能;二级缓存4设立在对象存储节点2,直接服务于客户端3,缓存命中情况下可以避免访问低速物理存储设备,加快了数据访问速度。
本发明三级缓存分别由各自缓存管理模块控制。零级缓存管理模块7负责零级缓存6中元数据的查找、替换以及零级缓存未命中情况下按照网络访问控制协议进行元数据服务器的访问。元数据查找采用由元数据项对应的全局路径名作为hash参数建立的缓存hash表,以加快查找速度;元数据缓存替换策略采用FIFO(First In First Out)队列;元数据访问控制协议首先访问零级缓存6,命中则直接向元数据服务器1发送服务请求,未命中则发送元数据查询请求,得到确认后再发送服务请求。一级缓存管理模块9负责共享内存空间的申请、分配、回收以及缓存单元的置换。一级缓存8用共享内存方式实现,系统通过一级缓存管理模块9管理缓存空间的申请、分配和回收;一级缓存8中缓存单元置换采用基于hash的LFU-DA(LFU with Dynamic Aging)算法。二级缓存管理模块5负责对象存储节点2之间二级缓存4的统一置换,采用多队列统一置换算法——MQU(Multi-Queue United)算法。
零级缓存6是元数据缓存,在基于对象的存储系统中元数据包括文件与对象的映射信息、对象存储节点信息和存储对象的属性信息等。虽然基于对象的存储系统中对象元数据(属性)很丰富,但在元数据服务器1上只保存与用户相关的对象属性(如文件名与对象ID映射,对象存储节点位置信息),这部分属性占用的空间并不大,通常只需一百个字节到两百个字节。零级缓存是供客户端查询文件是否存在,只需保留文件名与对象ID映射即可。因此在主存中一个容量为1MB的零级缓存空间可以容纳近万条供查询的存储对象元数据,对越来越大的主存空间来说这点花费是值得的,这保证了元数据缓存具有相当高的缓存命中率。如此规模的缓存元数据使元数据被置换不经常发生,因此置换算法采用FIFO队列,特点是实现简单。但是较多的元数据又使查找变的困难,查找算法的性能决定零级缓存6的效率,本发明采用查找效率最高的hash表,用元数据项对应的全局路径名作为hash参数建立缓存hash表,加快查找速度。客户端启动时零级缓存为空,零级缓存在客户端第一次访问异地数据的同时从元数据服务器获得所需元数据的备份。
基于对象网络存储系统中客户端应用进程数据访问首先对要访问的文件(从应用程序呈现的数据访问形式仍为文件)做路径检查,如果是本地文件则调用本地操作函数对文件进行处理;否则,把要访问文件的路径转化为全局文件系统唯一路径名,随后与元数据服务器建立连接。基于对象网络存储系统中数据集中存放在对象存储节点,因此整个对象文件系统中对元数据的操作是非常频繁的。本发明涉及的用于对象网络存储系统的分布式文件系统参照PVFS设计,其访问过程清晰、实现简单,但PVFS对每一次元数据操作需要访问两次元数据服务器,一次查询,一次获取真正元数据,会带来大量的网络通讯开销,不能满足对象文件系统要求,必须对数据访问协议进行改进,改进的方法是在客户端设立零级缓存。
没有设立零级缓存情况下的对象存储节点数据访问过程如图2.1所示。从客户端看,主要分为以下步骤A1客户端把要访问文件的路径转化为全局文件系统唯一路径名,与元数据服务器建立连接,发出查询请求;A2元数据服务器对客户端访问进行身份验证,合法则查询元数据,确认所访问的文件是否存在,发送应答信息到客户端;否则客户端访问非法,过程结束;
A3客户端收到应答信息,如果要访问的数据存在,则向元数据服务器发出读对象请求,否则向应用进程报错,过程结束;A4元数据服务器收到客户读对象请求后,发送对象ID到相关对象存储节点;A5对象存储节点验证元数据服务器访问请求后,打开对象,发送应答信息到元数据服务器;A6元数据服务器收到应答后,把对客户端的授权、文件与存储对象ID映射表以及存储对象节点位置信息应答给客户端;A7客户端收到元数据服务器的应答信息后,向所收到元数据对应的对象存储节点发读对象请求命令包,与相应对象存储节点建立连接;A8对象存储节点验证用户请求,确认后发送数据对象给客户端,直到数据传输结束。
可以看出上述数据访问控制协议总共涉及到两次客户端与元数据服务器的网络通信,一次与各相关对象存储节点的网络通信,还包括一次元数据服务器与各存储节点的网络通信,所引起的网络通信开销是很大的,严重限制了系统性能的提高。
详细分析上述协议,发现该协议可以简化。本发明在客户端构建零级元数据缓存就是一种简化上述网络访问控制协议的方法。简化后的网络访问控制协议如图2.2所示,主要分如下几个步骤B1客户端把要访问文件的路径转化为全局文件系统唯一路径名,应用进程查询零级缓存,判断缓存是否命中,命中进入步骤B4;B2零级缓存未命中则客户端与元数据服务器建立连接,发送元数据查询请求;B3元数据服务器对客户端访问进行身份验证,合法则查询元数据,确认所访问的文件是否存在,发送应答信息到客户端,进入步骤B5;B4客户端零级缓存命中则应答应用进程;B5客户端应用进程收到应答信息后,访问对象存在则发送读对象请求到元数据服务器,否则报错,过程结束;B6元数据服务器收到客户读对象请求后,发送对象ID到相关对象存储节点;B7对象存储节点验证元数据服务器访问请求后,打开对象,发送应答信息到元数据服务器;B8元数据服务器收到应答后,把对客户端的授权、文件与存储对象ID映射表以及存储对象节点位置信息应答给客户端,同时更新零级缓存;B9客户端收到元数据服务器的应答信息后,向所收到元数据对应的对象存储节点发读对象请求命令包,与相应对象存储节点建立连接;B10对象存储节点验证用户请求,确认后发送数据对象给客户端,直到数据传输结束。
从以上数据网络访问控制协议可以看出,零级缓存在命中情况下可以省略一次元数据服务器的访问,极高的零级缓存命中率大大降低了元数据访问的网络开销。
一般设立缓存后会带来缓存一致性问题,因为每个客户端都有零级缓存,必然造成缓存的不一致。如果不解决好缓存一致性问题特别是元数据缓存将给系统带来灾难性后果。本发明简化后的网络访问控制协议很好的解决了元数据缓存不一致性问题。对数据对象的任何操作所引起的元数据变化都必须记录在元数据服务器或者对象存储节点中。对象元数据一致性是由客户端第二次元数据访问B5-B8来保证,因为所有操作的真正元数据都是操作B8从元数据服务器返回的,并没有直接从本地的零级缓存中读取。客户端打开一个对象或做其它元数据相关操作时,至少需要访问一次元数据服务器,用户对对象的任何操作都必须通知元数据服务器,时刻保证对象元数据的正确性;对象存储节点只接收来自元数据服务器的打开请求。以上两条保证了元数据的一致性,因此即使多个零级缓存中元数据存在不一致,也不会带来任何问题。假设某一客户端在零级缓存中持有一个对象的元数据期间,元数据因其它客户端操作而发生了改变,导致了元数据出现不一致情况。第一次元数据访问请求B1-B4的目的只是为了检查目标文件是否存在,第二次元数据访问请求B5-B8并没有从发生不一致的零级缓存中获取元数据,相反,第二次元数据访问B5-B8所获得的元数据还将更新零级缓存,由此避免了零级缓存不一致给系统可能造成的后果。
本发明所述客户端中一级缓存采用共享内存方式实现。一级缓存管理模块中的守护进程负责共享内存空间的申请、分配和回收,但并不负责处理其它进程的读写请求。应用进程将共享内存映射到自己的虚拟内存空间,在需要读写数据时,应用进程就可以直接访问共享内存形式的缓存,从而避免了进程间的大量通信和内存的多次拷贝。守护进程在客户端初启时一次性的向系统申请一块共享内存空间,按照缓存块大小把该空间分成很多物理上连续的小数据块,用一个缓存块数组管理。系统另外维护了一个与缓存块数组同样大小的可分配缓存块数组,指示当前可分配的缓存块数组项。可分配缓存块数组项的值代表可分配的缓存块数组的下标。当可分配缓存块数组项的值为-1时,表示其所代表的块已分配;可分配缓存块数组项的值为s时,表示缓存块s将被分配。系统初始化时,所有缓存块都是空闲的,第i个可分配缓存块数组项的值为i。为了方便管理,采用两个数值——可分配号和空闲号,指示可分配缓存块数组中可供分配的空闲项可分配号指示第一个可供分配数据块,空闲号指示最后一个空闲数据块,也代表块回收时将被插入到可分配缓存块数组中的位置,如果可分配号与空闲号相等,表示已无空闲缓存空间,需要通过置换来腾出空间。
一级缓存管理模块守护进程按如下步骤申请、分配和回收缓存空间(1)向系统申请一块缓存空间,并按照指定缓存块大小将缓存空间分块,用一个缓存块数组表示缓存空间,数组大小为所申请缓存空间的总块数;(2)守护进程维护一个可分配缓存块数组,大小与缓存块数组相同,并用可分配号、空闲号分别指示可分配缓存块数组中空闲项的首部和尾部;(3)当应用进程访问共享缓存空间时,进入步骤(4);当应用进程释放缓存空间时,进入步骤(5);(4)访问共享缓存空间时,如果命中则直接进行读写操作;否则,首先判断是否有空闲缓存块可用,方法是判断可分配号和空闲号是否相等,如果可分配号和空闲号相等,进入步骤(4.1),否则进入步骤(4.2);(4.1)可分配号和空闲号相等表示没有空闲块可用,则对缓存块进行置换,置换后再进行读写操作,工作完毕;
(4.2)可分配号和空闲号不相等表示还有空闲块可用,读取可分配号所指示的可分配缓存块数组项的值,该值就是第一块可供分配缓存空闲块的下标,把下标指示的缓存块分配给应用进程,将可分配号所指示的可分配缓存块数组项的值设为-1,然后可分配号加1并以缓存总块数为模做取余运算,余数即为新的可分配号,它指示下一个空闲块,工作完毕;(5)应用进程释放缓存块时首先空闲号加1并以缓存总块数为模做取余运算得到新的空闲号,把空闲号指示的可分配缓存块数组项的值设为所释放缓存块号,完成缓存块的回收,工作完毕。
如图3.1-3.4是一级缓存分配与释放过程的一个具体实例。图3.1是缓存单元第一次分配前的状态。可分配缓存块数组的各项值与下标相等。可分配号为0,指明第一个可分配的数据块为缓存块数组的第零项;空闲号为n,指明最后一个可分配的数据块为缓存块数组的第n项。缓存块数组的第一块被分配后的状态如图3.2所示第零项可分配缓存块数组的值为-1,可分配号向前推进值变为1,表示下一可分配块为缓存块数组的第一项。图3.3描述了数据块第一次被释放前的状态。在此之前,前4块已被分配;图3.4描述了数据块被释放后的状态在缓存块数组第二块被释放后,按照空闲号的指示,将可分配缓存数组第零项的值修改为2,表示最后一个可分配块为缓存块数组的第二项,同时空闲号循环向前推进,其值为0。
以上是本发明一级缓存空间申请、分配和回收的实现,由守护进程完成,但它不处理具体进程读写请求,读写请求由一级缓存管理模块中实现的基于hash的LFU-DA(LFU with Dynamic Aging)算法完成。
LFU-DA是LFU的改进算法。LFU算法是基于频率访问优先考虑的置换算法,即只考虑到访问了很多次的数据块有很大机会在不久被重新访问,却忽略了这些数据块的最近一次访问时间。事实上,系统经常在处理完一个任务之后,转向处理其它的任务。那些在前一次任务中访问非常频繁的数据块有可能再也没有机会在新的任务中被重新访问,但是这些占据了大量缓存空间的数据块的访问次数却是很大的,采用LFU算法不可能把这些数据块置换出去,极大的降低了缓存空间的利用率。LFU-DA算法对缓存数据块加入了“年龄”属性,并且在访问过程中不断加以调整,但是并不是每次都调整所有块的年龄,而只是在访问的时候动态调整。数据块的“年龄”Ki由数据块的访问次数和上次被置换块的“年龄”共同求得,Ki的计算公式如下Ki=CI*Fi+K(公式1)其中,Fi是数据块被访问的次数,第一次加入到缓存中的数据块访问次数F1的值为1;CI为频率因子,是一个可变参数,通常取值为1,但可根据系统不同应用调整其取值,得到当前应用的最佳值;K是一个全局变量,初始值为0,一有数据块被置换出去时,都把K值调整为被置换块的“年龄”。LFU-DA算法每一次都把“年龄”最小的数据块置换出去。实践表明LFU-DA算法比LRU算法具有更高的命中率。由于LFU-DA同时考虑了“访问时间”和“访问频率”两个方面,用作客户端缓存置换算法能获得很好的性能,明显比只考虑访问时间的算法有更高的命中率。然而当文件系统缓存容量很大时,LFU-DA算法有一个弊端会造成缓存队列过长,导致应用程序在缓存中查找数据耗时间太久。
本发明对LFU-DA算法作进一步的改进,具体的做法是将过长的缓存队列根据所选hash函数分成m个小队列,用缓存数据块的块号和数据块所属对象的ID求hash值,然后根据所求hash值把数据块插入到对应的队列中。每一个hash队列都是LFU-DA队列。这样就可以加快缓存的查找速度。证明方法很简单假设LFU-DA算法的平均查找时间是t,系统缓存队列被分成m个队列,那么改进后算法的平均查找时间约为t/m。
共享内存方式的缓存结构可能出现同一时刻多个进程访问同一缓存块的情况,需要加锁实现进程间的访问互斥。锁粒度大小对缓存性能影响很大,粒度过大会造成太大的一致性和互斥开销,粒度太小则会带来太大的锁管理开销。本发明缓存的锁粒度是队列级的。缓存队列根据hash函数被分成m个小队列,为每个小队列都设立一个读写互斥锁。使用队列级锁粒度策略易于管理,守护进程在文件系统初启时负责预先为每个队列静态申请一个锁,之后所有锁也由守护进程管理和撤消。本实例锁采用信号量实现。
一级缓存管理模块控制流程如下
(1)守护进程申请共享内存空间,维护和管理缓存块数组和可分配缓存块数组;(2)应用进程数据访问请求,判断一级缓存是否命中,命中进入步骤(5);(3)一级缓存未命中,按照零级缓存网络访问协议访问对象存储节点,得到所需数据对象,数据对象访问频率为0,如果判断缓存队列是否为满,满则进入步骤(4),否则将数据对象放入空的缓存单元,进入步骤(5);(4)缓存队列满,则查找所有缓存单元中年龄最小的缓存单元,用数据对象替换年龄最小的缓存单元,使全局变量K等于被替换块年龄;(5)数据块访问频率加1,按照(公式1)计算得到新的年龄,然后求hash值队列号,申请队列级互斥锁,把缓存单元插入新的队列,进行缓存单元读写操作。
二级缓存管理模块负责对象存储节点间二级缓存统一置换,采用多队列统一置换算法——MQU(Multi-Queue United)算法。
大型对象网络存储系统中,一个文件往往被分片成多个对象,分别存储在不同的对象存储节点上,以提高并行带宽。在高性能计算(如矩阵计算)中,经常需要同时取得所有存储节点上的数据对象后才能开始操作,如果某个节点访问延迟较大,就会产生系统单一失效点,降低计算性能。为了解决单一失效点问题,本发明提出了访问组的概念,即具有相同属性分布在不同对象存储节点上的数据对象构成同一个访问组。MQU算法对于属于同一个访问组的数据对象进行统一置换,要么全部保留,要么全部置换,从而保证了较高的系统命中率。
对象存储节点上的二级缓存不像客户端中的一级缓存,访问具有高度的时间和空间局部原理特性,这种特性使得考虑访问时间优先的算法在一级缓存中具有较高的命中率。然而LRU和MRU等基于访问时间考虑的置换算法缺乏对数据块访问频率的考虑;LFU等基于访问频率考虑的置换算法则缺乏对访问时间的考虑,存在缓存污染问题;LFU-DA、MQ等算法虽然综合考虑了访问时间和访问频率,但是没有考虑在分布式环境下多个存储节点间的统一置换,在存在多个存储节点的分布式系统中缓存命中率和缓存读写响应速度不够理想。
本发明MQU算法基于MQ算法设计,在置换时,对位于不同存储节点上的同属于一个访问组的对象给予整体考虑,和传统的数据块单独置换算法相比,MQU算法减小了存储节点二级缓存中出现单个节点缓存缺失的概率,并且各节点的缓存命中率更趋于平均。如何确定不同对象是否属于同一个访问组,本发明利用集合对象属性来实现,属于同一个集合的对象位于同一个访问组。
MQU算法可分成三部分缓存单元的访问、缓存队列的动态调整和置换对象的选取。其中缓存单元的访问是算法的主体,由它调用算法的其它两部分。算法描述如下MQU算法是在MQ算法的基础上设计的。MQU算法以访问组中对象的访问频率作为统一置换的依据,各对象存储节点在统一置换一个访问组时需要获知位于其他存储节点上同一个访问组中对象的访问频率,可以通过在每个对象存储节点维护所有存储节点缓存信息来实现。MQU算法对属于每个存储节点的缓存信息都使用多队列来管理,即分别用q个LRU队列来管理属于每个存储节点的缓存信息,q取值由具体应用决定,范围在4到8之间。根据对象的访问频率来决定把其插入到哪一个LRU队列中。每个存储节点的缓存信息被分成q个部分,每个部分对应一级,从而能够很快地从最低一级缓存队列中找出一个对象进行置换。这样每个存储节点上都要维护p*q个缓存队列,其中p为对象存储节的个数。
MQU算法根据对象在缓存中未被访问的时间来动态调整数据对象的访问频率,为此为每个对象都设置一个生存周期(lifeTime),同时设对象的生存期限(expireTime)为当前时间(currentTime)加上生存周期。如果对象过了生存期限即生存期限小于当前时间,此对象将被调整到低一级队列(允许不被访问的时间较短)中,最低一级队列中的数据对象则有可能被调整出缓存。
MQU算法把对象从缓存中置换出来并非简单的丢弃,而是为属于每个存储节点的q个缓存信息队列都提供了一个FIFO队列来记录被丢弃对象的历史访问频率和缓存单元标记号,一旦丢弃的数据对象被重新访问,即可从中找到它的历史访问频率。对一个访问组实行整体置换时,需要经常查找同一个访问组中其他数据对象的访问频率。为了减少查找时间,MQU算法把同一访问组中所有的数据对象都链接在一起。
二级缓存管理模块控制流程如下(1)申请缓存空间,监听客户端访问请求;(2)对象存储节点与客户端建立连接,客户请求对某个数据对象a进行操作;(3)对象存储节点访问二级缓存,判断二级缓存是否命中,如果命中,把对象a从当前队列移到高一级队列中,处于最高队列则不变,进入步骤(6),否则,二级缓存未命中,进入步骤(4);(4)判断缓存队列是否有空闲块,如果有,进入步骤(6),否则,缓存队列已满,按照步骤(4.1)-(4.5)选取被置换对象(4.1)选取被置换对象,把对象存储节点最低一级非空队列中第一个对象作为被置换对象;(4.2)如果被置换对象不属于任何访问组,直接丢弃,进入步骤(5);否则,获取被置换对象所在的访问组中所有对象的最大访问频率;(4.3)如果访问组中所有对象的最大访问频率小于等于被置换对象的访问频率,则丢弃本访问组的所有对象,进入步骤(4.5);(4.4)否则调整本访问组中所有对象的访问频率为该访问组中所有对象中的最大访问频率,插入相应队列尾部,调整被置换对象为最低一级非空队列的下一个对象,进入步骤(4.2);(4.5)FIFO队列记录下被置换对象的访问频率,返回被置换对象;(5)缓存队列已满且若数据对象a在FIFO队列中,从FIFO队列中获得数据对象a的访问频率,否则数据对象a的访问频率置为初始值0;(6)从存储设备读取对象a,对象a的访问频率加1,计算新的队列号,把对象a插入新队列的尾部,计算对象a的生存期,按照步骤(6.1)-(6.3)动态调整对象存储节点二级缓存队列;(6.1)当前时间加1;
(6.2)在当前对象存储节点中依次选择q个二级缓存队列中的一个队列,选取当前队列的第一个对象。如果为当前队列为最后一级队列,进入步骤(7);(6.3)如果第一个对象的生存期限小于当前时间,把此对象调整到下一级缓存队列尾部,对象的新生存期限为当前时间加生存周期,当前队列级加1,进入步骤(6.2);(7)操作结束。
本发明的分布式多级缓存系统,很好的利用了现有的主存资源,用最小代价取得了很好的性能。如图4所示为本发明提供分布式多级缓存系统后数据访问控制流程图。
权利要求
1.一种适用于对象网络存储的分布式多级缓存系统,其特征在于该系统包括位于客户端中的零级缓存和一级缓存,以及位于对象存储节点中的二级缓存;零级缓存用于来源自元数据服务器中的元数据缓存,一级缓存为直接服务于应用进程的数据缓存,二级缓存为直接服务于客户端的数据缓存;零级缓存管理模块用于负责零级缓存中元数据的查找、替换以及按照网络访问控制协议进行元数据的访问;一级缓存管理模块用于控制一级缓存,负责共享内存空间的申请、分配、回收以及缓存单元的置换;二级缓存管理模块负责对对象存储节点间二级缓存进行统一置换。
2.根据权利要求1所述的系统,其特征在于所述零级缓存管理模块中的网络访问协议为(B1)客户端将要访问文件的路径转化为全局文件系统唯一路径名,应用进程查询零级缓存,判断缓存是否命中,如果命中进入步骤(B4);(B2)客户端与元数据服务器建立连接,发送元数据查询请求;(B3)元数据服务器对客户端访问进行身份验证,如果合法则查询元数据,确认所访问的文件是否存在,发送应答信息到客户端,进入步骤(B5);(B4)应答应用进程;(B5)客户端应用进程收到应答信息后,访问对象存在则发送读对象请求到元数据服务器,否则报错过程结束;(B6)元数据服务器收到客户读对象请求后,发送对象ID到相关对象存储节点;(B7)对象存储节点验证元数据服务器访问请求后,打开对象,发送应答信息到元数据服务器;(B8)元数据服务器收到应答后,把对客户端的授权、文件与存储对象ID映射表以及存储对象节点位置信息应答给客户端,同时更新零级缓存;(B9)客户端收到元数据服务器的应答信息后,向元数据对应的对象存储节点发读对象请求命令包,与相应对象存储节点建立连接;(B10)对象存储节点验证用户请求,确认后发送数据对象给客户端,直到数据传输结束。
3.根据权利要求1或2所述的系统,其特征在于所述一级缓存管理模块的守护进程按照下述步骤申请、分配和回收一级缓存空间(C1)向系统申请一块缓存空间,并按照指定缓存块大小将缓存空间分块,用一个缓存块数组表示缓存空间,数组大小为所申请缓存空间的总块数;(C2)维护一个可分配缓存块数组,大小与缓存块数组相同,并用可分配号、空闲号分别指示可分配缓存块数组中空闲项的首部和尾部;(C3)当应用进程访问共享缓存空间时,进入步骤(C4);当应用进程释放缓存空间时,进入步骤(C5);(C4)访问共享缓存空间时,如果命中则直接进行读写操作;否则,首先判断是否有空闲缓存块可用,方法是判断可分配号和空闲号是否相等,如果可分配号和空闲号相等,进入步骤(C41),否则进入步骤(C42);(C41)可分配号和空闲号相等表示没有空闲块可用,则对缓存块进行置换,置换后再进行读写操作,工作完毕;(C42)可分配号和空闲号不相等表示还有空闲块可利用,读取可分配号所指示的可分配缓存块数组项的值,该值就是第一块可供分配缓存空闲块的下标,把下标指示的缓存块分配给应用进程,将可分配号所指示的可分配缓存块数组项的值设为-1,然后可分配号加1并取总缓存块数的模,新的可分配号指示下一个空闲块,工作完毕;(C5)应用进程不再使用缓存块时需要释放申请的缓存块,首先空闲号加1取总缓存块数的模得到新的空闲号,把空闲号指示的可分配缓存块数组项的值设为所释放缓存块号,完成缓存块的回收,工作完毕。
4.根据权利要求3所述的系统,其特征在于所述一级缓存管理模块按照下述步骤对缓存单元进行置换(D1)申请共享内存空间,维护和管理缓存块数组和可分配缓存块数组;(D2)应用进程数据访问请求,判断一级缓存是否命中,命中进入步骤(D5);(D3)一级缓存不命中,按照零级缓存网络访问协议访问对象存储节点,得到所需数据对象,数据对象访问频率为0,如果判断缓存队列是否为满,满则进入步骤(D4),否则将数据对象放入空的缓存单元,转入步骤(D5);(D4)查找所有缓存单元中年龄最小的缓存单元,用数据对象替换年龄最小的缓存单元,使全局变量K等于被替换块年龄;(D5)数据块访问频率加1,按照公式(1)计算得到新的年龄Ki,然后求hash值队列号,申请队列级互斥锁,把缓存单元插入新的队列,进行缓存单元读写操作;Ki=CI*Fi+K 公式(1)其中,Fi是数据块被访问的次数,第一次加入到缓存中的数据块访问次数F1的值为1;CI为频率因子;K值在有数据块被置换出去时调整为被置换块的“年龄”。
5.根据权利要求4所述的系统,其特征在于所述二级缓存管理模块按照下述步骤对对象存储节点间二级缓存进行统一置换(E1)申请缓存空间,监听客户端访问请求;(E2)对象存储节点与客户端建立连接,客户请求对某个数据对象a进行操作;(E3)对象存储节点访问二级缓存,判断二级缓存是否命中,如果命中,把上述对象a从当前队列移到高一级队列中,处于最高队列则不变,进入步骤(E6),否则,二级缓存不命中,进入步骤(E4);(E4)判断缓存队列是否有空闲块,如果有,进入步骤(E6),否则,缓存队列已满,按照步骤(E41)-(E45)选取被置换对象(E41)选取被置换对象,把对象存储节点最低一级非空队列中第一个对象作为被置换对象;(E42)如果被置换对象不属于任何访问组,直接丢弃,进入步骤(E5);否则获取被置换对象所在的访问组中所有对象的最大访问频率;(E43)如果访问组中所有对象的最大访问频率小于等于被置换对象的访问频率,则丢弃本访问组的所有对象,进入步骤(E45);(E44)调整本访问组中所有对象的访问频率为该访问组中所有对象中的最大访问频率,插入相应队列尾部,调整被置换对象为最低一级非空队列的下一个对象,转入步骤(E42);(E45)FIFO队列记录下被置换对象的访问频率,返回被置换对象;(E5)缓存队列已满且如果数据对象a在FIFO队列中,从FIFO队列中获得数据对象a的访问频率,否则数据对象a的访问频率为初始值0,(E6)从存储设备读取对象a,对象a的访问频率加1,计算新的队列号,把对象a插入新队列的尾部,计算对象a的生存期,按照步骤(E61)-(E63)动态调整对象存储节点二级缓存队列;(E61)当前时间加1;(E62)在当前对象存储节点中依次选择q个二级缓存队列中的一个队列,其中,q为属于各个存储节点的缓存信息的队列数,q取值在4到8之间;选取当前队列的第一个对象,如果为当前队列为最后一级队列,进入步骤(E7);(E63)如果第一个对象的生存期限小于当前时间,把此对象调整到下一级缓存队列尾部,对象的新生存期限为当前时间加生存周期,当前队列级加1,进入步骤(E62);(E7)操作结束。
全文摘要
本发明公开了一种适用于对象网络存储的分布式多级缓存系统。包括用于元数据缓存的零级缓存、用于客户端数据缓存的一级缓存和用于对象存储节点数据缓存的二级缓存。零级缓存管理模块负责零级缓存中元数据的查找、替换和按照网络访问控制协议进行元数据访问;一级缓存管理模块负责共享内存空间的申请、分配、回收以及缓存单元的置换;二级缓存管理模块负责对对象存储节点间二级缓存进行多队列统一置换。本发明解决了客户端元数据缓存一致性问题,加快了元数据的访问速度,降低了服务请求响应时间;提高了整个文件系统的I/O吞吐量,降低了缓存对象的平均查找时间;提高了存储节点缓存整体命中率,提高了系统数据传输率。
文档编号G06F12/08GK1852318SQ20061001883
公开日2006年10月25日 申请日期2006年4月19日 优先权日2006年4月19日
发明者陈进才, 周功业, 吴伟杰, 易佳, 雷伟, 李漪 申请人:华中科技大学