一种双控存储服务器的缓存管理方法

文档序号:6552070阅读:341来源:国知局
一种双控存储服务器的缓存管理方法【专利摘要】本发明公开了一种双控存储服务器的缓存管理方法,属于一种缓存管理方法,在ISCSI网络存储服务器架构中,对双控存储服务器进行缓存管理,从linux系统管理的内存中划分出一块连续空间作为独立缓存模块,将独立缓存模块均匀划分为多个缓存块,将物理磁盘均匀划分为多个磁盘逻辑块,一个缓存块可以映射任意一个磁盘逻辑块的数据,将缓存块标记状态,使用双向循环链表分别管理空闲缓存块和使用缓存块。本发明的一种双控存储服务器的缓存管理方法和现有技术相比,提高存储服务器的可靠性,解决因为存储控制器单点故障导致的数据丢失和服务中断的问题。【专利说明】[0001]-种双控存储服务器的缓存管理方法【
技术领域
】[0002]本发明涉及一种缓存管理方法,具体地说是一种双控存储服务器的缓存管理方法。【
背景技术
】[0003]存储服务器典型的应用是作为网络存储设备或者文件服务器,为应用主机提供数据,保存文件。主流的网络存储服务器架构一般由应用主机、网络交换机、存储控制器、磁盘阵列等部分组成。主机通过IP网络或者交换机连接到存储控制器,存储控制器操作磁盘阵列,响应主机下发的数据请求。主机和存储控制器之间有多种通信方式。[0004]网络存储服务器架构中,iSCSI网络存储服务器是基于千兆或万兆TCP-IP网络,米用iSCSI作为网络通信协议。iSCSI(InternetSmallComputerSystemInterface网络小型计算机系统接口)协议本质上是基于TCP/IP网络交换SCSI指令和数据,它可以在已有的交换机和IP网络上运行,不需要专门的线缆和网络。用IP协议将存储设备连接在一起,iSCSI网络存储服务器使得计算机可以透过高速的局域网来把远程存储设备模拟成为本地的储存装置,就像操作本地文件系统一样操作网络存储设备。[0005]典型的ISCSI网络存储服务器由主机、IP网络、存储控制器、磁盘阵列等部分组成,各个部分的主要功能如下:1、主机:在iSCSI存储中,主机也被成为Initiator,可能是网络服务器,数据库服务器或者文件服务器。主机通过Initiator软件发现iSCSI存储设备,将远程存储设备虚拟为本地文件系统。[0006]2、IP网络:存储系统使用TCP/IP网络交换iSCSI指令和数据,数据以10块为单位实现主机端和存储设备之间的数据传输。目前主流的IP网络是使用千兆或者万兆以太网,可以满足存储系统对传输速率的要求。[0007]3、存储控制器:磁盘阵列控制器,也被成为Target端,控制磁盘阵列,对外提供网络传输接口。存储控制器本质上是一台运行LINUX系统的计算机,缓存即存在于存储控制器的内存中,采用专用的数据处理芯片,具有RAID和SAS磁盘接口。存储控制器上运行专门的iSCSI存储控制软件,实现iSCSI指令的解析,读写磁盘数据。本项目使用iSCSIEnterpriseTarget作为控制器软件,增加缓存模块,并且实现缓存同步。[0008]4、磁盘阵列:磁盘阵列一般使用SAS物理磁盘,数据采用RAID方式存放,实现物理磁盘数据冗余,防止单个物理磁盘损坏造成数据丢失。磁盘阵列与控制器之间使用SAS卡或者SCSI卡连接。[0009]存储控制器软件属于存储服务器系统的核心部件。现有的开源ISCSI控制器软件IET(ISCSIEnterpriseTarget)并没有独立的缓存部件,IET采用两种10模式:file10和block10。FilelO直接将接收到的数据提交到LinuxVFS虚拟文件系统,虽然VFS拥有pagecache缓存,但是这样增长了10路径。BlocklO直接将接收到的数提交通用块设备层,没有缓存空间。IET是针对单控制器的,没有双控制器所需要的同步缓存功能,需要在增加独立缓存模块的基础上设计同步缓存。双控制器需要实现两个控制器端软件的通信,故障检测,需要设计一整套心跳协议。总结来说,IET本身没有实现缓存机制,IET是面向单控制器的,没有考虑双控制器面临的缓存同步和心跳问题。[0010]双控存储服务器在缓存方面存在一些问题:速度较慢、容易丢失数据、可靠性差。【
发明内容】[0011]本发明的技术任务是提供一种提高存储服务器的可靠性,解决因为存储控制器单点故障导致的数据丢失和服务中断的一种双控存储服务器的缓存管理方法。[0012]本发明的技术任务是按以下方式实现的,一种双控存储服务器的缓存管理方法,在ISCSI网络存储服务器架构中,对双控存储服务器进行缓存管理,包括如下步骤:(1)、双控存储服务器1inux系统启动时从1inux系统管理的内存中划分出一块连续空间作为独立缓存模块,该独立缓存模块自主管理;(2)、将独立缓存模块均匀划分为多个缓存块,将双控存储服务器的物理磁盘以同等数量的磁盘扇区为单位均匀划分为多个磁盘逻辑块,每个磁盘逻辑块所含磁盘扇区的数量对应磁盘逻辑块最大的数据容量,每个磁盘逻辑块最大的数据容量与每个缓存块最大可缓存的数据容量一致;(3)、一个缓存块可以映射任意一个磁盘逻辑块的数据;(4)、基于缓存块与对应映射的磁盘逻辑块之间的数据状态关系,把缓存块标记为如下状态:空闲状态、干净状态、脏块状态、无效状态;空闲状态为该缓存块没有映射到任何磁盘逻辑块,可以被分配存放数据;干净状态为该缓存块已经映射到某个磁盘逻辑块,缓存块中的数据和磁盘逻辑块中的数据是一致的;脏块状态为该缓存块中的数据比相映射的磁盘逻辑块中的数据要新;无效状态为该缓存块不可用;(5)、每一个缓存块(bufferblock)都有--对应的数据结构体(structbuffer_page),数据结构体保存该缓存块的相关信息,通过数据结构体来对该缓存块进行操作;(6)、将所有非无效状态的缓存块分为两种:空闲缓存块与使用缓存块,空闲状态的缓存块为空闲缓存块,干净状态与脏块状态的缓存块为使用缓存块;使用双向循环链表分别管理空闲缓存块和使用缓存块,双向循环链表内保存的是指向对应缓存块的数据结构体的指针;双向循环链表包括空闲链表、LRU链表、写回链表,空闲链表保存的指针为指向空闲缓存块的数据结构体的指针,LRU链表保存的指针为指向使用缓存块的数据结构体的指针,写回链表保存的指针为指向需要写回磁盘的脏块状态的缓存块的数据结构体的指针;(7)、双控存储服务器linux系统中,当需要申请新的缓存块时,从空闲链表头部获得;(8)、双控存储服务器linux系统中,若访问的缓存块的数据结构体的指针在LRU链表中,表示该缓存块为使用缓存块;(9)、双控存储服务器linux系统中,缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内。一个指向脏块状态的缓存块的数据结构体的指针同时位于LRU链表和写回链表中。[0013]步骤(1)中的独立缓存模块分为两部分,一部分作为保存磁盘阵列缓存数据空间,另一部分作为保存与缓存组织和管理相关的数据结构空间。[0014]步骤(2)中,缓存块大小为4KB,等于一个内存页(page)大小,缓存块是缓存访问的基本单位;每个缓存块最大容纳8个磁盘扇区的数据,将物理磁盘以8个磁盘扇区为单位划分为若干磁盘逻辑块,一个缓存块可以映射任意一个磁盘逻辑块。[0015]步骤(5)中,数据结构体内保存的缓存块信息包括:缓存块是否空闲信息、缓存块对应的磁盘逻辑块信息、缓存块是否脏数据信息、缓存块引用状态信息、扇区有效信息。[0016]双控存储服务器使用双控制器软件,双控制器软件在基于ISCSI控制器软件上增加独立缓存模块软件、缓存同步模块软件和心跳检测模块软件;通过双控制器软件的独立缓存模块软件实现独立缓存模块的划分及管理,通过双控制器软件的缓存同步模块软件实现缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内;通过双控制器软件的心跳检测模块软件来实时监测双控存储服务器工作是否正常,如果心跳超时,则进行故障切换。实现了双控存储服务器持续性。[0017]使用哈希表(英文为HashTable,也称散列表)来管理使用缓存块;哈希表的表项是一个队列,队列中存放的是具有相同哈希值的缓存块的数据结构体,称为hash链;同一条hash链中的不同缓存块的数据结构体通过不同的LBA值来准确区分;查找某个缓存块的数据结构体,首先根据计算得到的哈希值找到对应的哈希表的表项,从而获得hash链队列的头,然后遍历该hash链队列准确匹配LBA值确定目标是否存在。在哈希表足够大的情况,且哈希函数设计合理,每个哈希表表项所指向的hash链不会很长,所以哈希表匹配速度可以满足要求。[0018]缓存块的数据结构体的哈希值通过磁盘逻辑块号、块设备编号和HashTable大小计算获得,计算哈希值使用的哈希函数如下:哈希值=(bdev~blknr)%HashTable_SIZE;其中,HashTable_SIZE为哈希表大小,bdev为操作的块设备编号,blknr为缓存块对应的磁盘逻辑块号。[0019]采用HashTable方式来管理缓存,快速高效,能够在0(1)时间返回查询结果,实现简单,同时具有良好的可移植性。缺点是HashTable太小的话发生冲突的概率会增大,为了降低冲突概率,HashTable通常比较大,会占用较大的空间。[0020]本发明的一种双控存储服务器的缓存管理方法具有以下优点:1、独立缓存模块可以减少存储控制器对物理磁盘的访问,大大降低响应时间,提升控制器的性能;2、为双控存储服务器工作模式提供缓存同步机制,使得缓存中的脏数据在镜像控制器中存在备份,即使控制器挂掉,也不会丢失数据;3、实现故障检测和切换,通过心跳协议来实时监测控制器工作是否正常,如果心跳超时,则进行故障切换,实现了服务器持续性;4、填补国内在双控存储服务器方面的空白,满足市场对中端双控存储服务器的需求。【专利附图】【附图说明】[0021]下面结合附图对本发明进一步说明。[0022]附图1为一种双控存储服务器的缓存管理方法的独立缓存模块组织示意框图;附图2为一种双控存储服务器的缓存管理方法的缓存块与磁盘逻辑块的映射关系示意框图;附图3为一种双控存储服务器的缓存管理方法的双向循环链表示意框图;附图4为一种双控存储服务器的缓存管理方法的缓存HashTable和双向循环链表示意框图。【具体实施方式】[0023]参照说明书附图和具体实施例对本发明的一种双控存储服务器的缓存管理方法作以下详细地说明。[0024]实施例1:本发明的一种双控存储服务器的缓存管理方法,在ISCSI网络存储服务器架构中,对双控存储服务器进行缓存管理,包括如下步骤:(1)、双控存储服务器1inux系统启动时从1inux系统管理的内存中划分出一块连续空间作为独立缓存模块,该独立缓存模块自主管理;(2)、将独立缓存模块均匀划分为多个缓存块,将双控存储服务器的物理磁盘以同等数量的磁盘扇区为单位均匀划分为多个磁盘逻辑块,每个磁盘逻辑块所含磁盘扇区的数量对应磁盘逻辑块最大的数据容量,每个磁盘逻辑块最大的数据容量与每个缓存块最大可缓存的数据容量一致;(3)、一个缓存块可以映射任意一个磁盘逻辑块的数据;(4)、基于缓存块与对应映射的磁盘逻辑块之间的数据状态关系,把缓存块标记为如下状态:空闲状态、干净状态、脏块状态、无效状态;空闲状态为该缓存块没有映射到任何磁盘逻辑块,可以被分配存放数据;干净状态为该缓存块已经映射到某个磁盘逻辑块,缓存块中的数据和磁盘逻辑块中的数据是一致的;脏块状态为该缓存块中的数据比相映射的磁盘逻辑块中的数据要新;无效状态为该缓存块不可用;(5)、每一个缓存块(bufferblock)都有--对应的数据结构体(structbuffer_page),数据结构体保存该缓存块的相关信息,通过数据结构体来对该缓存块进行操作;(6)、将所有非无效状态的缓存块分为两种:空闲缓存块与使用缓存块,空闲状态的缓存块为空闲缓存块,干净状态与脏块状态的缓存块为使用缓存块;使用双向循环链表分别管理空闲缓存块和使用缓存块,双向循环链表内保存的是指向对应缓存块的数据结构体的指针;双向循环链表包括空闲链表、LRU链表、写回链表,空闲链表保存的指针为指向空闲缓存块的数据结构体的指针,LRU链表保存的指针为指向使用缓存块的数据结构体的指针,写回链表保存的指针为指向需要写回磁盘的脏块状态的缓存块的数据结构体的指针;(7)、双控存储服务器linux系统中,当需要申请新的缓存块时,从空闲链表头部获得;(8)、双控存储服务器linux系统中,若访问的缓存块的数据结构体的指针在LRU链表中,表示该缓存块为使用缓存块;(9)、双控存储服务器linux系统中,缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内。一个指向脏块状态的缓存块的数据结构体的指针同时位于LRU链表和写回链表中。[0025]基于上述的一种双控存储服务器的缓存管理方法,可以实现在双控存储服务器中,缓存可靠性强,使得系统处理速度快,且保证了数据的安全不丢失。[0026]实施例2:本发明的一种双控存储服务器的缓存管理方法,在ISCSI网络存储服务器架构中,对双控存储服务器进行缓存管理,包括如下步骤:(1)、双控存储服务器1inux系统启动时从1inux系统管理的内存中划分出一块连续空间作为独立缓存模块,该独立缓存模块自主管理;(2)、将独立缓存模块均匀划分为多个缓存块,将双控存储服务器的物理磁盘以同等数量的磁盘扇区为单位均匀划分为多个磁盘逻辑块,每个磁盘逻辑块所含磁盘扇区的数量对应磁盘逻辑块最大的数据容量,每个磁盘逻辑块最大的数据容量与每个缓存块最大可缓存的数据容量一致;(3)、一个缓存块可以映射任意一个磁盘逻辑块的数据;(4)、基于缓存块与对应映射的磁盘逻辑块之间的数据状态关系,把缓存块标记为如下状态:空闲状态、干净状态、脏块状态、无效状态;空闲状态为该缓存块没有映射到任何磁盘逻辑块,可以被分配存放数据;干净状态为该缓存块已经映射到某个磁盘逻辑块,缓存块中的数据和磁盘逻辑块中的数据是一致的;脏块状态为该缓存块中的数据比相映射的磁盘逻辑块中的数据要新;无效状态为该缓存块不可用;(5)、每一个缓存块(bufferblock)都有--对应的数据结构体(structbuffer_page),数据结构体保存该缓存块的相关信息,通过数据结构体来对该缓存块进行操作;(6)、将所有非无效状态的缓存块分为两种:空闲缓存块与使用缓存块,空闲状态的缓存块为空闲缓存块,干净状态与脏块状态的缓存块为使用缓存块;使用双向循环链表分别管理空闲缓存块和使用缓存块,双向循环链表内保存的是指向对应缓存块的数据结构体的指针;双向循环链表包括空闲链表、LRU链表、写回链表,空闲链表保存的指针为指向空闲缓存块的数据结构体的指针,LRU链表保存的指针为指向使用缓存块的数据结构体的指针,写回链表保存的指针为指向需要写回磁盘的脏块状态的缓存块的数据结构体的指针;(7)、双控存储服务器linux系统中,当需要申请新的缓存块时,从空闲链表头部获得;(8)、双控存储服务器linux系统中,若访问的缓存块的数据结构体的指针在LRU链表中,表示该缓存块为使用缓存块;(9)、双控存储服务器linux系统中,缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内。一个指向脏块状态的缓存块的数据结构体的指针同时位于LRU链表和写回链表中。[0027]步骤(1)中的独立缓存模块分为两部分,一部分作为保存磁盘阵列缓存数据空间,另一部分作为保存与缓存组织和管理相关的数据结构空间。[0028]步骤(2)中,缓存块大小为4KB,等于一个内存页(page)大小,缓存块是缓存访问的基本单位;每个缓存块最大容纳8个磁盘扇区的数据,将物理磁盘以8个磁盘扇区为单位划分为若干磁盘逻辑块,一个缓存块可以映射任意一个磁盘逻辑块。[0029]步骤(5)中,数据结构体内保存的缓存块信息包括:缓存块是否空闲信息、缓存块对应的磁盘逻辑块信息、缓存块是否脏数据信息、缓存块引用状态信息、扇区有效信息。[0030]双控存储服务器使用双控制器软件,双控制器软件在基于ISCSI控制器软件上增加独立缓存模块软件、缓存同步模块软件和心跳检测模块软件;通过双控制器软件的独立缓存模块软件实现独立缓存模块的划分及管理,通过双控制器软件的缓存同步模块软件实现缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内;通过双控制器软件的心跳检测模块软件来实时监测双控存储服务器工作是否正常,如果心跳超时,则进行故障切换。实现了双控存储服务器持续性。[0031]实施例3:本发明的一种双控存储服务器的缓存管理方法,在ISCSI网络存储服务器架构中,对双控存储服务器进行缓存管理,包括如下步骤:(1)、双控存储服务器1inux系统启动时从1inux系统管理的内存中划分出一块连续空间作为独立缓存模块,该独立缓存模块自主管理;(2)、将独立缓存模块均匀划分为多个缓存块,将双控存储服务器的物理磁盘以同等数量的磁盘扇区为单位均匀划分为多个磁盘逻辑块,每个磁盘逻辑块所含磁盘扇区的数量对应磁盘逻辑块最大的数据容量,每个磁盘逻辑块最大的数据容量与每个缓存块最大可缓存的数据容量一致;(3)、一个缓存块可以映射任意一个磁盘逻辑块的数据;(4)、基于缓存块与对应映射的磁盘逻辑块之间的数据状态关系,把缓存块标记为如下状态:空闲状态、干净状态、脏块状态、无效状态;空闲状态为该缓存块没有映射到任何磁盘逻辑块,可以被分配存放数据;干净状态为该缓存块已经映射到某个磁盘逻辑块,缓存块中的数据和磁盘逻辑块中的数据是一致的;脏块状态为该缓存块中的数据比相映射的磁盘逻辑块中的数据要新;无效状态为该缓存块不可用;(5)、每一个缓存块(bufferblock)都有--对应的数据结构体(structbuffer_page),数据结构体保存该缓存块的相关信息,通过数据结构体来对该缓存块进行操作;(6)、将所有非无效状态的缓存块分为两种:空闲缓存块与使用缓存块,空闲状态的缓存块为空闲缓存块,干净状态与脏块状态的缓存块为使用缓存块;使用双向循环链表分别管理空闲缓存块和使用缓存块,双向循环链表内保存的是指向对应缓存块的数据结构体的指针;双向循环链表包括空闲链表、LRU链表、写回链表,空闲链表保存的指针为指向空闲缓存块的数据结构体的指针,LRU链表保存的指针为指向使用缓存块的数据结构体的指针,写回链表保存的指针为指向需要写回磁盘的脏块状态的缓存块的数据结构体的指针;(7)、双控存储服务器linux系统中,当需要申请新的缓存块时,从空闲链表头部获得;(8)、双控存储服务器linux系统中,若访问的缓存块的数据结构体的指针在LRU链表中,表示该缓存块为使用缓存块;(9)、双控存储服务器linux系统中,缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内。一个指向脏块状态的缓存块的数据结构体的指针同时位于LRU链表和写回链表中。[0032]步骤(1)中的独立缓存模块分为两部分,一部分作为保存磁盘阵列缓存数据空间,另一部分作为保存与缓存组织和管理相关的数据结构空间。[0033]步骤(2)中,缓存块大小为4KB,等于一个内存页(page)大小,缓存块是缓存访问的基本单位;每个缓存块最大容纳8个磁盘扇区的数据,将物理磁盘以8个磁盘扇区为单位划分为若干磁盘逻辑块,一个缓存块可以映射任意一个磁盘逻辑块。[0034]步骤(5)中,数据结构体内保存的缓存块信息包括:缓存块是否空闲信息、缓存块对应的磁盘逻辑块信息、缓存块是否脏数据信息、缓存块引用状态信息、扇区有效信息。[0035]双控存储服务器使用双控制器软件,双控制器软件在基于ISCSI控制器软件上增加独立缓存模块软件、缓存同步模块软件和心跳检测模块软件;通过双控制器软件的独立缓存模块软件实现独立缓存模块的划分及管理,通过双控制器软件的缓存同步模块软件实现缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内;通过双控制器软件的心跳检测模块软件来实时监测双控存储服务器工作是否正常,如果心跳超时,则进行故障切换。实现了双控存储服务器持续性。[0036]使用哈希表(英文为HashTable,也称散列表)来管理使用缓存块;哈希表的表项是一个队列,队列中存放的是具有相同哈希值的缓存块的数据结构体,称为hash链;同一条hash链中的不同缓存块的数据结构体通过不同的LBA值来准确区分;查找某个缓存块的数据结构体,首先根据计算得到的哈希值找到对应的哈希表的表项,从而获得hash链队列的头,然后遍历该hash链队列准确匹配LBA值确定目标是否存在。在哈希表足够大的情况,且哈希函数设计合理,每个哈希表表项所指向的hash链不会很长,所以哈希表匹配速度可以满足要求。[0037]缓存块的数据结构体的哈希值通过磁盘逻辑块号、块设备编号和HashTable大小计算获得,计算哈希值使用的哈希函数如下:哈希值=(bdev~blknr)%HashTable_SIZE;其中,HashTable_SIZE为哈希表大小,bdev为操作的块设备编号,blknr为缓存块对应的磁盘逻辑块号。[0038]采用HashTable方式来管理缓存,快速高效,能够在0(1)时间返回查询结果,实现简单,同时具有良好的可移植性。缺点是HashTable太小的话发生冲突的概率会增大,为了降低冲突概率,HashTable通常比较大,会占用较大的空间。[0039]哈希表(Hashtable,也叫散列表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表Μ为哈希(Hash)表,函数f(key)为哈希(Hash)函数。[0040]实施例4:独立缓存模块保存的物理磁盘数据是经过块I/O传递的,独立缓存模块的组织和空间划分必须满足Linux块I/O的流程要求。Linux下块设备访问的最基本单位是磁盘扇区,一般情况下磁盘扇区大小为512字节,linux-次块I/O的大小通常为扇区的整数倍。项目中为了便于管理块1/0,将缓存空间划分为缓存块(bufferblock),缓存块大小为4KB,等于一个内存页(page)大小。Bufferblock是缓存访问的基本单位,每个缓存块容纳8个磁盘扇区,同时将物理磁盘以8个扇区为单位划分为磁盘逻辑块,一个缓存块可以映射任意一个磁盘逻辑块。如图2所示。[0041]本发明遵循模块化设计原则,为了降低模块耦合度,提供清晰的功能模块接口,将整个系统中提供通用功能的代码进行封装,对其他代码开放合理的API。通用模块主要提供链表的管理,哈希表的基本操作,调试信息等;这些模块作为实现缓存管理,查找替换的基础功能,可以独立出来,使得系统代码结构更加合理。[0042]structbuffer_page数据结构体:缓存中每一个缓存块都有一个对应的数据结构体structbuffer_page,保存该缓存块的所有相关信息,比如状态,磁盘逻辑块映射,链表等。缓存块数据结构体与对应4KB缓存块的关系与Linux内核中structpage和内存页框的关系非常类似。Linux内核中通过page结果来对内存页框进行操作,类似的,本项目中通过structbuffer_page数据结构体来对缓存中的缓存块进行操作。structbuffer_page与缓存块是--对应的关系。其中valid_bits和dirty_bits分别代表有效位图和脏位图,因为一个缓存块中包含8个磁盘扇区,每个扇区的状态可能不相同,所以需要对单个扇区的状态做标记。aLBA和b_dev代表当前缓存块中所映射的磁盘逻辑块起始扇区号,和所在的块设备。aLBA和b_dev可以唯一标识一个缓存块,项目中同时采用aLBA和b_dev的值来计算hash值。page指向该缓存块所在的内存页对应的structpage结构,通过page可以得到缓存块的内存地址。Flist,lrulist和wblist分别用于将缓存块加入空闲链表,LRU链表和写回链表中;同样,structhlist_110(161^811用于把节点加入!^81^31316中。8口;[111001^_1:自旋锁结构用于多线程环境下解决线程访问同一个缓存块或者操作同一个链表时的同步问题。整个structbuffer_page结构大小为64字节对齐,可以优化CPU高速缓存(cache)的访问,提高对structbuffer_page结构的存取速度。[0043]structtio:ISCSItarget软件从网络接收到ISCSI指令和数据之后,经过指令解析和执行模块的处理之后,如果是对磁盘数据的读写请求,会进一步封装成tio结构。Tio结构定义了对一段连续磁盘数据的读写请求,其中offset表示请求的数据在目标块设备的偏移量,以字节为单位;size指示本次所请求数据的总字节数。Pg_cnt指示读或写数据所占的内存页框的数量,pvec指向structpage数组,数组中的page指向实际保存数据的内存页。Target指令解析模块根据得到的指令,将tio结构传递给读缓存或者写缓存功能函数。缓存模块依照tio中的offset和size两项,就可以获得目标磁盘逻辑块,通过pvec获得写入数据或者读出的目的内存。[0044]structbio:ISCSItarget软件缓存模块采用blockio方式与直接与通用块10层交互进行数据传输,块10过程中最重要的数据就是bio。Bio结构代表一次块1/0操作所涉及到的所有内存页和目标块设备信息,是Linux内核中非常重要的数据结果。项目中缓存模块通过构造bio,调用submit_to_bio函数实现磁盘数据存取。[0045]bi_sector表示此次bio请求的数据相对于磁盘分区的扇区号,bi_bdev是目标块设备,bi_rw表示数据传输的方向,是读还是写。bi_end_io是中断回调函数指针,磁盘完成10请求操作后,会触发一个中断,中断会执行bi_end_io指向的函数,进行10操作结束后的处理工作。bi_io_vec指向一段连续的数据空间,通常由几个存放连续数据的structpage组成。[0046]由于项目在内核层进行实现,所以无法使用标准C语言库来实各个功能,缓存链表是基于Linux提供的list,h实现的。声明缓存链表。缓存模块中存在3个双向循环链表:空闲链表,LRU链表,写回链表。[0047]从空闲链表中获取缓存块。首先检查空闲链表是否为空,如果为空,则说明缓存已满没有可供分配的空闲块,函数返回NULL,缓存会进行替换处理。如果链表不为空,则从空闲链表头部删除一个节点,返回该节点对应的structbuffer_page结构体指针。[0048]缓存块插入LRU使用队列。从空闲链表获得缓存块后,填充缓存块,初始化结构体,要将该缓存块插入LRU使用链表。[〇〇49]上述【具体实施方式】仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述【具体实施方式】,任何符合本发明的一种双控存储服务器的缓存管理方法的权利要求书的且任何所属【
技术领域
】的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。【权利要求】1.一种双控存储服务器的缓存管理方法,其特征在于在ISCSI网络存储服务器架构中,对双控存储服务器进行缓存管理,包括如下步骤:(1)、双控存储服务器1inux系统启动时从1inux系统管理的内存中划分出一块连续空间作为独立缓存模块,该独立缓存模块自主管理;(2)、将独立缓存模块均匀划分为多个缓存块,将双控存储服务器的物理磁盘以同等数量的磁盘扇区为单位均匀划分为多个磁盘逻辑块,每个磁盘逻辑块所含磁盘扇区的数量对应磁盘逻辑块最大的数据容量,每个磁盘逻辑块最大的数据容量与每个缓存块最大可缓存的数据容量一致;(3)、一个缓存块可以映射任意一个磁盘逻辑块的数据;(4)、基于缓存块与对应映射的磁盘逻辑块之间的数据状态关系,把缓存块标记为如下状态:空闲状态、干净状态、脏块状态、无效状态;空闲状态为该缓存块没有映射到任何磁盘逻辑块,可以被分配存放数据;干净状态为该缓存块已经映射到某个磁盘逻辑块,缓存块中的数据和磁盘逻辑块中的数据是一致的;脏块状态为该缓存块中的数据比相映射的磁盘逻辑块中的数据要新;无效状态为该缓存块不可用;(5)、每一个缓存块都有一一对应的数据结构体,数据结构体保存该缓存块的相关信息,通过数据结构体来对该缓存块进行操作;(6)、将所有非无效状态的缓存块分为两种:空闲缓存块与使用缓存块,空闲状态的缓存块为空闲缓存块,干净状态与脏块状态的缓存块为使用缓存块;使用双向循环链表分别管理空闲缓存块和使用缓存块,双向循环链表内保存的是指向对应缓存块的数据结构体的指针;双向循环链表包括空闲链表、LRU链表、写回链表,空闲链表保存的指针为指向空闲缓存块的数据结构体的指针,LRU链表保存的指针为指向使用缓存块的数据结构体的指针,写回链表保存的指针为指向需要写回磁盘的脏块状态的缓存块的数据结构体的指针;(7)、双控存储服务器linux系统中,当需要申请新的缓存块时,从空闲链表头部获得;(8)、双控存储服务器linux系统中,若访问的缓存块的数据结构体的指针在LRU链表中,表示该缓存块为使用缓存块;(9)、双控存储服务器linux系统中,缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内。2.根据权利要求1所述的一种双控存储服务器的缓存管理方法,其特征在于步骤(1)中的独立缓存模块分为两部分,一部分作为保存磁盘阵列缓存数据空间,另一部分作为保存与缓存组织和管理相关的数据结构空间。3.根据权利要求1所述的一种双控存储服务器的缓存管理方法,其特征在于步骤(2)中,缓存块大小为4KB,等于一个内存页大小,缓存块是缓存访问的基本单位;每个缓存块最大容纳8个磁盘扇区的数据,将物理磁盘以8个磁盘扇区为单位划分为若干磁盘逻辑块,一个缓存块可以映射任意一个磁盘逻辑块。4.根据权利要求1所述的一种双控存储服务器的缓存管理方法,其特征在于步骤(5)中,数据结构体内保存的缓存块信息包括:缓存块是否空闲信息、缓存块对应的磁盘逻辑块息、缓存块是否脏数据息、缓存块引用状态息、扇区有效息。5.根据权利要求1所述的一种双控存储服务器的缓存管理方法,其特征在于双控存储服务器使用双控制器软件,双控制器软件在基于ISCSI控制器软件上增加独立缓存模块软件、缓存同步模块软件和心跳检测模块软件;通过双控制器软件的独立缓存模块软件实现独立缓存模块的划分及管理,通过双控制器软件的缓存同步模块软件实现缓存同步模块访问写回链表,将脏块状态的缓存块内的数据同步刷新到相对应的磁盘逻辑块内;通过双控制器软件的心跳检测模块软件来实时监测双控存储服务器工作是否正常,如果心跳超时,则进行故障切换。6.根据权利要求1、2、3或4所述的一种双控存储服务器的缓存管理方法,其特征在于使用哈希表来管理使用缓存块;哈希表的表项是一个队列,队列中存放的是具有相同哈希值的缓存块的数据结构体,称为hash链;同一条hash链中的不同缓存块的数据结构体通过不同的LBA值来准确区分;查找某个缓存块的数据结构体,首先根据计算得到的哈希值找到对应的哈希表的表项,从而获得hash链队列的头,然后遍历该hash链队列准确匹配LBA值确定目标是否存在。7.根据权利要求6所述的一种双控存储服务器的缓存管理方法,其特征在于缓存块的数据结构体的哈希值通过磁盘逻辑块号、块设备编号和HashTable大小计算获得,计算哈希值使用的哈希函数如下:哈希值=(bdev~blknr)%HashTable_SIZE;其中,HashTable_SIZE为哈希表大小,bdev为操作的块设备编号,blknr为缓存块对应的磁盘逻辑块号。【文档编号】G06F12/08GK104049918SQ201410313259【公开日】2014年9月17日申请日期:2014年7月3日优先权日:2014年7月3日【发明者】戴鸿君,于治楼申请人:浪潮集团有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1