CN115509437A - 存储系统、网卡、处理器、数据访问方法、装置及系统 - Google Patents

存储系统、网卡、处理器、数据访问方法、装置及系统 Download PDF

Info

Publication number
CN115509437A
CN115509437A CN202110944933.6A CN202110944933A CN115509437A CN 115509437 A CN115509437 A CN 115509437A CN 202110944933 A CN202110944933 A CN 202110944933A CN 115509437 A CN115509437 A CN 115509437A
Authority
CN
China
Prior art keywords
data
target data
storage
block
sub
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202110944933.6A
Other languages
English (en)
Inventor
任仁
王晨
叶利杰
崔文林
张鹏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to PCT/CN2022/092015 priority Critical patent/WO2022257685A1/zh
Publication of CN115509437A publication Critical patent/CN115509437A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/0644Management of space entities, e.g. partitions, extents, pools
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0629Configuration or reconfiguration of storage systems
    • G06F3/0631Configuration or reconfiguration of storage systems by allocating resources to storage systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/064Management of blocks

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

存储系统、网卡、处理器、数据访问方法、装置及系统,本申请中,该存储系统包括I/O栈和处理单元,I/O栈包括多个存储层。处理单元可以接收数据读取请求,数据读取请求于读取存储系统中存储的目标数据;基于数据读取请求查询全局索引,该全局索引能够指示I/O栈中目标数据所在的存储层,处理单元根据全局索引确定该目标数据的所在的存储层后,可以从该存储层中读取该目标数据。存储系统中的处理单元在处理数据读取请求时,通过查询全局索引直接确定目标数据的所在的存储层,不需要按序遍历存储系统中存储介质,省去了遍历存储介质的时延,数据读取请求的处理过程更加高效,能够有效提高数据读取效率。

Description

存储系统、网卡、处理器、数据访问方法、装置及系统
相关申请的交叉引用
本申请要求在2021年6月7日提交中华人民共和国知识产权局、申请号为202110634011.5、发明名称为“数据处理的方法和存储系统”的中国专利申请的优先权,其全部内容通过引用结合在本申请中。
技术领域
本申请涉及存储技术领域,尤其涉及存储系统、网卡、处理器、数据访问方法、装置及系统。
背景技术
在存储领域,当存储系统接收到来自客户端设备的数据读取请求时,存储系统需要按照特定的顺序依次遍历存储系统中各个存储介质,判断各个存储介质中是否存储有待读取的目标数据。例如,存储系统首先查找写缓存中是否保存有所述目标数据,若没有,则继续查找读缓存中是否保存有所述目标数据,若没有,则继续向查找下层的存储介质。
可见,若目标数据存储在排序靠后的存储介质中,存储系统需要依次遍历存储系统中排序靠前的各个存储介质,直到遍历到该目标数据所在的存储介质才能够成功查找到该目标数据。若该目标数据所在的存储介质的排序位置越靠后,数据查找的过程的耗时会越大,使得存储系统对数据读取请求的处理效率降低。
发明内容
本申请提供存储系统、网卡、处理器、数据访问方法、装置及系统,用以提升数据读取效率。
第一方面,本申请实施例提供了一种存储系统,该存储系统包括I/O栈和处理单元,I/O栈包括多个存储层(在本申请实施例中存储层可以简称为层),该I/O栈是对存储系统中的存储介质分层所形成的。每个存储层可以包括一种或多种存储介质,每个存储层的数据读取时延可以不同。处理单元可以位于该存储系统中设备(该设备可以称为存储设备)中,本申请实施例并不限定该处理单元的具体形态。该处理单元能够处理来自客户端设备或存储系统内部产生的数据读取请求,反馈所请求读取的目标数据。
具体处理过程如下:
处理单元接收数据读取请求,数据读取请求用于请求读取存储系统中存储的目标数据;处理单元可以基于数据读取请求查询全局索引,该全局索引能够指示I/O栈中目标数据所在的存储层,处理单元可以根据全局索引确定该目标数据的所在的存储层。在确定了目标数据的所在的存储层后,可以从该存储层中读取该目标数据。
通过上述系统,存储系统中的处理单元在处理数据读取请求时,通过查询全局索引可以直接确定目标数据的所在的存储层,不需要按序遍历存储系统中存储介质,省去了遍历存储介质的时延,数据读取请求的处理过程更加高效,能够有效提高数据读取效率。
在一种可能的实现方式中,处理单元除了处理数据读取请求,还可以处理数据写入请求。具体过程如下:处理单元可以接收数据写入请求,数据写入请求用于请求在存储系统中写入目标数据;处理单元可以根据数据写入请求将目标数据写入到存储系统中,还可以根据目标数据更新全局索引,更新后全局索引用于指示I/O栈中目标数据所在的存储层。具体的,所谓更新全局索引是指将所述目标数据存储在某一个存储层中,这条信息记录在第一索引项中,由此,当后续需要读取所述目标数据时,则可以通过查询所述全局索引中的第一索引项获知该数据的存储位置。索引项在实施例中称为子组,第一索引项则称为第一子组。
通过上述系统,处理单元在目标数据写入时,可以更新全局索引,更新后的全局索引能够指示目标数据所在的存储层,以便后续在处理单元需要读取目标数据时,能够根据该更新后的全局索引准确确定目标数据的所在的存储层,并读取该目标数据。
在一种可能的实现方式中,全局索引中设置有多个字符子块,每个字符子块与I/O栈中的一个存储层对应,并指向该存储系统中存储介质映射的逻辑存储空间中的一段空间。换句话说,字符子块的取值能够指示所指向的一段空间中的数据是否位于所对应的存储层中。实质上全局索引是建立逻辑存储空间与存储介质的对应关系。
将该存储系统中存储介质映射的逻辑存储空间进行细化,将逻辑存储空间划分为大的逻辑块。逻辑块还可以再细化,一个逻辑块可以划分为多个逻辑子块。
全局索引中可以包括多个字符块,一个字符块指向至少一个逻辑块。一个字符块中包括多个子组,每个子组指向该至少一个逻辑块中的逻辑子块。每个子组包括多个字符子块,该字符子块与I/O栈中的一个存储层对应。
数据读取请求包括目标数据的逻辑地址,该逻辑地址指示的是逻辑存储空间中的一段空间,处理单元在基于数据读取请求查询全局索引时,可以根据目标数据的逻辑地址在全局索引中确定指向目标数据的逻辑地址的多个字符子块;之后,根据多个字符子块的取值确定I/O栈中目标数据所在的存储层。
通过上述系统,全局索引能够将逻辑存储空间(也可以理解为逻辑地址)与I/O栈中的存储层(也可以理解为存储介质)关联起来。使得处理单元能够利用目标数据的逻辑地址查询到全局索引中指向逻辑地址的字符子块,根据该字符子块的取值可以方便、快捷的确定目标数据所在的存储层,保证了数据读取的高效性。
在一种可能的实现方式中,全局索引中字符子块的表现形式有多种,例如,一个字符子块可以为一个比特,该比特的取值可以为0,也可以为1。当该比特的取值为1时,表示目标数据位于字符子块对应的存储层中。当该比特的取值为0时,表示目标数据位于字符子块对应的存储层中。若存在多个非零比特,那么,该目标数据位于该多个非零比特所对应的存储层中的最高层中。
又例如,一个字符子块可以为一个计数器,计数器的取值可以为0,也可以为非零整数,当一个计数器取值为0时,表示没有数据写入到该计数器对应的存储层中,当一个计数器取值为非0整数时,该非0整数表示数据写入计数器对应的存储层的次数。全局索引中确定指向目标数据的逻辑地址的多个计数器中存在的非零计数器,即可表示该目标数据位于该非零计数器所对应的存储层中。若存在多个非零计数器,那么,该目标数据位于该多个非零计数器所对应的存储层中的最高层中。
通过上述系统,全局索引中字符子块呈现形式有很多种,呈现方式较为灵活,能够应用在不同的场景中。
在一种可能的实现方式中,处理单元在根据目标数据的逻辑地址在全局索引中确定指向目标数据的逻辑地址的多个字符子块时,可以对目标数据的逻辑地址进行哈希操作,如查询哈希表或作用哈希函数,根据哈希操作的结果确定指向目标数据的逻辑地址的多个字符子块。
通过上述系统,哈希操作的方式较为简单、快捷,能够较快的确定出指向目标数据的逻辑地址的多个字符子块,保证数据读取效率。
在一种可能的实现方式中,处理单元在根据哈希操作的结果确定指向目标数据的逻辑地址的多个字符子块时,可以先确定全局索引中指向目标数据的逻辑地址所属的逻辑块的字符块,之后,再根据目标数据的逻辑地址从字符块中确定指向目标数据的逻辑地址的多个字符子块。
通过上述系统,处理单元可以先定位指向较大的逻辑块的字符块,之后再从字符块中定位指向较小的逻辑子块的字符子块。处理单元先定位大范围的字符块,再定位小范围的字符子块,能够提升定位字符子块的效率。
在一种可能的实现方式中,处理单元根据目标数据的逻辑地址从字符块中确定指向目标数据的逻辑地址的多个字符子块,可以根据目标数据的逻辑地址与目标数据的逻辑地址所属的逻辑块的之间偏移在字符块中的多个子组中确定目标子组,目标子组中的字符子块为指向目标数据的逻辑地址的多个字符子块。也即处理单元可以根据该字符块所指向的逻辑块的起始地址与该目标数据的逻辑地址之间的偏移、以及该目标数据的数据长度,确定全局索引中指向该逻辑地址所指示的逻辑子块的各个子组(也即目标子组)。该各个子组中的字符子块即为全局索引中指向逻辑地址的字符子块。
通过上述系统,处理单元能够通过逻辑地址在逻辑块中的偏移以及数据长度,较为精准的确定出全局索引中指向逻辑地址的字符子块。
在一种可能的实现方式中,处理单元可以位于存储系统中设备的网卡,也可以位于该存储系统中设备的处理器中,该处理器还可以为数据处理器,也可以是存储系统中的一个独立的硬件组件。
通过上述系统,存储设备中设备的网卡或处理器可以具备处理数据读取请求的功能,有效的扩展了应用场景。
在一种可能的实现方式中,当处理单元为网卡,全局索引以及目标数据的元数据位于存储系统中设备的内存中时,客户端设备能够通过单边RDMA的方式从存储系统中获取全局索引以及目标数据的元数据。
处理单元可以在客户端设备的第一指示下向客户端设备反馈全局索引以及目标数据的元数据,第一指示为基于RDMA传输的。
其中,处理单元向客户端设备反馈的全局索引可以是整个全局索引,也可以是部分全局索引,如只反馈全局索引中只需该目标数据的逻辑地址的所有字符子块或部分字符子块。
其中,存储系统可以预先将全局索引在存储系统内存中的地址(也即内存地址)通知给客户端设备。
通过上述系统,客户端设备可以通过单边RDMA的方式读取全局索引以及目标数据的元数据,不需要存储系统中处理器的参与,能够提升数据交互效率。
在一种可能的实现方式中,当处理单元为网卡,全局索引位于存储系统中设备的内存,目标数据的元数据位于存储系统中设备的持久化存储器时,客户端设备能够通过单边RDMA的方式从存储系统中获取全局索引,通过直通访问的方式从存储系统中获取目标数据的元数据。
处理单元可以在客户端设备的第二指示下向客户端设备反馈全局索引,第二指示为基于RDMA传输的;处理单元还可以在客户端设备的第三指示下从持久化存储器中获取目标数据的元数据,向客户端设备反馈目标数据的元数据。
其中,存储系统可以预先将全局索引在存储系统内存中的地址(也即内存地址)通知给客户端设备。
通过上述系统,客户端设备可以通过单边RDMA的方式读取全局索引,通过直通访问的方式获取目标数据的元数据,不需要存储系统中处理器的参与,能够提升数据交互效率。
在一种可能的实现方式中,当目标数据的元数据指示该目标数据位于存储系统中设备的内存中(其中,存储系统中设备的内存可以归属在该存储系统I/O栈中的一层或多层中)。客户端设备可以通过获取的全局索引确定该目标数据的元数据是否有效,也即确定全局索引指示的存储层与目标数据的元数据所指示的位置是否一致,若一致,则说明目标数据的元数据有效,客户端设备可以通过单边RDMA从该存储系统获取目标数据。处理单元可以在客户端设备的第四指示下向客户端设备反馈目标数据,第四指示是根据目标数据的元数据发起的、基于RDMA传输的。
通过上述系统,存储系统允许客户端设备通过单边RDMA的方式获取全局索引,以及允许客户端设备通过单边RDMA的方式获取目标数据,有效简化了存储系统与客户端设备之间得到交互流程,存储系统中的处理器不需要参与,也可以减少对存储系统中处理器的占用。
在一种可能的实现方式中,当目标数据位于存储系统中设备的持久化存储器中(其中,存储系统中设备的持久化存储器可以归属在该存储系统I/O栈中的一层或多层中)。客户端设备可以通过获取的全局索引确定该目标数据的元数据是否有效,也即确定全局索引指示的存储层与目标数据的元数据所指示的位置是否一致,若一致,则说明目标数据的元数据有效,客户端设备可以通过直通访问的方式从该存储系统获取目标数据。处理单元可以在客户端设备的第五指示下从向持久化存储器中获取目标数据,并向客户端设备反馈目标数据,第五指示根据目标数据的元数据发起的。
通过上述系统,存储系统允许客户端设备通过单边RDMA的方式获取全局索引,以及允许客户端设备通过直通访问的方式获取目标数据,使得客户端设备不经过存储系统中的处理器就可以能够直接获得目标数据。
在一种可能的实现方式中,处理单元还可以控制I/O栈中的数据流动(数据从一个存储层中流出,再流入到另一个存储层)以及数据淘汰(一个存储层中的数据被删除),还可以根据I/O栈中的数据流动以及数据淘汰更新全局索引。该处理单元可以是网卡,也可以是处理器。
通过上述系统,处理单元能够I/O栈中的数据流动以及数据淘汰更新全局索引,使得全局索引能够准确的指示各个数据所在的存储层,保证数据读取过程的准确、有效。
第二方面,本申请实施例提供了一种数据访问方法,方法可以由存储系统中的处理单元执行,有益效果可以参见第一方面以及第一方面任一种可能的实现方式中的相关说明,此处不再赘述。该存储系统中还包括I/O栈,关于I/O栈的说明可以参见前述内容,此处不再赘述。该方法中,处理单元可以接收数据读取请求,数据读取请求用于请求读取存储系统中存储的目标数据。在接收到数据读取请求后,处理单元可以基于数据读取请求查询全局索引,全局索引用于指示I/O栈中目标数据所在的存储层;之后,处理单元可以根据全局索引指示的存储层,读取目标数据。
在一种可能的实现方式中,处理单元还可以处理数据写入请求。处理单元可以接收数据写入请求,数据写入请求用于请求在存储系统中写入目标数据。之后,处理单元可以根据数据写入请求将目标数据写入到存储系统中,还可以根据该目标数据更新全局索引,更新后全局索引用于指示I/O栈中目标数据所在的存储层。
在一种可能的实现方式中,数据读取请求包括目标数据的逻辑地址,处理单元在基于数据读取请求查询全局索引时,可以根据目标数据的逻辑地址在全局索引中确定指向目标数据的逻辑地址的多个字符子块;之后,再根据多个字符子块的取值确定I/O栈中目标数据所在的存储层。
在一种可能的实现方式中,全局索引中字符子块的表现形式有多种。例如,一个字符子块可以为一个比特,该比特的取值可以为0,也可以为1。当该比特的取值为1时,表示目标数据位于字符子块对应的存储层中。当该比特的取值为0时,表示目标数据位于字符子块对应的存储层中。
又例如,一个字符子块可以为一个计数器,计数器的取值可以为0,也可以为非零整数,当一个计数器取值为0时,表示没有数据写入到该计数器对应的存储层中,当一个计数器取值为非0整数时,该非0整数表示目标数据位于所对应的存储层中,还可以指示数据(该数据包括目标数据)写入计数器对应的存储层的次数。
在一种可能的实现方式中,处理单元在根据目标数据的逻辑地址在全局索引中确定指向目标数据的逻辑地址的多个字符子块时,可以对目标数据的逻辑地址进行哈希操作,如查询哈希表或作用哈希函数,根据哈希操作的结果确定指向目标数据的逻辑地址的多个字符子块。
在一种可能的实现方式中,处理单元在根据哈希操作的结果确定指向目标数据的逻辑地址的多个字符子块时,可以先确定全局索引中指向目标数据的逻辑地址所属的逻辑块的字符块,之后,再根据目标数据的逻辑地址从字符块中确定指向目标数据的逻辑地址的多个字符子块。
在一种可能的实现方式中,处理单元根据目标数据的逻辑地址从字符块中确定指向目标数据的逻辑地址的多个字符子块,可以根据目标数据的逻辑地址与目标数据的逻辑地址所属的逻辑块的之间偏移在字符块中的多个子组中确定目标子组,目标子组中的字符子块为指向目标数据的逻辑地址的多个字符子块。也即处理单元可以根据该字符块所指向的逻辑块的起始地址与该目标数据的逻辑地址之间的偏移、以及该目标数据的数据长度,确定全局索引中指向该逻辑地址所指示的逻辑子块的各个子组(也即目标子组)。该各个子组中的字符子块即为全局索引中指向逻辑地址的字符子块。
在一种可能的实现方式中,当处理单元为网卡,全局索引以及目标数据的元数据位于存储系统中设备的内存中时,客户端设备能够通过单边RDMA的方式从存储系统中获取全局索引以及目标数据的元数据。
处理单元可以在客户端设备的第一指示下向客户端设备反馈全局索引以及目标数据的元数据,第一指示为基于RDMA传输的。
其中,处理单元向客户端设备反馈的全局索引可以是整个全局索引,也可以是部分全局索引,如只反馈全局索引中只需该目标数据的逻辑地址的所有字符子块或部分字符子块。
在一种可能的实现方式中,全局索引位于方法中设备的内存,目标数据的元数据位于方法中设备的持久化存储器中,处理单元可以在客户端设备的第二指示下向客户端设备反馈全局索引,第二指示为基于RDMA传输的。
处理单元还可以在客户端设备的第三指示下从持久化存储器中获取目标数据的元数据,向客户端设备反馈目标数据的元数据。
在一种可能的实现方式中,当处理单元为网卡,全局索引位于存储系统中设备的内存,目标数据的元数据位于存储系统中设备的持久化存储器时,客户端设备能够通过单边RDMA的方式从存储系统中获取全局索引,通过直通访问的方式从存储系统中获取目标数据的元数据。
处理单元可以在客户端设备的第二指示下向客户端设备反馈全局索引,第二指示为基于RDMA传输的;还可以在客户端设备的第三指示下从持久化存储器中获取目标数据的元数据,向客户端设备反馈目标数据的元数据。
在一种可能的实现方式中,当目标数据的元数据指示该目标数据位于存储系统中设备的内存中(其中,存储系统中设备的内存可以归属在该存储系统I/O栈中的一层或多层中)。客户端设备可以通过获取的全局索引确定该目标数据的元数据是否有效,也即确定全局索引指示的存储层与目标数据的元数据所指示的位置是否一致,若一致,则说明目标数据的元数据有效,客户端设备可以通过单边RDMA从该存储系统获取目标数据。处理单元可以在客户端设备的第四指示下向客户端设备反馈目标数据,第四指示是根据目标数据的元数据发起的、基于RDMA传输的。
在一种可能的实现方式中,处理单元还可以控制I/O栈中的数据流动以及数据淘汰;并根据I/O栈中的数据流动以及数据淘汰更新全局索引。
第三方面,本申请实施例还提供了一种网卡,该网卡可以是存储系统中设备上的网卡,该网卡具有实现上述第二方面以及第二方面的各个可能的实现方式中的方法实例中行为的功能,有益效果可以参见第一方面的描述此处不再赘述。
第四方面,本申请实施例还提供了一种处理器,该处理器可以是存储系统中设备上的处理器,该处理器具有实现上述第二方面以及第二方面的各个可能的实现方式中的方法实例中行为的功能,有益效果可以参见第一方面的描述此处不再赘述。
第五方面,本申请实施例还提供了一种数据访问装置,该数据访问装置具有实现上述第二方面的方法实例中行为的功能,有益效果可以参见第一方面的描述此处不再赘述。功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。硬件或软件包括一个或多个与上述功能相对应的模块。在一个可能的设计中,装置的结构中包括传输模块、读取模块,可选的,还可以包括写入模块、以及控制模块,这些模块可以执行上述第二方面方法示例中的相应功能,具体参见方法示例中的详细描述,此处不做赘述。
第六方面,本申请实施例提供了一种数据访问系统,数据访问系统包括存储系统以及客户端设备,存储系统包括I/O栈和处理单元,关于I/O栈的说明可以参见前述内容,此处不再赘述。
客户端设备可以向存储系统发送数据读取请求,数据读取请求用于请求读取存储系统中存储的目标数据。存储系统中的处理单元接收数据读取请求后,可以基于数据读取请求查询全局索引,全局索引用于指示I/O栈中目标数据所在的存储层。之后,再根据全局索引指示的存储层,读取目标数据,向客户端设备反馈目标数据。
在一种可能的实现方式中,客户端设备还可以向存储系统发送数据写入请求,数据写入请求用于请求在存储系统中写入目标数据。处理单元在接收数据写入请求后,可以根据数据写入请求写入目标数据,该可以根据该目标数据更新全局索引,更新后全局索引用于指示I/O栈中目标数据所在的存储层。
在一种可能的实现方式中,数据读取请求包括目标数据的逻辑地址,处理单元在基于数据读取请求查询全局索引时,可以根据目标数据的逻辑地址在全局索引中确定指向目标数据的逻辑地址的多个字符子块;之后,再根据多个字符子块的取值确定I/O栈中目标数据所在的存储层。
在一种可能的实现方式中,字符子块为一个比特,比特的取值包括0或1,1表示目标数据位于字符子块对应的存储层中,0表示目标数据位于字符子块对应的存储层中。
在一种可能的实现方式中,字符子块为一个计数器,计数器为0或非零整数,非零整数指示数据写入字符子块对应的存储层的次数。
在一种可能的实现方式中,处理单元是一个具有计算能力的处理芯片,例如数据处理器,它可以位于存储系统的网卡中,也可以位于中央处理器中,还可以是存储系统内部的一个独立的硬件组件。
在一种可能的实现方式中,处理单元在根据目标数据的逻辑地址在全局索引中确定指向目标数据的逻辑地址的多个字符子块时,可以对目标数据的逻辑地址进行哈希操作,如查询哈希表或作用哈希函数,根据哈希操作的结果确定指向目标数据的逻辑地址的多个字符子块。
在一种可能的实现方式中,处理单元在根据哈希操作的结果确定指向目标数据的逻辑地址的多个字符子块时,可以先确定全局索引中指向目标数据的逻辑地址所属的逻辑块的字符块,之后,再根据目标数据的逻辑地址从字符块中确定指向目标数据的逻辑地址的多个字符子块。
在一种可能的实现方式中,处理单元根据目标数据的逻辑地址从字符块中确定指向目标数据的逻辑地址的多个字符子块,可以根据目标数据的逻辑地址与目标数据的逻辑地址所属的逻辑块的之间偏移在字符块中的多个子组中确定目标子组,目标子组中的字符子块为指向目标数据的逻辑地址的多个字符子块。
在一种可能的实现方式中,当全局索引以及目标数据的元数据位于系统中设备的内存中。
客户端设备可以基于RDMA向存储系统发起第一指示,第一指示用于请求全局索引以及目标数据的元数据。处理单元可以在客户端设备的第一指示下向客户端设备反馈全局索引以及目标数据的元数据。
需要说明的是,客户端设备可以请求获取整个全局索引,也可以只获取部分全局索引,例如,客户端设备可以根据目标数据的逻辑地址和预先获得的全局索引的内存地址确定全局索引中指向该逻辑地址的部分或全部字符子块的内存地址,根据该部分或全部字符子块的内存地址向存储系统发起第一指示,请求该部分或全部字符子块。
在一种可能的实现方式中,处理单元可以将全局索引在存储系统中的内存地址通知给客户端设备。
在一种可能的实现方式中,当全局索引位于系统中设备的内存,目标数据的元数据位于系统中设备的持久化存储器中。
客户端设备可以基于RDMA向存储系统发起第二指示,第二指示用于请求全局索引;还可以向存储系统发起第三指示,第三指示用于请求目标数据的元数据。
处理单元可以在客户端设备的第二指示下向客户端设备反馈全局索引;在客户端设备的第三指示下从持久化存储器中获取目标数据的元数据,向客户端设备反馈目标数据的元数据。
需要说明的是,客户端设备可以请求获取整个全局索引,也可以只获取部分全局索引,例如,客户端设备可以根据目标数据的逻辑地址和预先获得的全局索引的内存地址确定全局索引中指向该逻辑地址的部分或全部字符子块的内存地址,根据该部分或全部字符子块的内存地址向存储系统发起第二指示,请求该部分或全部字符子块。
在一种可能的实现方式中,当目标数据位于系统中设备的内存中;客户端设备可以根据全局索引校验目标数据的元数据的有效性;在确定目标数据的元数据有效的情况下,根据目标数据的元数据向存储系统发起第四指示,第四指示是基于RDMA传输的。之后,处理单元可以在客户端设备的第四指示下向客户端设备反馈目标数据。
在一种可能的实现方式中,当目标数据位于系统中设备的持久化存储器中。
客户端设备可以根据全局索引校验目标数据的元数据的有效性;在确定目标数据的元数据有效的情况下,根据目标数据的元数据向存储系统发起第五指示。
处理单元可以在客户端设备的第五指示下从向持久化存储器中获取目标数据,并向客户端设备反馈目标数据。
在一种可能的实现方式中,处理单元还可以控制I/O栈中的数据流动以及数据淘汰;以及根据I/O栈中的数据流动以及数据淘汰更新全局索引。
第七方面,本申请还提供一种计算机可读存储介质,计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第二方面以及第二方面的各个可能的实现方式中的方法。
第八方面,本申请还提供一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第二方面以及第二方面的各个可能的实现方式中的方法。
第九方面,本申请还提供一种计算机芯片,芯片与存储器相连,芯片用于读取并执行存储器中存储的软件程序,执行上述第二方面以及第二方面的各个可能的实现方式中的方法。
附图说明
图1为本申请提供的一种系统的架构示意图;
图2为本申请提供的一种I/O栈的结构示意图;
图3A~图3B为本申请提供的一种全局索引的示意图;
图4~图5为本申请提供的一种数据访问方法示意图;
图6~图7为本申请提供的另一种数据访问方法示意图;
图8为本申请提供的数据处理装置的结构示意图。
具体实施方式
在对本申请所提供的数据处理方法进行说明之前,先对本申请涉及的概念进行说明:
1、元数据(metadata)。
又称中介数据、中继数据。元数据为描述数据的数据(data about data),元数据可以指示数据的属性,如元数据可以记录数据的物理地址、数据的修改信息等。
2、远程直接内存访问(remote direct memory access,RDMA)。
RDMA是一种绕过远程设备(如存储设备)操作系统内核访问其内存中数据的技术,由于不经过操作系统,不仅节省了大量处理器资源,同样也提高了系统吞吐量、降低了系统的网络通信延迟,尤其适合在大规模并行计算机集群中有广泛应用。
RDMA有几大特点,(1)数据通过网络与远程设备间进行数据传输;(2)没有操作系统内核的参与,有关发送传输的所有内容都卸载到智能网卡上;(3)在用户空间虚拟内存与智能网卡之间直接进行数据传输不涉及操作系统内核,没有额外的数据移动和复制。
3、单边RDMA和双边RDMA。
在这里将需要交互信息的两端分别称为客户端设备(简称客户端)和服务端(在本申请实施例中服务端可以理解为存储设备)。客户端部署在用户侧,用户可以通过客户端向服务端发起请求。服务端可以部署在远端,服务端泛指存储系统,具体可以理解为存储系统中的设备。
单边RDMA可以分为RDMA读(READ)以及RDMA写(WRITE)。
以单边RDMA中的RDMAREAD为例,客户端可以直接确定目标数据在服务端的内存中的位置,因此客户端发起的用于请求读取数据的报文中携带目标数据的位置信息,将该报文发送给服务端。在服务端侧,服务端侧的网卡读取该位置信息上的数据。上述过程中,服务端侧的处理器对客户端的一系列操作不感知。换句话说,服务端侧的处理器不知道客户端执行了读操作,因而减少了处理器参与数据传输过程的消耗,提升了系统处理业务的性能,具有高带宽、低时延及低CPU占用率的特点。
在本申请实施例中客户端设备可以通过单边RDMA从服务端中读取全局索引中的子组,还可以通过单边RDMA从服务端读取目标数据在I/O栈中某层的数据的元数据。
双边RDMA可以分为RDMA发送(SEND)以及RDMA接收(RECEIVE)。
以双边RDMA中的RDMA RECEIVE为例,客户端并不知道所述目标数据的元数据存储在服务端的内存中的位置,因此客户端发起的用于请求读取数据的报文中不携带元数据的位置信息。服务端接收到该报文后,服务端侧的处理器查询该元数据的位置信息并返回给客户端,客户端会再次向服务端发起用于请求读取数据的报文,这次的报文中包含该元数据的位置信息(也即元数据的地址)。服务端的网卡再根据该元数据的位置信息获取元数据,并进一步获得目标数据,并将该目标数据发送给客户端。在该过程中,需要服务端侧的处理器参与,也就是说,双边RDMA需要服务端侧的处理器处理来自客户端的报文,所以单边RDMA相对于双边RDMA,读取数据的时间更短,对处理器的占用率更低,用户体验更好。因此,单边RDMA的应用越来越广。
4、直通访问。
直通访问是一种不需要经过服务端处理器从服务端的持久化存储器(如硬盘)中读写数据的方式。在直通访问的方式中,客户端能够确定服务端的持久化存储器中目标数据所在的位置,客户端可以通过服务端的网卡与服务端的硬盘中的控制器进行通信,进而从该服务端的硬盘中读取数据或写入数据。
在本申请实施例中,当该数据的元数据(或索引)存储在服务端的硬盘上时,客户端可以通过直通访问的方式从服务端读取该数据在I/O栈中某层的数据的元数据。当I/O栈中的某层的数据存储在服务端的持久化存储器上,客户端还可以通过直通访问的方式从服务端读取目标数据在I/O栈中该层的数据。
如图1所示,为本申请实施例提供的一种数据访问系统的结构示意图,该系统包括客户端设备200和存储系统100,该存储系统100中包括多个存储设备,在图1中仅示例性的展示了存储系统的一个存储设备110。
用户通过应用程序来存取数据。运行这些应用程序的计算机被称为“客户端设备200”。客户端设备200可以是物理机,也可以是虚拟机。物理客户端设备200包括但不限于桌面电脑、服务器、笔记本电脑以及移动设备。
用户可以通过客户端设备200向存储系统100中的存储设备110发起数据访问请求,如数据写入请求或数据读取请求。存储设备110接收该数据访问请求,并处理该数据访问请求。
这里以存储设备110对数据访问请求进行处理,执行本申请实施例提供的数据访问方法为例进行说明。例如,数据访问请求为数据写入请求,用于请求在存储系统100中写入目标数据。该数据写入请求中包括该目标数据、目标数据的逻辑地址。存储设备110在接收到该数据写入请求后,可以根据该数据写入请求先将该目标数据写入到该目标数据的逻辑地址指示的位置处,该位置可以位于I/O栈中的一层;并更新全局索引,更新后的全局索引能够指示I/O栈中该目标数据所在的层。I/O栈将存储系统中的存储介质划分层后形成的层状结构,I/O栈中的每一层包括一种或多种存储介质,可以用于存储数据。全局索引能够将数据的逻辑地址与该数据所在的层进行关联,以指示该I/O栈中数据所在的层。关于I/O栈以及全局索引的说明可以参见下文中的相关说明。
又例如,数据访问请求为数据读取请求,用于请求从存储系统100中读取目标数据,该数据读取请求中携带有该目标数据的逻辑地址。存储设备110接收到该数据读取请求后,可以根据全局索引以及该目标数据的逻辑地址确定I/O栈中该目标数据的所在的层,进而从该目标数据的所在的层读取该目标数据。
具体到存储设备110的结构,参见图1,该存储设备110包括总线111、处理器112、内存113、网卡114以及硬盘115。内存113可以位于处理器112中。
需要说明的是,在本申请实施例中以硬盘作为存储设备的持久化存储器为例进行说明,但对机械硬盘或者其他类型的硬盘也同样适用于本申请实施例。
处理器112可以为中央处理器(central processing unit,CPU),该处理器112还可以是其他通用处理器、数字信号处理器(digital signal processor,DSP)、专用集成电路(application specific integrated circuit,ASIC)、现场可编程门阵列(fieldprogrammable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件、人工智能芯片、片上芯片等。
内存113可以包括易失性存储器(volatile memory),例如随机存取存储器(random access memory,RAM)、动态随机存取存储器(dynamic random access memory,DRAM)等。也可以为非易失性存储器(non-volatile memory),例如存储级存储器(storage-class memory,SCM)等,或者易失性存储器与非易失性存储器的组合等。内存113可以从功能角度进行划分,可以将内存113划分为写缓存、读缓存等。其中写缓存是指能够提供高效写入能力的缓存,读缓存是指能够存储读取频率较高的数据的缓存。
该存储设备110中还可以包括一个或多个硬盘115。这硬盘115可以用于永久地存储数据。具体到硬盘115内部,硬盘115中也可以包括硬盘缓存以及持久化存储介质。
在存储设备110内部,本申请实施例提供的数据访问方法可以由于处理器112执行,也即,处理器112可以通过调用计算机执行指令,执行本申请实施例提供的数据访问方法。本申请实施例提供的数据访问方法也可以由于网卡114执行,例如,网卡114可以通过调用内存113中存储的计算机执行指令,执行本申请实施例提供的数据处理方法。又例如,网卡114也可以调用网卡114内部存储的计算机执行指令,执行本申请实施例提供的数据访问方法。又例如,在一些可能的场景中,网卡114上也可以烧写有计算机存储指令,网卡114可以执行本申请实施例提供的数据访问方法。
本申请实施例并不限定该存储系统的类型,在实践中图1中的存储系统既可以表现为集中式存储系统,也可以表现为分布式存储系统。
对于存储系统中存储设备中的各个存储介质(如读缓存、写缓存、硬盘等),引入存储介质分层的概念,存储介质分层是指按照存储设备中各个存储介质的功能或类型等标准将存储介质划分成自上而下(由高到低)的多层。本申请实施例并不限定存储介质分层时所采用的划分标准,例如,可以仅是按照存储介质的类型将存储介质划分,将同一类型的存储介质划分为一层,形成自上而下(由高到低)的多层。又例如,可以仅是按照存储介质的功能将存储介质划分,形成自上而下(由高到低)的多层。又例如,可以综合考虑存储介质的功能和类型将存储介质划分,形成自上而下(由高到低)的多层。
如图2所示,在本申请实施例中,通过对存储系统中存储介质进行分层,可以形成存储系统的输入/输出(input/out,I/O)栈。在I/O栈中自上而下以粗粒度划分,可以分为性能层和容量层。性能层的读写性能优于容量层,但性能层的容量相对较小。
具体到性能层内部,继续细化,自上而下可以分为写缓存(write cache,Wcache)、读缓存(read cache,Rcache)、硬盘缓存(smart cache)。写缓存(write cache,Wcache)、读缓存(read cache,Rcache)、硬盘缓存分别为I/O栈中的一层。
需要说明的是,性能层中包括各种缓存仅是举例。存储介质分层的标准不同,性能层中的细化分层也可能不同。
具体到容量层内部,继续细化,自上而下可以分为高性能层和普通性能层,其中,高性能层可以包括性能较高的硬盘,如固态硬盘(SSD)。普通性能层可以包括性能一般的硬盘,如机械硬盘(HDD)。
需要说明的是,容量层中包括各层也仅是举例。不同的存储系统100包括的硬盘的类型也可能不同。例如,有些存储系统100中可能只包括一种硬盘,这种情况下容量层可以不再继续细化。
该I/O栈中各层的排布描述了存储系统100中数据的流向,在存储系统100中数据通常是从I/O栈各层中自上而下流动的。以图2所示的I/O栈为例,当数据A写入到存储系统100时,会优先写入到性能层。在性能层内部,会优先写入到写缓存,当写缓存中的数据超过阈值W时,写缓存的数据会迁移至读缓存,这样,写缓存中会形成空闲的存储空间以存储最新写入的数据。当读缓存的数据超过一定阈值R时,读缓存的数据会继续向下迁移,迁移至硬盘缓存。若硬盘缓存中的数据超过阈值S,硬盘缓存中的数据会流向容量层。硬盘缓存中的数据会优先迁移至容量层中的高性能层,当高性能层中的数据达到阈值H,高性能层中的数据会迁移至普通性能层。
具体到该I/O栈的每一层,该I/O栈的每一层中可以包括一种或多种存储介质,可用于存储数据。为了便于能够快速从该I/O栈的一层中找到数据,在该I/O栈的一层中可以对该层所存储的数据进行索引。也即在数据写入到该层中时,可以为数据创建索引。该索引能够指示数据的逻辑地址与该数据的元数据之间的对应关系。根据数据的逻辑地址能够确定该数据的元数据,进而确定该数据的物理地址。
本申请实施例并不限定每层中对数据进行索引的方式,例如可以通过哈希表的方式对数据进行索引,也即数据的索引以哈希表的形式保存在该层中,哈希表中记录了数据的逻辑地址与元数据的对应关系。又例如,还可以通过B+树或者链表的方式对数据进行索引。
基于如图2所示的I/O栈,当存储系统100在处理来自客户端设备200的数据读取请求时,按照I/O栈自上而下的顺序依次在各层中的存储介质中查找数据读取请求所请求读取的数据,直到找到数据读取请求所请求读取的数据。在查找到所请求的数据后,向客户端设备200反馈该数据。
这种按照I/O栈自上而下的顺序依次在各层中查找数据的方式是较为常见的方式,当所查找的数据越位于下层,查找数据的耗时就越大。这样会导致数据读取请求的处理效率降低。
为了能够有效提高数据读取请求的处理效率,在本申请实施例中,存储系统100中设置有全局索引(global mask),该全局索引能够指示逻辑地址上的数据位于I/O栈中的哪一层。当存储设备110接收到数据读取请求后,可以根据该数据读取请求中携带的所请求读取目标数据的逻辑地址、以及该全局索引确定该I/O栈中目标数据所在的层中。之后,根据该逻辑地址从该层中读取目标数据。这样,在整个数据读取请求的处理过程中,并不需要按照I/O栈自上而下的顺序依次在各层中查找数据,利用全局索引就可以直接确定所请求读取的数据所在的层,能够较大程度的减少数据查找的时延,提升数据读取请求的处理效率。
显然,全局索引是简化数据读取过程的关键,下面对全局索引的构成进行说明,在本申请实施例中,全局索引可以以如下任一种或两种形式存在。
在对全局索引介绍之前,先对逻辑存储空间的划分进行简单说明,以更好的理解全局索引的存在形式。在本申请实施例中可以将存储系统100中将各个存储介质构成的物理存储空间映射到逻辑存储空间,该逻辑存储空间按照设定大小进行划分,将逻辑存储空间划分为多个逻辑块。每个逻辑块的大小可以相同。例如每个逻辑块可以等于256千字节(Kibibyte,KB),又例如,每个逻辑块可以等于1兆字节(megabyte,MB)。在每个逻辑块中可以按照I/O栈的最小读写单位进行划分,划分为多个逻辑子块。每个逻辑子块的大小可以等于该I/O栈的最小读写单位。
I/O栈的最小读写单位是指在数据写入过程中一次向I/O栈中写入的最小数据量,或数据读取过程中一次从I/O栈中读取的最小数据量。通常一次写入的最小数据量以及读取的最小数据量是相同的。举例来说,当向存储系统100写入一个256KB的数据时,若I/O栈的最小读写单位为8KB,则在写入256KB的数据时,会分多次(32次),每次写入8KB大小的数据,直至256KB的数据全部写完。同样的,当从存储系统100读取一个256K的数据时,若I/O栈的最小读写单位为8KB,则在读取256KB的数据时,会分多次(32次),每次读取8KB大小的数据,直至256KB的数据全部读取。
在全局索引中设置了用于指向逻辑块的字符块,字符块内部包括有指向逻辑子块的字符子块。对于任一逻辑块,指向该逻辑块的字符块的具体取值能够指示该逻辑块上是否存储有数据,所存储的数据存储在I/O栈的哪一层。类似的,对于任一逻辑子块,指向该逻辑子块的字符子块能够指示该逻辑子块上是否存储有数据,所存储的数据存储在I/O栈的哪一层。
全局索引中包括多个字符块,每个字符块用于指向至少一个逻辑块,每个字符块中包括多个子组,每个子组指向该至少一个逻辑块中的一个逻辑子块。每个子组包括多个字符子块,一个字符子块对应I/O栈中一层。字符子块的具体取值能够指示该逻辑子块上是否存储有数据,所存储的数据是否存储在I/O栈的中该字符子块所对应的层。
全局索引的不同存在形式,字符块、字符子块的大小不同。对于比特位图,最小的字符子块为一个比特,每个子组包括对应I/O栈中不同层的多个比特,字符块包括指向不同逻辑子块的多个子组。一个字符块为一组比特。对于计数器组,最小的字符子块为一个计数器,通常计数器需要由多个比特表示。每个子组包括对应I/O栈中不同层的多个计数器,字符块包括指向不同逻辑子块的多个子组构成。一个字符块为一组计数器。
形式一、比特位图(bitmap)。
如图3A所示,比特位图的示意图,在该比特位图中包括多组(group)比特,每组比特能够指向至少一个逻辑块,每组比特中包括多个子组(grain),每个子组中包括多个比特,每个子组指向逻辑块中的一个逻辑子块,一组比特中的不同子组所指向的逻辑子块不同,每个子组中比特的数量可以等于I/O栈中层的总数,也可以等于I/O栈中层的总数减一。
一个子组中的一个比特对应I/O栈中的一层,不同比特对应I/O栈中的不同层。例如,对于该子组中一个比特,当该比特的取值为1时,可以指示该逻辑子块中的数据位于该层,当该比特的取值为0值时,可以指示该逻辑子块中的数据不在该层。举例来说,一个子组中的多个比特按照I/O栈自上而下的顺序依次对应I/O栈中的一层,也即第一个比特对应I/O栈中的第一层(如对应写缓存),第二个比特对应I/O栈中的第二层(如对应读缓存),第三个比特对应I/O栈中的第三层(如对应硬盘缓存)。第四个比特对应I/O栈中的第四层(如对应容量层)。
当第一个比特的取值为1时,可以表示该子组所指向的逻辑子块上的数据位于写缓存,当第一个比特的取值为0时,可以表示该子组所指向的逻辑子块上的数据不在写缓存。同样的,当第二个比特的取值为1时,可以表示该子组所指向的逻辑子块上的数据位于读缓存,当第二个比特的取值为0时,可以表示该子组所指向的逻辑子块上的数据不在读缓存。同样的,当第三个比特的取值为1时,可以表示该子组所指向的逻辑子块上的数据位于硬盘缓存,当第三个比特的取值为0时,可以表示该子组所指向的逻辑子块上的数据不在硬盘缓存。同样的,当第四个比特的取值为1时(图2中未示出第四个比特),可以表示该子组所指向的逻辑子块上的数据位于容量层,当第四个比特的取值为0时,可以表示该子组所指向的逻辑子块上的数据不在容量层。在一些场景中,也可以不设置对应与最后一层的比特,如可以省略第四个比特。
比特位图上每个子组中各个比特的值是随着数据的写入、流动、淘汰发生变化的。
数据流动,是指在I/O栈中各层中数据的流入或流出,如将I/O栈中上一层的数据迁移到下一层。又如数据从I/O栈中的一层流出,流出的数据再流入到I/O栈中的另一层。数据流动主要发生在针对写缓存的刷盘流程、容量层的垃圾回收、执行读数据请求时的数据加载、数据预取流程(如将读写频率较高的数据写入到读缓存中)或动态分级存储特性中的数据迁移过程中。
数据写入是指向I/O栈某一层写入数据。
数据淘汰是指删除I/O栈中某一层的数据,如对读缓存中的数据的淘汰,或对容量层之后进行垃圾回收时,需要将该容量层中被覆盖的数据删除。
以一个子组中的第一个比特为例,该第一个比特对应该I/O栈中的第一层,第一个比特的值为1,表明该子组所指向的逻辑子块中的数据位于I/O栈中的第一层。当I/O栈中第一层的数据的数据量达到阈值W时,第一层的数据可以迁移到第二层,此时第一个比特的值会减一,变成0,数值0表明该子组所指向的逻辑子块中的数据不在第一层中。当之后进行数据写入时,写入的数据写入到了该子组所指向的逻辑子块中,那么,在数据写入时,第一个比特的值会变为1。若后续又进行了数据写入,写入的数据同样写入到了该子组所指向的逻辑子块中,之前该逻辑子块中写入的数据被覆盖,那么,在数据写入时,第一个比特的值仍会保持1。以此时第一个比特的值为1为例,当在后续在进行数据淘汰时,若发现该子组所指向的逻辑子块中写入的数据是不活跃的数据,则会删除该子组所指向的逻辑子块中的数据,删除了该子组所指向的逻辑子块中的数据后,第一个比特的值变为0。若在该子组所指向的逻辑子块中发生了两次数据写入,该子组所指向的逻辑子块中第一次写入的数据是需要被覆盖的数据,删除该子组所指向的逻辑子块中第一次写入的数据,保留最近一次写入的数据,该第一个比特的值仍保持1。
可见,比特位图上每个子组中的一个比特的取值仅能够表示该子组所指向的逻辑子块上的数据是否位于该层,但无法具体描述该子组所指向的逻辑子块上的数据是第几次写入的数据。
需要说明的是,在实际应用中,一个子组也可以不设置对应于I/O栈中最后一层的比特。在这种情况下,该子组中各个比特对应该I/O栈中除最后一层之外的其他层,当该子组中的所有比特均为0时,也即说明该子组所指向的逻辑子块中的数据并不位于该I/O栈中除最后一层之外的其余层,进一步可以说明,该子组所指向的逻辑子块中的数据只能位于该I/O栈中最后一层。
由于逻辑块是逻辑存储空间中一个较大的空间,而数据的逻辑地址所指示的空间可能是该逻辑块中的一部分,逻辑地址所指示的空间可以是该逻辑块中的部分逻辑子块(为了方便表述,该部分逻辑子块以称为该逻辑地址所指示的逻辑子块)。为此,在查找数据时,需要先确定该逻辑地址所指示的空间所属的逻辑块(为了方便表述,该逻辑地址所指示的空间所属的逻辑块也可以称为逻辑地址所属的逻辑块),确定比特位图中指向该逻辑块的一组或多组比特。之后,从该逻辑块中确定该逻辑地址所指示的逻辑子块,确定比特位图中该一组或多组比特中指向该逻辑子块的一个或多个子组。
为了能够根据逻辑地址确定比特位图中指向该逻辑地址所属的逻辑块的一组或多组比特,该存储系统100中还可以设置哈希表,该哈希表中记录了逻辑地址与比特位图中各组比特的对应关系。通过该数据的逻辑地址和该哈希表可以确定指向该逻辑地址所属的逻辑块的一组或多组比特。或者,该存储系统100中还可以设置哈希函数,将逻辑地址作为该哈希函数的输入,获得的哈希值可以指示该比特位图中一组或多组比特,一组或多组比特指向该逻辑地址所属的逻辑块。
在确定该比特位图中一组或多组比特时,可以按照逻辑块的大小对逻辑地址取整。利用取整后获得的数查询哈希表,确定指向该逻辑地址所属的逻辑块的一组或多组比特。或者对取整后获得的数作用哈希函数,确定指向该逻辑地址所属的逻辑块的一组或多组比特。
在确定了该比特位图中一组或多组比特之后,可以进一步从该一组或多组比特中确定一组或多个子组,该一个或多个子组所指向的逻辑子块为该逻辑地址所指示的逻辑子块。在确定该一个或多个子组时,可以根据该逻辑地址在该逻辑块中的偏移以及目标数据的数据长度确定该逻辑地址所指示的逻辑子块。
该逻辑地址在该逻辑块中的偏移可以通过该逻辑块的起始地址与该逻辑地址之间的差值确定。以每个逻辑块大小为256KB,逻辑块中包括32个逻辑子块,每个逻辑子块的大小为8KB,每组比特中包括32个子组为例。若数据的逻辑块地址(logic block address,LBA)所指示的位置为1MB+520KB,数据长度为256KB。可以先按照逻辑块的大小(256K)对1MB+520KB取整,获得1MB+512KB。对1MB+512KB作用哈希函数,可以确定指向该逻辑地址所属的逻辑块的两组比特。1MB+512KB为该逻辑块的起始地址,该逻辑地址在该逻辑块中的偏移即为1MB+512KB与1MB+520KB之间的差值,也即偏移为8KB。该逻辑地址所指示的位置即为逻辑块偏移了8KB的位置。又由于每个逻辑子块的大小为8KB,因此该逻辑地址所指示的逻辑子块为该逻辑块起始位置后偏移一个逻辑子块后的逻辑子块,也即第二个逻辑子块。因为数据长度为256KB,该逻辑地址所指向的逻辑子块是该逻辑块中从第二个逻辑子块到第32个逻辑子块以及下一个逻辑子块中的第一个逻辑子块,共32个逻辑子块。在比特位图上指向该32个逻辑子块的子组为指向该逻辑块的一组比特中的第二个子组到第32个子组子块以及下一组比特中的第一个子组。
在找到了比特位图上指向该逻辑地址所指示的逻辑子块的各个子组之后,可以继续根据该各个子组中每个比特的取值确定该子组所指向的逻辑子块上的数据所在的I/O栈中的层。
对于每个子组,在确定了I/O栈中该子组所指向的逻辑子块上的数据所在的层后,可以从该层中查找该子组所指向的逻辑子块上的数据。具体到该层,可以根据该数据的逻辑地址查找该层中的数据索引,确定该数据的元数据,进而从该元数据的指示的位置处读取该数据。
举例来说,对于第一组比特中的第二个子组来说,若该子组中包括三个比特,分别对应该I/O栈中的第一层(写缓存)、第二层(读缓存)以及第三层(硬盘缓存)。若该子组中的三个比特的取值为100,则说明该子组所指向的逻辑子块上的数据位于写缓存,可以从该写缓存中读取该数据。若该子组中的三个比特的取值为010,则说明该子组所指向的逻辑子块上的数据位于读缓存,可以从该读缓存中读取该数据。若该子组中的三个比特的取值为000,则说明该子组所指向的逻辑子块上的数据并不位于该I/O栈中的前三层,而是位于第四层容量层中,可以从该容量层中读取该数据。若该子组中的三个比特的取值为110,则说明该子组所指向的逻辑子块上的数据存储在该I/O栈中的前两层。由于数据写入存储系统100时,会优先会写入到该I/O栈的第一层,该逻辑子块上最新写入的数据在该I/O栈中的第一层。
形式二、计数器(counter)组。
如图3B所示,计数器组的示意图,在该计数器组中包括多组(group)计数器,每组计数器能够指向至少一个逻辑块,每组计数器中包括多个子组(grain),每个子组中包括多个计数器,每个子组指向逻辑块中的一个逻辑子块,一组计数器中的不同子组所指向的逻辑子块不同,每个子组中计数器的数量可以等于I/O栈中层的总数,也可以等于I/O栈中层的总数减一。
一个子组中的一个计数器对应I/O栈中的一层,不同计数器对应I/O栈中的不同层。举例来说,一个子组中的多个计数器按照I/O栈自上而下的顺序依次对应I/O栈中的一层,也即第一个计数器对应I/O栈中的第一层(如对应写缓存),第二个计数器对应I/O栈中的第二层(如对应读缓存),第三个计数器对应I/O栈中的第三层(如对应硬盘缓存)。第四个计数器对应I/O栈中的第四层(如对应容量层)。
对于该子组中一个计数器,当该计数器的取值为空值或0时,可以指示该逻辑子块中的数据不在该层,当该计数器的取值非空或者非0整数时,可以指示该逻辑子块中的数据位于该层,该计数器上的具体值能够表示该逻辑子块中的数据被更新的次数。例如,当第一个计数器的取值非0时,可以表示该子组所指向的逻辑子块上的数据位于写缓存,当第一个计数器的取值为0或空值时,可以表示该子组所指向的逻辑子块上的数据不在写缓存。同样的,当第二个计数器的取值非0时,可以表示该子组所指向的逻辑子块上的数据位于读缓存,当第二个计数器的取值为0或空值时,可以表示该子组所指向的逻辑子块上的数据不在读缓存。同样的,当第三个计数器的取值非0时,可以表示该子组所指向的逻辑子块上的数据位于硬盘缓存,当第三个计数器的取值为0或空值时,可以表示该子组所指向的逻辑子块上的数据不在硬盘缓存。同样的,当第四个计数器的取值非0时,可以表示该子组所指向的逻辑子块上的数据位于容量层,当第四个计数器的取值为0或空值时,可以表示该子组所指向的逻辑子块上的数据不在容量层。
由于在I/O栈中会存在数据流动,如将I/O栈中上一层的数据迁移到下一层,又如数据从I/O栈中的一层流出,流出的数据再流入到I/O栈中的另一层。I/O栈中还存在数据多次写入同一个逻辑地址的情况,例如,在I/O栈中允许向同一个逻辑地址多次写入数据,最近一次写入的数据会覆盖之前写入的数据。I/O栈中还存在数据淘汰,如将I/O栈中某一层中不活跃的数据删除,或将I/O栈中某一层中被覆盖的数据删除。
利用该计数器的取值可以记录该I/O栈在该层上发生的数据流动、数据写入以及数据淘汰。以一个子组中的第一个计数器为例,该第一个计数器可以对应该I/O栈中的第一层,第一个计数器的值为1,表明该子组所指向的逻辑子块中的数据位于I/O栈中的第一层。当I/O栈中第一层的数据的数据量达到阈值W时,第一层的数据可以迁移到第二层,此时第一个计数器的值会减一,表明该子组所指向的逻辑子块中的数据不在第一层中。仍以一个子组中的第一个计数器为例,该计数器当前的取值为1,之后进行了两次数据写入过程,写入的数据均写入到了该子组所指向的逻辑子块中,那么,在第一次数据写入时,第一个计数器的值会增一,变为2。在第二次数据写入时,第一个计数器的值会再增一,变为3。第一个计数器的值变为2或3,可以表明在该子组所指向的逻辑子块中先后共写入2次数据或3次数据。以此时第一个计数器的值变为3为例,当在后续在进行数据淘汰时,若发现该子组所指向的逻辑子块中前两次写入的数据是需要被覆盖的数据,则会删除该子组所指向的逻辑子块中前两次写入的数据,删除了该子组所指向的逻辑子块中前两次写入的数据后,第一个计数器的值变为1。
需要说明的是,在实际应用中,一个子组也可以不设置对应于I/O栈中最后一层的计数器。在这种情况下,该子组中各个计数器对应该I/O栈中除最后一层之外的其他层,当该子组中的所有计数器均为0或空值时,也即说明该子组所指向的逻辑子块中的数据并不位于该I/O栈中除最后一层之外的其余层,进一步可以说明,该子组所指向的逻辑子块中的数据只能位于该I/O栈中最后一层。
利用逻辑地址确定一组或多组计数器,以及从该一组或组计数器组中找到一个或多个子组的方式,与形式一种利用逻辑地址确定一组或多组比特,以及从该一组或组比特中找到一个或多个子组的方式类似,具体可以参见前述说明,此处不再赘述。
从上述说明可以看出,计数器组与比特位图所能描述的信息基本相同,计数器组所能描述的信息更加丰富,通过计数器组中各个计数器的值可以确定该计数器对应的层中数据流动、写入以及淘汰情况。这里以两个简单的例子对计数器组的优势进行说明:
例子1:在确定全局索引中逻辑地址所属的逻辑块的一个或多个字符块(如一组或多组比特,一组或多组计数器)时,采用哈希计算的方式将逻辑地址映射到字符块。不同的逻辑地址,通过哈希计算后,哈希值可能相同,产生哈希冲突,会将两个不同的逻辑地址映射到相同的字符块。这种情况下所映射到的字符块的取值(也即各个子组中字符子块的取值)实际上需要表征该两个逻辑地址所属的逻辑块中的数据位于I/O栈的哪一层。
为了便于理解,这里以两个逻辑地址分别为LBA1和LBA2、以及全局索引中该两个逻辑地址所映射到的字符块为字符块A为例,这里仅以该字符块A中每个子组中的第一个字符子块a的取值做相关说明,其他字符子块a的取值的情况与第一个字符子块的取值方式类似。
当向逻辑地址LBA1中写入数据,数据会优先写入到I/O栈的第一层,若字符子块a为一个比特,该比特的取值会变为1。若字符子块为一个计数器,该计数器的取值也会变为1。之后,若向逻辑地址LBA2中写入数据,数据也会优先写入到I/O栈的第一层,若字符子块a为一个比特,该比特的取值仍保持1。若字符子块a为一个计数器,该计数器的取值将由1增加到2。从这里可以看出,该计数器的取值能够较为清楚的记录数据写入I/O栈的第一层的次数。这种情况下,全局索引以比特位图或计数器组形式存在,均能够准确地指示出逻辑地址LBA1或LBA2所属的逻辑块中的数据位于I/O栈的第一层。
但是,之后,若逻辑地址LBA1所属逻辑块中的数据发生了数据流动,从I/O栈的第一层流动到I/O栈的第二层,若字符子块a为一个比特,该比特的取值会从1变为0,该比特的下一个比特(也即与I/O栈的第二层对应的比特)会从0变为1。若字符子块a为一个计数器,该计数器的取值会从2变为1,该计数器的下一个计数器(也即与I/O栈的第二层对应的计数器)会从0变为1。
当需要查询逻辑地址LBA2中的数据时,若全局索引以比特位图的形式存在,由于与I/O栈的第一层对应的比特的取值为0,其下一个比特的取值为1,经过查询全局索引确定逻辑地址LBA2中的数据位于I/O栈的第二层。而实际上逻辑地址LAB2中的数据并未发生流动,仍位于I/O栈的第一层,这样容易导致后续的数据读取出现问题,无法从该I/O栈的第二层中读取LBA2中的数据。若全局索引以计数器组的形式存在,由于与I/O栈的第一层对应的计数器的取值为1,经过查询全局索引确定逻辑地址LBA2中的数据位于I/O栈的第一层,与I/O栈中逻辑地址LAB2中的数据所在的层一致,后续可以准确的读取逻辑地址LBA2中的数据。
当需要查询逻辑地址LBA1中的数据时,若全局索引以比特位图的形式存在,由于与I/O栈的第一层对应的比特的取值为0,其下一个比特的取值为1,经过查询全局索引确定逻辑地址LBA1中的数据位于I/O栈的第二层。与I/O栈中逻辑地址LAB1中的数据所在的层一致,可以准确读取数据。若全局索引以计数器组的形式存在,由于与I/O栈的第一层对应的计数器的取值为1,经过查询全局索引确定逻辑地址LBA1中的数据位于I/O栈的第一层,虽然与I/O栈中逻辑地址LAB1中的数据所在的层不一致,但在后续数据读取的过程中,虽然在I/O栈的第一层查询不到逻辑地址LBA1中的数据,但是之后,可以按照I/O栈的层的顺序遍历,能够在第二层查询到逻辑地址LBA1中的数据,逻辑地址LBA1中的数据仍能被准确读取。
从这里可以看出,该计数器的取值除了能清楚的记录I/O栈的第一层中数据的流动状态,还能够在一定程度上解决哈希冲突问题,保证数据读取准确性。
例子2:仍以字符子块a以及LBA1为例,在追加写的场景中,当第一次向逻辑地址LBA1中写入数据,数据会优先写入到I/O栈的第一层,若字符子块a为一个比特,该比特的取值为1。若字符子块a为一个计数器,该计数器的取值也是1。之后,若再次向逻辑地址LBA1中写入数据,以覆盖之前的写入的数据,数据也会优先写入到I/O栈的第一层,若字符子块a为一个比特,该比特的取值仍保持1。若字符子块a为一个计数器,该计数器的取值将由1增加到2。在进行数据淘汰时,会将第一次写入的数据从存储介质中删除,在数据淘汰时,可以更新全局索引。若字符子块a为一个比特,该比特的取值会从1变为0。若字符子块a为一个计数器,该计数器的取值会从2变为1。而实际上,逻辑地址LBA1中数据所在的层仍为第一层,当字符子块a为比特时,取值有存在误差的可能性,可见,以计数器组形式存在的全局索引,可以准确的记录I/O栈中逻辑地址LBA1中数据所在的层。
但相对比特位图来说,计数器组中的一个计数器会占用多个比特,利用该多个比特来表征不同的数值,这样也使得计数器组所占用的空间与比特位图相比更大。
在本实施例中,可采用计数器组的方式实现全局索引,也可采用比特位图的方式实现全局索引,还可以两种方式都适用。下面对结合附图对本申请实施例提供的数据访问方法进行说明,在不同的场景中,本申请实施例所提供的数据访问方法的执行主体会不同。例如,可以由图1所示的存储系统100中存储设备110的处理器112来执行数据访问方法,也可以由存储系统100中存储设备110的网卡114来执行数据访问方法。下面对这两种可能的情况进行说明:
场景一、存储系统100中存储设备110的处理器112执行本申请实施例提供的数据访问方法。
如图4所示,为本申请提供的一种数据访问方法,该方法包括:
步骤401:处理器112接收数据写入请求,该数据写入请求用于请求写入目标数据,该数据写入请求中携带有目标数据以及目标数据的逻辑地址。逻辑地址可以包括起始逻辑地址、数据长度(length)。数据的起始逻辑地址可以用逻辑块地址(logic block address,LBA)和逻辑单元号(logical unit number,LUN)表示。
该数据写入请求可以是客户端设备200直接发送给存储设备110的。该数据写入请求也可以是存储系统100中其他存储设备110发送给该存储设备110的,如存储系统100中存在用于管理该存储设备110的设备,该设备能够为数据分配存储设备110,还能够指示存储设备110将数据写入到该存储设备110中。当该设备确定需要在该存储设备110中写入目标数据时,可以向该存储设备110发送数据写入请求。
步骤402:存储设备110的处理器112根据该数据写入请求,将目标数据写入到该逻辑地址所指示的位置。
处理器112在将目标数据写入到逻辑地址所指示的位置时,可以优先将目标数据写入到I/O栈中的第一层,例如可以优先写缓存中。
处理器112在写入到I/O栈中的第一层中,为该目标数据创建索引,目标数据的索引能够指示目标数据的逻辑地址与该目标数据的元数据之间的对应关系。该目标数据的元数据能指示该层中该目标数据的物理地址。
步骤403:处理器112更新全局索引,更新后全局索引能够指示I/O栈中该目标数据所在的层。
处理器112可以根据该目标数据的逻辑地址可以确定该全局索引中指向该逻辑地址的逻辑块的字符块以及指示该逻辑块中逻辑子块的子组。例如处理器112可以在哈希表中查询目标数据的逻辑地址所对应的字符块以及字符块中的子组。由于处理器112会优先将目标数据存储在I/O栈中的第一层,处理器112可以设置指示该逻辑块中逻辑子块的子组中I/O栈中的第一层对应的字符子块的具体取值,使得设置后的字符子块的取值能够指示子组中I/O栈中的第一层中存储有数据。
当全局索引以比特位图的形式存在时,处理器112在更新全局索引时,处理器112可以根据该目标数据的逻辑地址确定指示该逻辑地址所属的逻辑块的一组或多组比特,之后,再根据该逻辑地址在该逻辑块中的偏移以及目标数据的数据长度确定该逻辑地址所指示的逻辑子块,进而确定比特位图中指向该逻辑子块的各个子组。由于处理器112优先将该目标数据存储在I/O栈中的第一层,处理器112可以将指向该逻辑子块的各个子组中的第一个比特(也即对应I/O栈的第一层的比特)的取值设置为1,以指示目标数据存储在该I/O栈的第一层。
当全局索引以计数器组的形式存在时,处理器112在更新全局索引时,处理器112可以根据该目标数据的逻辑地址确定指示该逻辑地址所属的逻辑块的一组或多组计数器,之后,再根据该逻辑地址在该逻辑块中的偏移以及目标数据的数据长度确定该逻辑地址所指示的逻辑子块,进而确定比特位图中指向该逻辑子块的各个子组。由于处理器112优先将该目标数据存储在I/O栈中的第一层,处理器112可以将指向该逻辑子块的各个子组中的第一个计数器(也即对应I/O栈的第一层的计数器)的取值增1,以指示在该I/O栈的第一层写入了目标数据。
本申请实施例并不限定步骤402以及步骤403执行的前后顺序,也就是说,处理器112可以先将目标数据写入。在写入目标数据之后,处理器112更新全局索引。处理器112也可以先更新全局索引,再将目标数据写入。无论是目标数据的写入,还是全局索引的更新,处理器112均需要通过目标数据的逻辑地址来实现的,目标数据的写入以及全局索引的更新是两个相对独立的过程,之间没有直接的关联关系,故而在本申请实施例中并不特别强调步骤402以及步骤403执行的前后顺序。
在本申请实施例中,处理器112可以先更新全局索引(先执行步骤403),之后再将目标数据写入到逻辑地址指示的存储位置(再执行步骤402)。处理器112先更新全局索引能够提前将I/O栈中目标数据所在的层更新到全局索引中,这样若处理器112接收数据写入请求之后很短时间内接收到用于请求目标数据的数据读取请求,由于之前先执行了全局索引的更新,处理器112能够根据更新后的全局索引准确的确定出I/O栈中目标数据所在的层。
步骤404:处理器112反馈数据写入响应,指示目标数据已成功写入。
步骤401~步骤404即为数据写入流程,除了数据写入流程,处理器112还可以执行其他数据处理流程,例如数据流动、数据淘汰等。
例如,当需要将I/O栈中的某一层的存储介质中存储的数据迁移到下一层存储介质中(也即对I/O栈中的某一层的存储介质进行刷盘)时,处理器112可以将该层中存储介质中的数据迁移至下一层存储介质,在完成数据迁移之后,处理器112可以更新全局索引。
当全局索引以比特位图的形式存在时,处理器112在更新全局索引时,处理器112可以将该全局索引中与I/O栈中的该层对应的比特设置为0,以表征该层的存储介质已不存在数据,将该全局索引中与I/O栈中的该层的下一层对应的比特设置为1,以表征该层的下一层的存储介质中存储有数据。
当全局索引以计数器组的形式存在时,处理器112在更新全局索引时,处理器112可以将该全局索引中与I/O栈中的该层对应的计数器的取值减1,以表征该层的存储介质中的数据发生了一次迁移,将该全局索引中与I/O栈中的该层的下一层对应的计数器的取值加1,以表征该层的下一层的存储介质中迁入了新的数据。
又例如,处理器112也可以将I/O栈中的某一层中读取频率较高的数据迁移到I/O栈中的较高层中,如读缓存所在的第二层。处理器112可以控制该层中存储介质中的读取频率较高的数据流出,控制该数据流入第二层的存储介质。处理器112还可以更新全局索引。处理器112更新全局索引的操作可以在数据流出之后,数据流入第二层之前执行。
当全局索引以比特位图的形式存在时,处理器112在更新全局索引时,处理器112可以将该全局索引中该数据的逻辑地址所指向的子组中与I/O栈中的该层对应的比特设置为0,以表征该层的存储介质已不存在该数据,将该全局索引中数据的逻辑地址所指向的子组中与I/O栈中的第二层对应的比特设置为1,以表征该I/O栈中的第二层的存储介质中存储有该数据。
当全局索引以计数器组的形式存在时,处理器112在更新全局索引时,处理器112可以将该全局索引中数据的逻辑地址所指向的子组中与I/O栈中的该层对应的计数器的取值减1,以表征该层的存储介质中的数据发生了一次流出,将该全局索引中数据的逻辑地址所指向的子组中与I/O栈中第一层对应的计数器的取值加1,以表征该I/O栈中的第一层的存储介质中流入了新的数据。
又例如,处理器112也可以将I/O栈中的某一层中无效数据删除,这里的无效数据可以为追加写的场景中被覆盖的数据,也可以是一些读取频率较低的数据。处理器112可以将该层中存储介质中的数据迁出并删除,处理器112还可以更新全局索引。
当全局索引以比特位图的形式存在时,处理器112在更新全局索引时,处理器112可以将该全局索引中数据的逻辑地址所指向的子组中与I/O栈中的该层对应的比特设置为0,以表征该层的存储介质已不存在该数据。
当全局索引以计数器组的形式存在时,处理器112在更新全局索引时,处理器112可以将该全局索引中数据的逻辑地址所指向的子组中与I/O栈中的该层对应的计数器的取值减1,以表征该层的存储介质中的数据进行了一次淘汰。
除了数据写入流程、数据流动以及数据淘汰,处理器112还可以执行数据读取流程,具体可以参见步骤405~步骤408。
步骤405:处理器112接收数据读取请求,该数据读取请求用于请求读取目标数据,该数据写入请求中携带有目标数据的逻辑地址。
步骤406:处理器112根据该目标数据的逻辑地址查询全局索引,确定I/O栈中该目标数据所在的层。
处理器112可以根据该目标数据的逻辑地址确定该全局索引中执行该逻辑地址所属的逻辑块的字符块,之后再根据该逻辑地址在该逻辑块中的偏移以及该目标数据的数据长度确定该字符块中指向该逻辑地址所指示的逻辑子块的子组。处理器112根据子组中各个字符子块的取值确定该目标数据所在的层。
当全局索引以比特位图的形式存在时,处理器112根据该目标数据的逻辑地址确定指示该逻辑地址所属的逻辑块的一组或多组比特,之后,再根据该逻辑地址在该逻辑块中的偏移以及目标数据的数据长度确定该逻辑地址所指示的逻辑子块,进而确定比特位图中指向该逻辑子块的各个子组。处理器112可以确定指向该逻辑子块的各个子组中的各个比特的取值,确定比特的取值为1所对应的层为该目标数据所在的层。
需要说明的是,在比特位图中每个子组中未设置与I/O栈中最后一层对应的比特的情况下,若指向该逻辑子块的各个子组中的各个比特的值均为0,处理器112可以确定该目标数据所在的层为该I/O栈中最后一层。
当全局索引以计数器组的形式存在时,处理器112根据该目标数据的逻辑地址确定指示该逻辑地址所属的逻辑块的一组或多组计数器,之后,再根据该逻辑地址在该逻辑块中的偏移以及目标数据的数据长度确定该逻辑地址所指示的逻辑子块,进而确定比特位图中指向该逻辑子块的各个子组。处理器112可以确定指向该逻辑子块的各个子组中的各个计数器的取值,确定计数器的取值非0所对应的层为该目标数据所在的层,若一个子组中存在多个计数器的值非0,说明逻辑子块中的数据发生了多次数据写入,最新写入的目标数据所在的层为多个非0的计数器对应的层中的最高层。
需要说明的是,在计数器组中每个子组中未设置与I/O栈中最后一层对应的计数器的情况下,若指向该逻辑子块的各个子组中的各个计数器的值均为0,处理器112可以确定该目标数据所在的层为该I/O栈中最后一层。
步骤407:处理器112在确定了I/O栈中该目标数据所在的层后,可以直接根据该目标数据的逻辑地址从该层中读取该目标数据。
处理器112可以根据该目标数据的逻辑地址查询该层中该目标数据的索引,确定该目标数据的元数据,之后从元数据所指示的位置读取该目标数据。
步骤408:处理器112反馈数据读取响应,该数据读取响应中包括该目标数据。
场景二、存储系统100中节点的网卡114执行本申请实施例提供的数据访问方法。
如图5所示,为本申请提供的一种数据访问方法,在该方法中由图1所示的存储设备110的网卡114执行数据写入流程以及数据读取流程,网卡114执行数据写入流程以及数据读取流程的方式与处理器112执行数据写入流程以及数据读取流程的方式类似,区别在于执行主体不同,具体可以参见图4所示的实施例中的相关说明,此处不再赘述。
步骤501:存储设备110的网卡114接收数据写入请求。
步骤502:网卡114根据该数据写入请求,将目标数据写入到该逻辑地址所指示的存储位置。
网卡114在将目标数据写入到逻辑地址所指示的存储位置时,可以优先将目标数据写入到I/O栈中的第一层,例如可以优先写缓存中。
步骤503:网卡114更新全局索引,更新后全局索引能够指示I/O栈中该目标数据所在的层。
步骤504:网卡114反馈数据写入响应,指示目标数据已成功写入。
步骤501~步骤504即为数据写入流程,除了数据写入流程网卡114还可以执行数据读取流程,具体可以参见步骤505~408。
步骤505:网卡114接收数据读取请求,该数据读取请求用于请求读取目标数据,该数据写入请求中携带有目标数据的逻辑地址。
步骤506:网卡114根据该目标数据的逻辑地址查询全局索引,确定I/O栈中该目标数据所在的层。
步骤507:网卡114在确定了I/O栈中该目标数据所在的层后,可以直接根据该目标数据的逻辑地址从该层中读取该目标数据。
网卡114可以根据该目标数据的逻辑地址查询该层中该目标数据的索引,确定该目标数据的元数据,之后从元数据指示的位置读取该目标数据。
步骤508:网卡114反馈数据读取响应,该数据读取响应中包括该目标数据。
由存储设备110的网卡114对数据写入请求以及数据读取请求进行处理,能够有效减少对存储设备110的处理器112的占用,也能够有效提高数据写入流程以及数据读取流程的效率。
在这种场景中,网卡114中也可以设置有缓存,网卡114在处理数据写入请求时,可以优先将目标数据写入网卡114中的缓存。这种情况下,可以将网卡114中的缓存作为I/O栈的一层,增加到I/O栈中。例如,将网卡114的缓存作为I/O栈的第一层,将存储设备110中的写缓存、读缓存、硬盘缓存、容量层依次作为I/O栈的第二层、第三层、第四层、第五层。I/O栈中数据的写入以及流动顺序依旧按照自上而下的方向进行,与前述说明中提及的I/O栈不同的是I/O栈中增加了新的一层。
在场景二中,网卡114可以执行数据写入流程以及数据读取流程,处理器112可以执行其他数据处理流程,例如数据流动、数据淘汰等。关于处理器112执行其他数据处理流程的方式可以参见图4所示的实施例中的说明,此处不再赘述。
在另一些场景中,存储系统100的I/O栈中的一层或多层中数据的索引支持单边RDMA访问或直通访问,也即客户端设备200可以通过单边RDMA访问或直通访问的方式读取该一层或多层中数据的元数据。
支持单边RDMA访问是指该一层或多层中数据的索引存储在存储设备110的内存中,客户端设备200侧记录该一层或多层中数据的索引的起始地址。当客户端设备200需要读取其中一层某一个数据的元数据时,客户端设备200可以根据该层中数据的索引的起始地址以及该数据的逻辑地址计算该数据的元数据的内存地址,客户端设备200可以基于该元数据的内存地址,通过获单边RDMA获得数据的元数据。
支持直通访问是指该一层或多层中的存储介质为持久化存储器,这里以持久化存储器为硬盘为例。该一层或多层中存储的数据的索引存储在存储设备110的硬盘。客户端设备200侧记录该一层或多层中数据的索引的起始地址。当客户端设备200需要读取其中一层某一个数据的元数据时,客户端设备200可以根据该层中数据的索引的起始地址以及该数据的逻辑地址计算在硬盘中该数据的元数据的存储地址,客户端设备200可以基于该元数据的存储地址通过直通访问从硬盘中获得数据的元数据。这里所谓直通访问指示客户端设备200通过存储设备110的网卡114以及硬盘中的控制器直接读取硬盘中存储的数据的方式,在直通访问过程中无需存储设备110的处理器112参与。
在这种场景中,本申请实施例提供的一种数据访问方法,在该数据访问方式中,存储设备110的处理器112无需参与。客户端设备200需要读取目标数据时,可以通过单边RDMA访问或直通访问的方式从该一层或多层中读取该目标数据的元数据,客户端设备200还可以通过单边RDMA访问全局索引中指向目标逻辑子块的目标子组中的部分或全部字符子块,其中目标逻辑子块为该目标数据的逻辑地址所指示的逻辑子块。客户端设备200可以根据所访问的部分或全部字符子块的具体取值来确定I/O栈中该目标数据所在的层,进而确定所读取的目标数据的元数据是否为有效,也即该目标数据的元数据所指示的存储地址上是否存储有该目标数据。在确定所读取的目标数据的元数据有效的情况下,若该目标数据的元数据指示目标数据位于内存中时,可以通过单边RDMA访问的方式读取该目标数据;若该目标数据的元数据指示目标数据位于硬盘中时,可以通过直通访问的方式读取该目标数据。下面对这种场景下的数据访问方法进行说明。
场景三、客户端设备200通过单边RDAM或直通访问的方式访问目标数据。
在本申请实施例中是以客户端通过单边RDMA的方式访问目标数据的方式进行说明,单边RDAM或直通访问的方式的不同仅是由于目标数据或数据的索引所在的存储介质不同导致的,无论是通过单边RDAM从存储系统100中读取目标数据,还是通过直通访问的方式从存储系统100中访问目标数据的方式,基本流程是相同的,区别仅是在于当具体读取目标数据的元数据、或目标数据时所采用的方式。为了方便说明,将存储系统100的I/O栈中支持单边RDMA访问或直通访问的一层称为直通层,也即将存储系统100的I/O栈中可以存在一个或多个直通层。
如图6所示,为本申请提供的一种数据访问方法,该方法包括:
步骤601:存储设备110将全局索引的内存地址通知给客户端设备200。
在存储设备110侧全局索引可以存储在存储设备110的内存中,存储设备110可以将全局索引在内存中的起始地址以及该全局索引的长度作为全局索引的内存地址,通知给客户端设备200。
步骤602:客户端设备200可以向存储设备110发起第一单边RDMA,第一单边RDMA用于读取存储系统100的I/O栈中该目标直通层中目标数据的元数据。该目标直通层为一个或多个直通层中的一层或多层。
步骤603:客户端设备200可以向存储设备110发起第二单边RDMA,第二单边RDMA用于从存储设备110获取全局索引中指向该目标逻辑子块的各个子组中的全部或部分字符子块。
这里部分字符子块可以不包括与该目标直通层对应的字符子块,例如客户端设备200可以获取各个子组中与该目标直通层之上的各层对应的字符子块。
本申请实施例并不限定客户端设备200向存储设备110发起第一单边RDMA以及第二单边RDMA的先后顺序。客户端设备200可以在较短时间内向存储设备110发起第一单边RDMA和第二单边RDMA,也即可以同步发起第一单边RDMA以及第二单边RDMA。
下面分别对这第一单边RDMA以及第二单边RDMA进行说明:
(1)、第一单边RDMA—读取存储系统100的I/O栈中该目标直通层中目标数据的元数据。
客户端设备200侧记录该目标直通层中数据的索引的起始地址。当客户端设备200需要读取目标直通层中目标数据的元数据时,客户端设备200可以根据该目标直通层中数据的索引的起始地址以及该数据的逻辑地址计算该数据的元数据的内存地址。这里并不限定客户端设备200根据该目标直通层中数据的索引的起始地址以及该目标数据的逻辑地址计算该目标数据的元数据的内存地址的方式,例如可以对该目标数据的逻辑地址查询哈希表、或作用哈希函数、进行学习型索引的方式计算目标数据的元数据的内存地址。
客户端设备200在确定了该目标数据的元数据的内存地址之后,可以基于RDMA向存储设备110的网卡114发起第一请求,该第一请求用于请求读取该目标数据的元数据,该第一请求中携带有目标数据的元数据的内存地址。
存储设备110的网卡114在接收到第一请求后,存储设备110的网卡114可以处理该第一请求,根据该目标数据的元数据的内存地址获取该目标数据的元数据,将该目标数据的元数据携带在第一响应中,将第一响应反馈给客户端设备200。
根据对I/O栈的组成的说明,可知对于同一个逻辑子块,数据可以存储I/O栈中的不同层中。又由于同一逻辑子块中数据可以在I/O栈中的不同层流入、流出,这样可能会导致在I/O栈中的不同层中对该逻辑子块中的数据都进行了索引,也即在I/O栈中的不同层中均保留了该逻辑子块中的数据的元数据。故而,本申请实施例并不限定目标直通层的数量,允许客户端设备200通过第一单播RDMA获取多个目标直通层中目标数据的元数据。当目标直通层的数量为一时,客户端设备200可以发起一次第一单边RDMA,以获取该目标直通层中目标数据的元数据。当存在多个目标直通层时,客户端设备200可以发起多次第一单边RDMA,每次第一单边RDMA获取其中一个目标直通层中目标数据的元数据。
但这些目标直通层中目标数据的元数据可能是无效的,也即该目标数据的元数据所指示的物理地址上存储的数据并非最新写入的数据。为了能够验证目标直通层中目标数据的元数据的有效性,客户端设备200可以执行第二单边RDMA。
(2)、第二单边RDMA—存储设备110获取全局索引中指向该目标数据的逻辑地址所指示的逻辑子块的各个子组。
客户端设备200可以根据该目标数据的逻辑地址确定该全局索引中指向该目标数据的逻辑地址所指示的逻辑子块的各个子组在全局索引中的位置。
在确定该各个子组在全局索引中的位置后,由于存储设备110已将全局索引在存储设备110中的内存地址告知了客户端设备200,客户端设备200可以根据该全局索引的内存地址确定该各个子组的内存地址。
以每个逻辑块大小为256KB,逻辑块中包括32个逻辑子块,每个逻辑子块的大小为8KB,每组比特中包括32个子组为例。若目标数据的LBA所指示的位置为1MB+520KB,可以确定指向该逻辑地址所属的逻辑块的两个字符块。例如,该两个字符块为全局索引中的第三个和第四个字符块。之后再根据该逻辑地址在该逻辑块中的偏移以及目标数据的数据长度确定该逻辑地址所指示的32个逻辑子块,例如,确定第三个和第四个字符块中指向该32个逻辑子块的32个子组。在全局索引中,指向该32个逻辑子块的子组为指向该逻辑块的第三个字符块中的第二个子组到第32个子组子块以及第四个字符块中的第一个子组。该32个子组的起始位置是全局索引中偏移两个字符块和一个子组长度的位置,该32个子组的长度为一个字符块的长度。
以全局索引中每个子组中设置与I/O层的层对应的字符子块的总数为N,若全局索引以比特位图的形式存在,一个子组的大小等于N比特。一个字符块为一组比特,一组比特的大小为32*N比特。该32个子组位于全局索引中偏移起始地址32*N+N比特、长度为32*N比特的位置处。
若全局索引以计数器组的形式存在,若每个计数器占用M个比特,一个子组的大小等于N*M比特。一个字符块为一组计数器,一组计数器的大小为32*N*M比特。该32个子组位于全局索引中偏移起始地址32*N*M+N*M比特、长度为32*N*M比特的位置处。
由此确定了该各个子组在全局索引中的位置。之后,客户端设备200可以根据该全局索引的内存地址确定该各个子组的内存地址。例如,客户端设备200可以将全局索引的起始地址偏移两个字符块和一个子组长度后作为该各个子组的起始地址,该各个子组的长度为一个字符块的长度。该各个子组的起始地址和该各个子组的长度可以作为该各个子组的内存地址。又例如,客户端设备200也可以将全局索引的起始地址偏移两个字符块和一个子组长度后作为该各个子组的起始地址,将全局索引的起始地址偏移三个字符块和一个子组长度后作为该各个子组的终止地址,该各个子组的起始地址和终止地址可以作为该各个子组的内存地址。
若客户端设备200仅需获取该各个子组中的部分字符子块,获取该各个子组中除了与该目标直通层对应的字符子块的其余字符子块,客户端设备200还可以进一步对各个组的内存地址进行处理,将各个子组的内存地址去除与该目标直通层对应的字符子块的内存地址,获得该各个子组中部分字符子块的内存地址。
仍以目标数据的LBA所指示的位置为1MB+520KB,数据长度为256KB为例,若每个子组中包括P个字符子块,各个子组中与目标直通层对应的字符子块为最后一个字符子块,32个子组中部分字符子块的内存地址可以为32个地址段,该32个地址段的起始地址为全局索引的起始地址偏移两个字符块和一个子组长度后的地址,每个地址段的长度为P-1个字符子块的长度。每个地址段间隔一个字符子块的长度。
若全局索引以比特位图的形式存在,32个子组中部分字符子块的内存地址的起始位置位于全局索引中偏移起始地址32*N+N比特处共32个地址段,每个地址段的长度为P-1比特,每个地址段间隔1个比特。
若全局索引以计数器组的形式存在,若每个计数器占用M个比特,一个子组的大小等于N*M比特。一个字符块为一组计数器,一组计数器的大小为32*N*M比特。32个子组中部分字符子块的内存地址的起始位置位于全局索引中偏移起始地址32*N*M+N*M比特处,每个地址段的长度为(P-1)*M比特,每个地址段间隔M个比特。
客户端设备200在确定了该各个子组的内存地址之后,可以发起第二单边RDMA,从存储设备110获取该各个子组。客户端设备200可以基于RDMA向存储设备110的网卡114发起第二请求,该第二请求用于请求获取全局索引中该各个子组,该第二请求中携带各个子组的内存地址。
存储设备110的网卡114在接收到该第二请求后,可以根据该各个子组的内存地址,读取该各个子组,将该各个子组携带在第二响应中,将第二响应发送给客户端设备200。
客户端设备200在确定了该各个子组中部分字符子块的内存地址之后,可以发起第二单边RDMA,从存储设备110获取该各个子组中部分字符子块。客户端设备200可以基于RDMA向存储设备110的网卡114发起第三请求,该第二请求用于请求获取全局索引中该各个子组中的部分字符子块,该第二请求中携带该各个子组中的部分字符子块的内存地址。
存储设备110的网卡114在接收到该第三请求后,可以根据该各个子组中部分字符子块的内存地址,读取该各个子组中部分字符子块,将该各个子组中部分字符子块携带在第三响应中,将第三响应发送给客户端设备200。
步骤604:客户端设备200根据该各个子组或该各个子组中部分字符子块的具体取值校验目标直通层中目标数据的元数据的有效性。
客户端设备200可以根据该各个子组或确定该目标数据所在层是否为该目标直通层。
当全局索引以比特位图的形式存在,客户端设备200可以先确定该各个子组中除与该目标直通层对应的比特之外的比特是否为1,取值为1的比特所对应的层是否位于该目标直通层之上。若该各个子组中除与该目标直通层对应的比特之外的比特存在为1的比特,且取值为1的比特所对应的层位于该目标直通层之上,则说明最新写入在逻辑地址的目标数据位于取值为1的比特所对应的层中,目标直通层中目标数据的元数据的无效。
若该各个子组中存在为1的比特,且取值为1的比特所对应的层为该目标直通层。可选的,还存在取值为1的比特,该比特所对应的层位于该目标直通层之下,则说明最新写入在逻辑地址的目标数据位于目标直通层中,目标直通层中目标数据的元数据有效。
若该各个子组中除与该目标直通层对应的比特之外的比特不存在为1的比特,则说明最新写入在逻辑地址的目标数据位于目标直通层中,目标直通层中目标数据的元数据有效。
当全局索引以计数器组的形式存在,客户端设备200可以先确定该各个子组中除与该目标直通层对应的计数器之外的计数器是否非0,取值非0的计数器所对应的层是否位于该目标直通层之上。若该各个子组中除与该目标直通层对应的计数器之外的计数器存在非0的计数器,且取值非0的计数器所对应的层位于该目标直通层之上,则说明最新写入在逻辑地址的目标数据位于取值为1的计数器所对应的层中,目标直通层中目标数据的元数据的无效。
若该各个子组中存在非0的计数器,且取值非0的计数器所对应的层位于该目标直通层,可选的,还存在取值为1的其他计数器,该其他计数器所对应的层位于该目标直通层之下,则说明最新写入在逻辑地址的目标数据位于目标直通层中,目标直通层中目标数据的元数据有效。
若该各个子组中除与该目标直通层对应的计数器之外的计数器不存在非0的计数器,则说明最新写入在逻辑地址的目标数据位于目标直通层中,目标直通层中目标数据的元数据有效。
客户端设备200可以根据该各个子组中部分字符子块的具体取值确定该目标数据所在层是否为该目标直通层。
当全局索引以比特位图的形式存在,客户端设备200可以先确定该各个子组中部分比特(也即部分字符子块)是否为1,取值为1的比特所对应的层是否位于该目标直通层之上。若该各个子组中除与该目标直通层对应的比特之外的比特存在为1的比特,且取值为1的比特所对应的层位于该目标直通层之上,则说明最新写入在逻辑地址的目标数据位于取值为1的比特所对应的层中,目标直通层中目标数据的元数据无效。
若该各个子组中部分比特存在为1的比特,且取值为1的比特所对应的层位于该目标直通层之下,则说明最新写入在逻辑地址的目标数据位于目标直通层中,目标直通层中目标数据的元数据有效。
若该各个子组中部分比特不存在为1的比特,则说明最新写入在逻辑地址的目标数据位于目标直通层中,目标直通层中目标数据的元数据有效。
当全局索引以计数器组的形式存在,客户端设备200可以先确定该各个子组中部分计数器(也即部分字符子块)之外的计数器是否非0,取值非0的计数器所对应的层是否位于该目标直通层之上。若该各个子组中除与该目标直通层对应的计数器之外的计数器存在非0的计数器,且取值非0的计数器所对应的层位于该目标直通层之上,则说明最新写入在逻辑地址的目标数据位于取值为1的计数器所对应的层中,目标直通层中目标数据的元数据无效。
若该各个子组中部分计数器存在非0的计数器,且取值非0的计数器所对应的层位于该目标直通层之下,则说明最新写入在逻辑地址的目标数据位于目标直通层中,目标直通层中目标数据的元数据有效。
若该各个子组中部分计数器不存在非0的计数器,则说明最新写入在逻辑地址的目标数据位于目标直通层中,目标直通层中目标数据的元数据有效。
步骤605:若目标直通层中目标数据的元数据有效,客户端设备200利用目标数据的元数据,通过单边RDMA从存储设备110获取该目标数据。
也即客户端设备200可以基于RDMA向存储设备110的网卡114发送第四请求,该第四请求中携带目标直通层中目标数据的元数据。存储设备110的网卡114在接收带该第四请求后,可以根据目标直通层中目标数据的元数据确定该目标数据的物理地址,读取该目标数据,并将该目标数据通过第四响应反馈给客户端设备200。
若目标直通层中目标数据的元数据无效,客户端设备200可以采用如图4或5所示的实施例从存储设备110获取该目标数据。客户端设备200也可以采用双边RDMA从存储设备110获取目标数据。
图5和图6分别示出了由处理器112以及网卡来执行本实施例提供的数据访问方法,另外在本实施例中,还可以由不同于处理器112或者网卡的其他芯片来执行该方法。例如,该芯片可以是一个数据处理单元(data processing unit,DPU)。
为了能够进一步理解图6所示的实施例,介绍场景三中一种数据访问方法的具体实现方式。参见图7,在图7中,存储系统100中的I/O栈至少包括两层,这两层分别为写缓存和读缓存,存储设备110中的全局索引可以存储在内存中。在全局索引的每个子组中包括两个字符子块,第一个字符子块与写缓存对应,第二个字符子块与读缓存对应。全局索引在内存中表现为两种形式,一种为比特位图,另一种为计数器组。
步骤701:存储设备110将比特位图的内存地址通知给客户端设备200。
由于比特位图占用空间相对较小,后续存储设备110需要从客户端设备200读取比特位图的部分子组或部分比特时,也仅需要读取较小的空间,能够有效提升全局索引的读取效率。
步骤702:客户端设备200可以向存储设备110发起第一单边RDMA,第一单边RDMA中用于读取存储系统100的I/O栈中该读缓存中目标数据的元数据。
步骤703:客户端设备200可以向存储设备110发起第二单边RDMA,第二单边RDMA用于从存储设备110获取比特位图中指向该目标逻辑子块的各个子组中的第一个比特。
步骤704:客户端设备200根据该各个子组中第一个比特的具体取值校验读缓存中目标数据的元数据的有效性。
客户端设备200先确定该各个子组中第一个比特是否为1,若第一个比特为1,则说明目标数据位于写缓存中,读缓存中目标数据的元数据的无效。
若该各个子组中第一个比特为0,则说明最新写入在逻辑地址的目标数据位于读缓存中,目标直通层中目标数据的元数据有效。
步骤705:若读缓存中目标数据的元数据有效,客户端设备200利用目标数据的元数据,通过单边RDMA从存储设备110获取该目标数据。若读缓存中目标数据的元数据无效,客户端设备200可以采用如图4或5所示的实施例从存储设备110获取该目标数据。客户端设备200也可以采用双边RDMA从存储设备110获取目标数据。
基于与方法实施例同一发明构思,本申请实施例还提供了一种数据访问装置,该数据访问装置用于执行上述如图4、5以及6、7所示的方法实施例中所述处理器或网卡执行的方法,相关特征可参见上述方法实施例,此处不再赘述。如图8所示,所述数据访问装置800包括传输模块801、读取模块802;
传输模块801,用于接收数据读取请求,数据读取请求用于请求读取存储装置中存储的目标数据。传输模块801可以执行如图4所示的步骤405或图5所示的步骤505。
读取模块802,用于基于数据读取请求查询全局索引,全局索引用于指示I/O栈中目标数据所在的存储层;根据全局索引指示的存储层,读取目标数据。读取模块802可以执行如图4所示的步骤406~步骤408或图5所示的步骤506~步骤508。
在一种可能的实施方式中,数据访问装置800还包括写入模块803。
传输模块801可以接收数据写入请求,数据写入请求用于请求在存储系统中写入目标数据。传输模块801可以执行如图4所示的步骤401或图5所示的步骤501。
写入模块803可以根据数据写入请求所述请求写入的目标数据,更新全局索引,更新后全局索引用于指示I/O栈中目标数据所在的存储层。读取模块801可以执行如图4所示的步骤402~步骤404或图5所示的步骤502~步骤504。
在一种可能的实施方式中,数据读取请求包括目标数据的逻辑地址,读取模块802在基于数据读取请求查询全局索引时,可以根据目标数据的逻辑地址在全局索引中确定指向目标数据的逻辑地址的多个字符子块;根据多个字符子块中取值非零的字符子块确定I/O栈中目标数据所在的存储层。
在一种可能的实施方式中,字符子块为一个比特,比特的取值包括0或1,1表示目标数据位于字符子块对应的存储层中,0表示目标数据位于字符子块对应的存储层中。
在一种可能的实施方式中,字符子块为一个计数器,计数器为0或非零整数,所述非零整数用于指示所述目标数据位于所述字符字块对应的存储层中,所述非零整数还用于指示数据写入所述字符子块对应的存储层的次数,所述数据包括所述目标数据。
在一种可能的实施方式中,读取模块802根据目标数据的逻辑地址在全局索引中确定指向目标数据的逻辑地址的多个字符子块时,可以根据对目标数据的逻辑地址进行哈希操作的结果确定指向目标数据的逻辑地址的多个字符子块,哈希操作为查询哈希表或作用哈希函数。
在一种可能的实施方式中,读取模块802根据对目标数据的逻辑地址进行哈希操作的结果确定指向目标数据的逻辑地址的多个字符子块时,可以根据结果确定全局索引中指向目标数据的逻辑地址所属的逻辑块的字符块;之后根据目标数据的逻辑地址从字符块中确定指向目标数据的逻辑地址的多个字符子块。
在一种可能的实施方式中,字符块包括多个子组,每个子组与逻辑块中的一个逻辑子块对应,每个子组中包括多个字符子块,读取模块802可以根据目标数据的逻辑地址与目标数据的逻辑地址所属的逻辑块的之间偏移在字符块中的多个子组中确定目标子组,目标子组中的字符子块为指向目标数据的逻辑地址的多个字符子块。
在一种可能的实施方式中,全局索引以及目标数据的元数据位于存储装置中设备的内存中,传输模块801可以在客户端设备的第一指示下向客户端设备反馈全局索引以及目标数据的元数据,第一指示为基于RDMA传输的。该第一指示可以为图6所示的实施例中的第一请求以及第二请求,或为图6所示的实施例中的第一请求以及第三请求。
在一种可能的实施方式中,全局索引位于存储装置中设备的内存,目标数据的元数据位于存储装置中设备的持久化存储器中,传输模块801可以在客户端设备的第二指示下向客户端设备反馈全局索引,第二指示为基于RDMA传输的;以及在客户端设备的第三指示下从持久化存储器中获取目标数据的元数据,向客户端设备反馈目标数据的元数据。
在一种可能的实施方式中,目标数据位于存储装置中设备的内存中,传输模块801可以在客户端设备的第四指示下向客户端设备反馈目标数据,第四指示是根据目标数据的元数据发起的、基于RDMA传输的。该第四指示可以为图6所示的实施例中的第四请求。
在一种可能的实施方式中,目标数据位于存储装置中设备的持久化存储器中,传输模块801可以在客户端设备的第五指示下从向持久化存储器中获取目标数据,并向客户端设备反馈目标数据,第五指示根据目标数据的元数据发起的。
在一种可能的实施方式中,数据访问装置800还包括控制模块804,控制模块804可以控制I/O栈中的数据流动以及数据淘汰,以及根据I/O栈中的数据流动以及数据淘汰更新全局索引。
需要说明的是,本申请实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。在本申请的实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
上述实施例,可以全部或部分地通过软件、硬件、固件或其他任意组合来实现。当使用软件实现时,上述实施例可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载或执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以为通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集合的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质。半导体介质可以是固态硬盘(solid state drive,SSD)。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变形在内。

Claims (33)

1.一种存储系统,其特征在于,所述存储系统包括多个存储层和处理单元,每个存储层之间的读数据的时延不同,
所述处理单元,用于:
接收数据读取请求,以请求读取所述存储系统中存储的目标数据;
基于所述数据读取请求查询全局索引,所述全局索引中的第一索引项用于指示所述多个存储层中所述目标数据所在的存储层;
根据所述第一索引项指示的存储层,读取所述目标数据。
2.如权利要求1所述的存储系统,其特征在于,所述处理单元还用于:
接收数据写入请求以请求在所述存储系统中写入所述目标数据;
根据所述数据写入请求,在所述全局索引中记录所述第一索引项。
3.如权利要求1或2所述的存储系统,其特征在于,所述数据读取请求包括所述目标数据的逻辑地址,所述处理单元在基于所述数据读取请求查询全局索引时,具体用于:
根据所述逻辑地址在所述全局索引中确定指向所述目标数据的逻辑地址的多个字符子块,所述多个字符子块属于所述第一索引项;
根据所述多个字符子块的取值确定所述多个存储层中所述目标数据所在的存储层。
4.如权利要求3所述的存储系统,其特征在于,每个字符子块用于描述所述多个存储层中的一个存储层中是否存储数据,一个字符子块为一个比特,所述比特的取值包括0或1,所述1表示所述目标数据位于所述一个字符子块对应的存储层中,所述0表示所述目标数据不位于所述一个字符子块对应的存储层中。
5.如权利要求3所述的存储系统,其特征在于,每个字符子块用于描述所述多个存储层中的一个存储层中是否存储数据,一个字符子块为一个计数器,所述计数器的取值包括0或非零整数,所述0表示所述目标数据不位于所述一个字符子块对应的存储层中,所述非零整数用于指示所述目标数据位于所述一个字符子块对应的存储层中,所述非零整数还用于指示数据写入所述一个字符子块对应的存储层的次数,所述数据包括所述目标数据。
6.如权利要求3~5任一项所述的存储系统,其特征在于,所述处理单元根据所述目标数据的逻辑地址在所述全局索引中确定指向所述目标数据的逻辑地址的多个字符子块,具体用于:
根据对所述目标数据的逻辑地址进行哈希操作的结果确定指向所述目标数据的逻辑地址的多个字符子块,所述哈希操作为查询哈希表或作用哈希函数。
7.如权利要求7所述的存储系统,其特征在于,所述处理单元根据对所述目标数据的逻辑地址进行哈希操作的结果确定指向所述目标数据的逻辑地址的多个字符子块,具体用于:
根据所述结果确定所述全局索引中指向所述目标数据的逻辑地址所属的逻辑块的字符块;
根据所述目标数据的逻辑地址从所述字符块中确定指向所述目标数据的逻辑地址的多个字符子块。
8.如权利要求1~7任一项所述的存储系统,其特征在于,所述处理单元是数据处理器DPU。
9.如权利要求1~8任一项所述的存储系统,其特征在于,所述处理单元位于所述存储系统中的网卡中或位于中央处理器中。
10.如权利要求1~9任一项所述的存储系统,其特征在于,所述处理单元,还用于控制所述多个存储层中的数据流动以及数据淘汰,以及根据所述存储层中的数据流动以及数据淘汰更新所述全局索引。
11.如权利要求1~10任一项所述的存储系统,其特征在于,所述多个存储层包括性能层和容量层,所述性能层包括写缓存、读缓存和硬盘缓存中的一项或多项,所述容量层包括固态硬盘和机械硬盘中的一项或多项。
12.一种数据访问方法,其特征在于,所述方法应用于存储系统,所述存储系统包括多个存储层和处理单元,每个存储层之间的读数据的时延不同,所述方法,包括:
所述处理单元接收数据读取请求以读取所述存储系统中存储的目标数据;
所述处理单元基于所述数据读取请求查询全局索引,所述全局索引中的第一索引项用于指示所述多个存储层中所述目标数据所在的存储层;
所述处理单元根据所述第一索引项指示的存储层,读取所述目标数据。
13.如权利要求12所述的方法,其特征在于,所述方法还包括:
所述处理单元接收数据写入请求以请求在所述存储系统中写入所述目标数据;
所述处理单元根据所述数据写入请求,在所述全局索引中记录所述第一索引项。
14.如权利要求12或13所述的方法,其特征在于,所述数据读取请求包括所述目标数据的逻辑地址,所述处理单元基于所述数据读取请求查询全局索引,包括:
所述处理单元根据所述逻辑地址在所述全局索引中确定指向所述目标数据的逻辑地址的多个字符子块,所述多个字符子块属于所述第一索引项;
所述处理单元根据所述多个字符子块的取值确定所述多个存储层中所述目标数据所在的存储层。
15.如权利要求14所述的方法,其特征在于,每个字符子块用于描述所述多个存储层中的一个存储层中是否存储数据,一个字符子块为一个比特,所述比特的取值包括0或1,所述1表示所述目标数据位于所述一个字符子块对应的存储层中,所述0表示所述目标数据不位于所述一个字符子块对应的存储层中。
16.如权利要求14所述的方法,其特征在于,每个字符子块用于描述所述多个存储层中的一个存储层中是否存储数据,一个字符子块为一个计数器,所述计数器的取值包括0或非零整数,所述0表示所述目标数据不位于所述一个字符子块对应的存储层中,所述非零整数用于指示所述目标数据位于所述一个字符子块对应的存储层中,所述非零整数还用于指示数据写入所述一个字符子块对应的存储层的次数,所述数据包括所述目标数据。
17.如权利要求14~16任一项所述的方法,其特征在于,所述处理单元根据所述目标数据的逻辑地址在所述全局索引中确定指向所述目标数据的逻辑地址的多个字符子块,包括:
所述处理单元根据对所述目标数据的逻辑地址进行哈希操作的结果确定指向所述目标数据的逻辑地址的多个字符子块,所述哈希操作为查询哈希表或作用哈希函数。
18.如权利要求17所述的方法,其特征在于,所述处理单元根据对所述目标数据的逻辑地址进行哈希操作的结果确定指向所述目标数据的逻辑地址的多个字符子块,包括:
所述处理单元根据所述结果确定所述全局索引中指向所述目标数据的逻辑地址所属的逻辑块的字符块;
所述处理单元根据所述目标数据的逻辑地址从所述字符块中确定指向所述目标数据的逻辑地址的多个字符子块。
19.如权利要求12~18任一项所述的方法,其特征在于,所述方法还包括:
所述处理单元控制所述多个存储层中的数据流动以及数据淘汰;
所述处理单元根据所述多个存储层中的数据流动以及数据淘汰更新所述全局索引。
20.一种网卡,其特征在于,所述网卡位于所述存储系统中,所述网卡用于执行如权利要求12~19任一项所述的方法。
21.一种处理器,其特征在于,所述处理器位于所述存储系统中,所述处理器用于执行如权利要求12~19任一项所述的方法。
22.一种数据访问装置,其特征在于,所述数据处理装置位于存储系统中,所述存储系统还包括多个存储层,每个存储层之间的读数据的时延不同,所述数据访问装置包括传输模块、读取模块;
所述传输模块,用于接收数据读取请求,以读取所述存储系统中存储的目标数据;
所述读取模块,用于基于所述数据读取请求查询全局索引,所述全局索引中的第一索引项用于指示所述多个存储层中所述目标数据所在的存储层;根据所述第一索引项指示的存储层,读取所述目标数据。
23.如权利要求22所述的装置,其特征在于,所述数据访问装置还包括写入模块;
所述传输模块,还用于接收数据写入请求,请求在所述存储系统中写入所述目标数据;
所述写入模块,用于根据所述数据写入请求,在所述全局索引中记录所述第一索引项。
24.如权利要求22或23所述的装置,其特征在于,所述数据读取请求包括所述目标数据的逻辑地址,所述读取模块在基于所述数据读取请求查询全局索引时,具体用于:
根据所述逻辑地址在所述全局索引中确定指向所述目标数据的逻辑地址的多个字符子块,所述多个字符子块属于所述第一索引项,根据所述多个字符子块的取值确定所述多个存储层中所述目标数据所在的存储层。
25.如权利要求24所述的装置,其特征在于,每个字符子块用于描述所述多个存储层中的一个存储层中是否存储数据,一个字符子块为一个比特,所述比特的取值包括0或1,所述1表示所述目标数据位于所述字符子块对应的存储层中,所述0表示所述目标数据不位于所述字符子块对应的存储层中。
26.如权利要求24所述的装置,其特征在于,每个字符子块用于描述所述多个存储层中的一个存储层中是否存储数据,一个字符子块为一个计数器,所述计数器的取值包括0或非零整数,所述0表示所述目标数据不位于所述一个字符子块对应的存储层中,所述非零整数用于指示所述目标数据位于一个字符子块对应的存储层中,所述非零整数还用于指示数据写入所述一个字符子块对应的存储层的次数,所述数据包括所述目标数据。
27.如权利要求24~26任一项所述的装置,其特征在于,所述读取模块在根据所述目标数据的逻辑地址在所述全局索引中确定指向所述目标数据的逻辑地址的多个字符子块时,具体用于:
根据对所述目标数据的逻辑地址进行哈希操作的结果确定指向所述目标数据的逻辑地址的多个字符子块,所述哈希操作为查询哈希表或作用哈希函数。
28.一种数据访问系统,其特征在于,所述数据访问系统包括如权1-11任一所述的存储系统以及客户端设备;
所述客户端设备,用于向所述存储系统发送数据读取请求,以读取所述存储系统中存储的目标数据。
29.如权利要求28所述的系统,其特征在于,所述全局索引以及所述目标数据的元数据位于所述存储系统中的内存中;
所述客户端设备,还用于基于远程直接内存访问RDMA向所述存储系统发起第一指示,所述第一指示用于请求所述全局索引以及所述目标数据的元数据;
所述存储系统,还用于基于所述第一指示向所述客户端设备发送所述全局索引以及所述目标数据的元数据。
30.如权利要求28所述的系统,其特征在于,所述全局索引位于所述存储系统中的内存,所述目标数据的元数据位于所述存储系统中的持久化存储器中;
所述客户端设备,还用于基于远程直接内存访问RDMA向所述存储系统发起第二指示,所述第二指示用于请求所述全局索引;以及向所述存储系统发起第三指示,所述第三指示用于请求所述目标数据的元数据;
所述存储系统,还用于基于所述第二指示向所述客户端设备发送所述全局索引;基于所述第三指示从所述持久化存储器中获取所述目标数据的元数据,向所述客户端设备发送所述目标数据的元数据。
31.如权利要求29或30所述的系统,其特征在于,
所述客户端设备,还用于根据所述全局索引校验所述目标数据的元数据是否有效;在确定所述目标数据的元数据有效的情况下,根据所述目标数据的元数据向所述存储系统发起所述数据读取请求;
所述存储系统,还用于基于所述数据读取请求向所述客户端设备发送所述目标数据。
32.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述如权利要求12~19任一项所述的方法。
33.一种包含指令的计算机程序产品,其特征在于,当其在计算机上运行时,使得计算机执行上述如权利要求12~19任一项所述的方法。
CN202110944933.6A 2021-06-07 2021-08-17 存储系统、网卡、处理器、数据访问方法、装置及系统 Pending CN115509437A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
PCT/CN2022/092015 WO2022257685A1 (zh) 2021-06-07 2022-05-10 存储系统、网卡、处理器、数据访问方法、装置及系统

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN2021106340115 2021-06-07
CN202110634011 2021-06-07

Publications (1)

Publication Number Publication Date
CN115509437A true CN115509437A (zh) 2022-12-23

Family

ID=84499867

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110944933.6A Pending CN115509437A (zh) 2021-06-07 2021-08-17 存储系统、网卡、处理器、数据访问方法、装置及系统

Country Status (1)

Country Link
CN (1) CN115509437A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116886719A (zh) * 2023-09-05 2023-10-13 苏州浪潮智能科技有限公司 存储系统的数据处理方法、装置、存储系统、设备及介质

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116886719A (zh) * 2023-09-05 2023-10-13 苏州浪潮智能科技有限公司 存储系统的数据处理方法、装置、存储系统、设备及介质

Similar Documents

Publication Publication Date Title
CN108804031B (zh) 最佳记录查找
US11687446B2 (en) Namespace change propagation in non-volatile memory devices
US10289315B2 (en) Managing I/O operations of large data objects in a cache memory device by dividing into chunks
TWI778157B (zh) 固態驅動器、分散式資料儲存系統和利用鍵值儲存的方法
US10114908B2 (en) Hybrid table implementation by using buffer pool as permanent in-memory storage for memory-resident data
US9727479B1 (en) Compressing portions of a buffer cache using an LRU queue
CN110858162B (zh) 内存管理方法及装置、服务器
US11200159B2 (en) System and method for facilitating efficient utilization of NAND flash memory
US9430492B1 (en) Efficient scavenging of data and metadata file system blocks
US20130290636A1 (en) Managing memory
US10678788B2 (en) Columnar caching in tiered storage
CN110968269A (zh) 基于scm与ssd的键值存储系统及读写请求处理方法
US20170160940A1 (en) Data processing method and apparatus of solid state disk
WO2021047425A1 (zh) 一种持久性内存的虚拟化方法及系统
CN115794669A (zh) 一种扩展内存的方法、装置及相关设备
CN112148736A (zh) 缓存数据的方法、设备及存储介质
WO2022257685A1 (zh) 存储系统、网卡、处理器、数据访问方法、装置及系统
CN115509437A (zh) 存储系统、网卡、处理器、数据访问方法、装置及系统
US11366609B2 (en) Technique for encoding deferred reference count increments and decrements
US10482012B1 (en) Storage system and method of operating thereof
US20170286442A1 (en) File system support for file-level ghosting
CN108804571B (zh) 一种数据存储方法、装置以及设备
EP4307129A1 (en) Method for writing data into solid-state hard disk
CN111352590B (zh) 文件存储方法及设备
US11586353B2 (en) Optimized access to high-speed storage device

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination