数据更新技术的制作方法

文档序号:25542487发布日期:2021-06-18 20:39阅读:211来源:国知局
数据更新技术的制作方法

本发明涉及存储技术领域,尤其涉及一种数据更新技术。



背景技术:

在存储系统中,通常基于纠错码(errorcorrectingcode,ecc)编码的可靠性技术来保证数据的可靠性。基于ec编码的可靠性技术是通过对待存储的数据进行编码,增加冗余位。在存储设备出现故障时,通过冗余位来恢复故障设备的数据。独立磁盘冗余阵列(redundantarrayofindependentdisks,raid),又称廉价磁盘冗余阵列(redundantarrayofinexpensivedisks,raid),简称磁盘阵列。其原理是通过将多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘,并且配合数据分散排列的设计,提升数据的安全性。随着raid技术的发展,ec编码技术被应用于raid技术中,以不断提高数据的安全性。例如,raid5、raid6及raid7等均是基于ec编码技术实现的raid技术。

在基于raid技术实现的存储系统中,可以将多个数据块与校验数据一起组成raid的一个分条(stripe),分别写入构成raid的多个磁盘中。采用raid技术,能够在多个磁盘上同时存储和读取数据,从而能够大幅提高存储系统的数据吞吐量(throughput)。并且,raid技术提供了基于数据校验的容错功能,当一个磁盘出现故障导致分条中的数据块出现错误或丢失时,能够根据该分条中的其他数据块以及校验数据对该故障磁盘中的数据进行恢复。

然而,在采用raid技术的存储系统中,如果需要更新一个分条中的小部分数据,需要将当前更新位置对应的分条的数据读到内存中,然后再对该部分数据进行更新,更新后重新计算校验数据,再写回磁盘中。这种更新方法会使实际写入的数据比需要写入的数据多,造成系统的写入放大(writeamplification,wa),使得系统的更新性能比较差。



技术实现要素:

本申请实施例中提供的一种数据更新技术,能够在保持更新数据的可靠性的基础上提高存储系统的更新性能。

第一方面,本申请提供一种数据更新方法。该方法可以应用于包含有管理节点和多个存储节点的存储系统中,所述多个存储节点构成磁盘冗余阵列raid。在该存储系统中,当管理节点接收到携带有待写入数据的写请求之后,所述管理节点可以根据所述待写入数据获得至少一个更新数据片。其中,所述至少一个更新数据片构成更新分条,所述更新分条用于更新所述raid中的一个分条的一部分数据块,所述分条包括分别存储于所述多个存储节点中的数据块和校验块。在获得所述更新分条之后,管理节点可以向所述多个存储节点中的第一存储节点发送更新请求。所述更新请求中携带有所述更新分条中的一个更新数据片以及所述更新分条的完整性信息。所述更新数据片是用于更新所述分条中的第一数据块的数据。所述第一数据块为所述分条中的任意一个数据块。

在所述第一存储节点根据所述更新分条的完整性信息确定所述更新分条为不完整的分条之后,所述第一存储节点在所述第一数据块的日志链logchain中插入数据节点,所述插入的数据节点中记录有所述更新数据片的信息。其中,所述第一数据块的logchain存储于所述第一存储节点的非易失性内存nvm中,所述第一数据块的logchain中记录有所述第一数据块在至少一次更新过程中的更新数据的信息,所述更新数据片的信息包括所述更新数据片或者所述更新数据片在所述第一存储节点的nvm中的存储地址。

在本申请提供的一种数据更新方法中,在需要对某个分条的数据进行更新的过程中,当管理节点确定本次更新并没有对整个分条中的所有数据进行更新时,管理节点直接将更新数据片分别发送给相应的存储节点。若接收到更新数据片的存储节点确定该更新数据片所属的更新分条不是完整分条,该存储节点并不按照该更新数据片直接更新存储于外存设备中的相应分条中的数据块,而是采用logchain的方式将更新数据片存储于所述存储节点的非易失性内存nvm中,从而能够减少分条更新过程中的写入放大问题,提高了存储系统的更新性能。

由于nvm具有非易失性,从而能够保证存储于pcm中的更新数据片的安全性。并且,在nvm中采用logchain的方式来存储更新数据,这种方式不仅能够保证数据的安全性,并且能够将分条中的一个数据块在多次更新过程中的更新数据按照时间先后顺序记录下来,从而便于识别更新数据片的版本关系,保证了存储的数据与写入数据之间的一致性。此外,由于logchain中记录的更新数据片并不是以分条中的一个数据块为粒度的更新数据,因此,采用本发明的数据更新方法能够支持对分条的小粒度的更新。

在一种可能的实现方式中,所述第一存储节点还可以向所述多个存储节点中的第二存储节点发送备份请求,所述备份请求中携带有所述更新数据片。所述备份请求用于指示所述第二存储节点备份所述更新数据片。所述第二存储节点接收到所述备份请求后,在所述第一数据块的备份日志链logchain中插入数据节点,所述备份logchain中插入的数据节点中包含有所述更新数据片的备份信息。其中,所述更新数据片的备份信息包括所述更新数据片或者所述更新数据片在所述第二存储节点的nvm中的存储地址。所述第一数据块的备份logchain存储于所述第二存储节点的nvm中。

本申请提供的这种数据更新方法,在采用了logchain的方式记录更新数据片的基础上,进一步的采用了多副本的方式备份更新数据片。在这种实现方式中,即使在更新数据片还没有存储到存储节点的外存设备(例如,磁盘)之前,存储节点出现了故障,也能够通过其他存储节点中存储的数据以及logchain或备份logchain中记录的更新数据片对故障节点中存储的数据进行恢复更新,从而进一步保证了数据的安全性。

进一步的,在本申请提供的数据更新方法中,所述第一存储节点将待写入的所述更新数据片写入第一存储节点的nvm中,并将所述更新数据片在第二存储节点中进行备份之后,第一存储节点可以向管理节点响应写入成功消息。所述写入成功消息用于指示所述更新数据片已经被成功被写入存储节点中。从而可以减少访问请求的处理时延。

在又一种可能的实现方式中,当所述第一存储节点判断其nvm中未存储有所述第一数据块的logchain时,所述第一存储节点可以在其nvm中为所述第一数据块创建logchain。从而能够在新创建的logchain中插入数据节点,并在插入的数据节点中记录所述更新数据片的信息。具体的,所述第一存储节点可以根据第一更新请求中携带的分条id和块id判断第一存储节点nvm中是否存储有所述第一数据块的logchain。

在又一种可能的实现方式中,在执行在所述第一数据块的logchain中插入数据节点的操作的过程中,所述第一处理节点可以在所述第一数据块的logchain的尾部或头部插入数据节点。其中,在插入数据节点后,所述第一数据块的logchain中包含有根据所述第一数据块的更新顺序依次链接的至少两个数据节点。这种顺序插入数据节点的方式,能够将logchain中的不同数据节点中记录的更新数据片按照对第一数据块更新的先后顺序进行链接。从而,可以根据第一数据块的logchain中的数据节点的先后顺序识别出所述第一数据块的不同更新版本。在读取数据的过程中,能够保证读取的数据的正确性。

在又一种可能的实现方式中,当第一存储节点将所述更新数据片存储于第一数据块的logchain中之后,管理节点可以更新所述分条的管理信息。其中,所述分条的管理信息包括所述所述分条的更新次数、所述分条的更新数据量或所述分条的更新时间。

在又一种可能的实现方式中,所述管理节点确定所述分条的管理信息达到预设条件时,所述管理节点可以向所述多个存储节点发送读请求,所述读请求用于读取所述分条存储于所述多个存储节点中的数据块。在接收到所述多个存储节点返回的所述分条中更新后的数据块之后,所述管理节点可以根据所述多个存储节点返回的所述分条中更新后的数据块计算更新后的校验块。其中,所述分条中更新后的数据块包括所述第一存储节点返回的更新后的第一数据块,所述更新后的第一数据块是根据所述第一数据块的logchain中的至少一个更新数据片的信息以及所述第一存储节点中存储的第一数据块获得的。之后,所述管理节点将更新后的分条中的数据块和校验块分别存储于所述多个存储节点的外存设备中。其中,所述更新后的分条包括所述更新后的第一数据块以及所述更新后的校验块。具体的,所述管理信息的预设条件可以包括:1)所述第一分条的更新次数大于第一阈值;2)所述第一分条的更新数据量达到第二阈值;或3)所述第一分条的更新时间达到预定时间。在前述数据更新方法的基础上,这种数据更新方法在满足一定条件时才将所述所述存储节点的nvm中记录的更新数据片更新到对应的分条的数据块,根据更新后的数据块获得更新后的校验块,并将更新后的数据块和校验块写入各存储节点的磁盘中,从而保证了数据的安全。并且,这种将多次修改过程中的更新数据片延迟合并后存储到存储节点的磁盘中的方式,与现有的分条更新方法相比能够减少存储系统的写入放大的问题,提升了存储系统的更新性能。

进一步的,在将更新后的第一分条中的数据块和校验块分别存储于所述多个存储节点的外存设备中之后,所述管理节点可以无效所述分条的管理信息,所述第一存储节点可以释放所述第一数据块的logchain占用的存储空间。从而能够节省存储系统的存储空间。

在又一种可能的实现方式中,所述第一存储节点接收到所述管理节点发送的读请求之后,在所述第一存储节点根据所述分条的标识以及所述第一数据块的标识确定所述第一存储节点的nvm中存储有所述第一数据块的logchain的情况下,所述第一存储节点可以根据所述第一数据块的logchain中记录的至少一个更新数据片的信息以及所述第一存储节点中存储的第一数据块获得更新后的第一数据块,并将所述更新后的第一数据块发送给所述管理节点。根据这种方式,在第一数据块的更新数据片未存储到第一存储节点的外存设备中的情况下,若第一存储节点接收到读取第一数据块的读请求,第一存储节点也能够根据其nvm中的logchain中记录的更新数据片获得最新的第一数据块,保证数据的一致性。

在又一种可能的实现方式中,在获取更新后的第一数据块的过程中,第一存储节点可以根据所述第一数据块的logchain中记录的至少一个更新数据片的信息确定所述第一数据块的logchain中的有效数据,并将所述有效数据合并到所述第一数据块中,以获得所述更新后的第一数据块。其中,所述有效数据为所述第一数据块的最新修改数据,所述第一数据块由所述第一存储节点从所述第一存储节点的外存设备中读取。

在又一种可能的实现方式中,所述第一数据块的logchain中还包括:所述更新数据片在所述第一数据块中的偏移量、所述更新数据片的长度以及所述插入的数据节点的相邻数据节点的地址信息。

第二方面,本申请提供了又一种数据更新方法,所述方法由包含有管理节点和多个存储节点的存储系统中的第一存储节点执行。其中,所述多个存储节点构成磁盘冗余阵列raid,所述第一存储节点中包含有非易失性内存nvm。在第二方面提供的数据更新方法中,所述第一存储节点执行上述第一方面以及第一方面的任意一种可能的实现方式中提供的数据更新方法中由第一存储节点所执行的方法。

第三方面,本申请提供了一种存储系统。所述存储系统包括管理节点和多个存储节点,所述多个存储节点构成磁盘冗余阵列raid。所述管理节点以及多个存储节点中的第一存储节点用于执行上述第一方面以及第一方面的任意一种可能的实现方式中提供的数据更新方法。

第四方面,本申请提供了一种存储节点。存储节点作为存储系统中的第一存储节点,所述存储系统包括管理节点以及多个存储节点,所述多个存储节点包含所述第一存储节点,所述多个存储节点构成更新磁盘冗余阵列raid,所述第一存储节点包括非易失性内存nvm以及与所述nvm连接的处理器,所述处理器用于执行上述第一方面以及第一方面的各种可能的实现方式中提供的数据更新方法中由第一存储节点执行的方法。换一种表达方式,所述处理器用于执行上述第二方面中提供的数据更新方法。

第五方面,本申请提供了又一种存储节点,所述存储节点作为存储系统中的第一存储节点,所述存储系统包括管理节点以及多个存储节点,所述多个存储节点包含所述第一存储节点,所述多个存储节点构成磁盘冗余阵列raid。所述存储节点包括用于执行上述第二方面中提供的数据更新方法的模块。

第六方面,本申请提供了一种计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令用于执行上述第一方面及第二方面中的至少一种方法。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍。显而易见地,下面描述中的附图仅仅是本发明的一些实施例。

图1为本发明实施例提供的一种存储系统的结构示意图;

图2为本发明实施例提供的一种存储节点的结构示意图;

图3为本发明实施例提供的一种数据更新方法的信令图;

图4为本发明实施例提供的又一种数据更新方法的信令图;

图5为本发明实施例提供的一种数据块的日志链结构示意图;

图6为本发明实施例提供的一种将数据从pcm写入磁盘的方法信令图;

图7为本发明实施例提供的一种数据合并方法流程图;

图8为本发明实施例提供的一种存储节点的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行描述。显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。

图1为本发明实施例提供的一种存储系统的结构示意图。如图1所示,存储系统100可以包括管理节点110以及多个存储节点(例如,存储节点112、114、116和118)。该存储系统100可以通过通信网络108与多个应用服务器(例如,应用服务器102、104和106)进行通信。通信网络108可以包括电缆、无线通信连接,通信网络108也可以包括以太网、光纤等。并且,通信网络108中可以包括当前技术已知的存储设备和应用服务器之间的任何接口,如光纤交换机,或者其他现有的交换机。在本发明实施例中,不对通信网络108的具体形态进行限定,只要能够建立应用服务器与存储节点之间的通信连接即可。

应用服务器102、104和106可以包括个人计算机或网络计算机等计算设备。应用服务器102、104和106可以运行有操作系统和各种应用程序。管理节点110是用于存储系统100中的具有管理和控制功能的节点。管理节点110可以是一个控制器,也可以是服务器计算机。在本发明实施例中,管理节点110可以用于接收应用服务器102、104和106发送的访问请求,将接收的访问请求转发到存储节点112、114、116和118,实现对存储节点112、114、116和118的访问。例如,在一种情况下,管理节点110可以接收应用服务器102、104或106发送的读请求,并将接收的读请求转发给存储有被访问数据的存储节点,并在接收到存储节点返回的数据后将该数据返回给应用服务器102、104或106。在又一种情况下,管理节点110可以接收应用服务器102、104或106发送的写请求,并将待写入数据分别发送给存储节点112、114、116和118,以将数据存储于存储节点112、114、116和118中。

在本发明实施例中,管理节点110还维护有存储节点112、114、116和118中存储的数据的管理信息。例如,当在存储节点112、114、116和118中采用raid方式存储数据时,管理节点110维护有各个分条(stripe)的更新信息,以便于根据分条的更新信息将分条的更新数据回写到磁盘中。其中,分条的更新信息中可以包含有分条的更新次数、所述分条的更新数据量或所述分条的更新时间。

在本发明实施例中,分条(stripe)是指并行写入构建raid的各个存储器上的数据块的集合。其中,分条中的各个数据块的大小相同,且同一个分条上的数据块位于各个存储器中的偏移位置相同。分条中的数据块也称为条带(strip)。条带是一块由若干个地址连续的磁盘块构成的、大小固定的区域。换一种表达方式,条带是一个连续地址块。本发明实施例中描述的数据块是指由数据组成的数据单元。本发明实施例中描述的校验块是指由校验数据组成的数据单元。

存储节点112、114、116和118可以是具有计算、存储功能的智能设备。具体的,每个存储节点可以是一台运行有操作系统并能够提供数据存储、获取和管理服务的计算机。在各个存储节点中,可以包括用于存储用户数据的磁盘、固态硬盘等存储器件。例如,存储节点112、114、116和118可以为对象存储设备(objectstoragedevice,osd)。

在本发明实施例中,管理节点110以及存储节点112、114、116和118的具体结构可以参见图2。图2为本发明实施例提供的一种存储节点的结构示意图。为了描述方便,图2中以存储节点112为例对本发明实施例提供的存储节点的架构进行描述。如图2所示,存储节点112可以包括中央处理器中央处理器(centralprocessingunit,cpu)205、动态随机存储器(dynamicrandomaccessmemory,dram)210、相变存储器(phasechangememory,pcm)215以及磁盘220。其中,dram210和pcm215均为存储节点112的内存。

中央处理器(cpu)205是存储节点112的核心,cpu205可以调用存储节点112中不同的软件程序实现不同的功能。例如,cpu205能够实现对dram210、pcm215以及磁盘220的访问。可以理解的是,在本发明实施例中,cpu205仅仅是处理器的一个示例。除了cpu205外,处理器还可以是其他特定集成电路(applicationspecificintegratedcircuit,asic),或者是被配置成实施本发明实施例的一个或多个集成电路。

动态随机存储器(dynamicrandomaccessmemory,dram)210通过内存总线与cpu205连接。例如,dram120可以通过北桥芯片和内存总线225实现与cpu205之间的通信。cpu205能够高速访问dram210,对dram210进行读或写操作。dram210具有访问速度快的优点,因此,通常dram210作为主内存使用。通常dram210用来存放操作系统中各种正在运行的软件、输入和输出数据以及与外存交换的信息等。然而,dram210是易失性的,当关闭电源后,dram210中的信息将不再保存。本领域技术人员知道,dram是易失性内存(volatilememory)的一种,实际应用中还可以采用其他的随机存储器(randomaccessmemory,ram)作为计算机系统的内存。例如,还可以采用静态随机存储器(staticrandomaccessmemory,sram)作为计算机系统的内存。

pcm215是一种新型的非易失性存储器(non-volatilememory,nvm)。在本发明实施例中,pcm215可以与dram210共同作为存储节点112的内存。由于新型nvm能够按字节(byte)寻址,将数据以位(bit)为单位写入非易失性存储器中,因而能够作为内存使用。与dram210相比,由于pcm215具有非易失性的特点,从而能够更好地保存数据。在本发明实施例中,可以将能够作为内存使用的非易失性存储器称为存储级内存(storageclassmemory,scm)。需要说明的是,在本发明实施例中,图2中所示的pcm215仅仅只是scm的一种示例。除了pcm外,scm还可以包括:阻变存储器(resistiverandomaccessmemory,rram)、磁性存储器(magneticrandomaccessmemory,mram)或铁电式存储器(ferroelectricrandomaccessmemory,fram)等其他的新型非易失性存储器,在此不对本发明实施例中的scm的具体类型进行限定。

磁盘220可以通过io总线230与cpu205进行通信。例如,磁盘220可以通过串行ata(serialadvancedtechnologyattachment,sata)接口、小型计算机系统接口(smallcomputersysteminterface,scsi)等接口以及io总线连接南桥芯片,通过南桥芯片与cpu205进行通信。磁盘220用于存储数据,作为计算机系统100的外存设备使用。通常,作为外存设备的存储介质需要具有非易失性的特点,当计算机关闭电源后,存储于外存的数据仍然会被保存。并且,外存的存储容量较大。可以理解的是,磁盘220仅仅是外存设备的一种示例,作为外存设备的存储器除了可以是磁盘220外,还可以是固态硬盘(solidstatesrives,ssd)、机械硬盘(harddiskdrive,hdd)、光盘、存储阵列等其他能够存储数据的非易失性的存储设备。

可以理解的是,图2所示的存储节点112仅仅是存储设备的一种示例。实际应用中,随着计算机技术的发展,新一代的计算机系统中,dram210和pcm215可以通过双倍速率(doubledatarate,ddr)总线与cpu205进行通信。并且,cpu205也可以通过主机总线适配卡(hostbusadaptor,hba)连接磁盘220。在本发明实施例中,并不对具体的存储节点112的内部器件之间的连接形式进行限定,只要存储节点112中包括非易失性内存(non-volatilememory,nvm)即可。换一种表达方式,本发明实施例中所述的存储节点112可以为包括永久性内存(persistentmemory,pm)并具有计算、存储功能的计算设备。需要说明的是,在本发明实施例中,管理节点110除了可以采用如图2所示的结构外,管理节点110的内存中也可以不包括pcm215。

本领域技术人员可以知道,采用raid技术存储数据,能够提高数据的安全性。在本发明实施例中,为了保证存储的数据的安全性,本发明实施例提供的存储系统在多个存储节点上实现raid。例如,可以在存储节点112、114、116和118中实现raid7。具体的,可以将多个数据块(例如如图1中所述的数据块d11、d12和d13)以及该多个数据块的校验块(例如校验块p1)组成一个分条,并将该分条中的多个数据块以及校验块分别存储到不同的存储节点中。例如,将数据块d11存储于存储节点112的中,将数据块d12存储于存储节点114的中,将数据块d13存储于存储节点116中,将校验块p1存储于存储节点118中。从而能够形成如图1中的120所示的存储结构示意。数据块的大小等于条带大小(stripsize)。其中,条带大小有时也被称为blocksize,chunksize或者granularity,指的是写在每块磁盘上的数据块的大小。通常,条带大小一般在2kb到512kb之间(或者更大),其数值是2的n次方,即2kb,4kb,8kb,16kb等。

可以理解的是,在本发明实施例提供的存储节点112、114、116和118中,可以将至少一个存储节点作为专用于存储校验块的存储节点,在同一个存储节点中也可以存储不同分条中的校验块和数据块。。在本发明实施例中,不对raid的实现方式进行限定,只要是能够将一个分条中的多个数据块以及校验块分别存储于不同的存储节点中即可。并且,本发明实施例中也不对一个分条中的校验块的数量进行限定。

如前所述,虽然raid技术能够提供数据存储的安全性,然而,在对分条中的数据块进行更新的过程中,会产生写入放大的问题,导致实际写入各存储节点的磁盘中的数据比需要写入磁盘中的数据更多。为了减少数据块更新过程中的写入放大的现象,以在确保数据的安全性的基础上提高存储系统的更新性能,在本发明实施例中,在对分条进行部分更新的过程中,将更新数据存储于各个存储节点的pcm中。其中,本发明实施例所述的对分条进行部分更新是指对分条中的一部分数据进行更新。下面将对本发明实施例提供的应用于存储系统100中的数据更新方法进行具体描述。需要说明的是,本发明实施例中的raid均是指基于ec编码技术实现的raid。

为了描述清楚,下面将结合图3和图4对本发明实施例提供的图1所示的存储系统如何更新数据进行详细描述。需要说明的是,在本发明实施例中,在存储节点112、114、116和118中建立了raid,存储于该存储系统中的数据均是以raid的形式分别存储于上述四个存储节点中,每个分条包括分别存储于所述四个存储节点中的数据块。图3为本发明实施例提供的一种数据更新方法的信令示意图,图4为本发明实施例提供的又一种数据更新方法的流程示意图。为了描述方便,图3和图4以应用服务器102、管理节点110、存储节点112和存储节点114为例进行示意。在下面的实施例中,也可以将存储节点112称为第一存储节点,将存储节点114称为第二存储节点。如图4所示,该方法可以包括如下步骤。

在步骤402中,管理节点110接收到应用服务器102发送的第一写请求,该第一写请求可以为图3中所示的第一写请求302。实际应用中,第一写请求302中可以携带有待写入数据、所述写请求的起始地址以及所述待写入数据的大小。其中,所述起始地址可以为逻辑地址也可以为物理地址,所述起始地址用于表示所述写请求待更新的数据的起始位置。例如,若第一写请求302的起始地址为1m,则说明第一写请求302从存储空间的第1mb开始进行写操作。本领域技术人员可以理解的是,起始地址为1m用于表示1024*1024获得的数值。

在管理节点110接收到应用服务器102发送的第一写请求302之后,在步骤404中,管理节点110能够根据所述起始地址、所述raid中分条的分条大小、条带大小以及待写入的数据的大小获得至少一个更新数据片以及所述至少一个更新数据片的更新信息。在本发明实施例中,所述更新数据片(updateddatasegment)是指用于更新分条中的一个数据块的数据。更新数据片不大于分条中的一个数据块。根据所述第一写请求302获得的所述至少一个更新数据片可以用于更新一个分条中的至少一个数据块,也可以用于更新多个分条中的多个数据块。换一种表达方式,所述至少一个更新数据片可以构成一个更新分条,也可以组成多个更新分条。其中,一个更新分条中包括用于更新同一个分条中的数据块的更新数据片。

在本发明实施例中,更新数据片的更新信息可以包括:分条id、块id、块长度、块内偏移以及分条完整性信息。其中,“分条id”用于表示所述写请求待更新的分条的id。“分条id”为更新分条的索引值。“块id”用于表示所述更新数据片需要更新的数据块的id,也用于表示需要更新的数据块在分条中的逻辑位置。需要更新的数据块是指存储于所述多个存储节点的分条中的数据块。例如,所述raid中的分条1包括数据块d11、d12、d13以及校验块p1,分条2包括数据块d21、d22、d23以及校验块p2。所述raid中的第1个分条(即分条1)的分条id为1,分条1包括数据块d11、d12、d13以及校验块p1,数据块d11的块id为1,数据块d12的块id为2,数据块d11的块id为3,检验块p1的块id为4。依次类推。可以理解的是,“分条id”和“块id”共同构成一个数据块的唯一标识。通过“分条id”和“块id”能够找到相应的数据块。从而,在本发明实施例中,根据更新数据片的“分条id”和“块id”能够确定该更新数据片待更新的数据块。

“块长度”用于表示一个更新数据片的长度。在本发明实施例中,更新数据片的长度不大于分条中一个数据块的长度。换一种表达方式,更新数据片可以用于更新分条中的一个数据块中的所有数据,也可以只用于更新分条中的数据块中的一部分数据。“块内偏移”用于更新数据片将要更新的数据在分条中的数据块中的起始位置。“分条完整性”用于表示用于更新同一个分条中的数据块组成的更新分条的完整性。在本发明实施例中,具有相同分条id的更新数据片为同一个更新分条中的更新数据片。若有相同分条id的多个更新数据片组成的更新分条的长度等于所述raid中设置的分条中的所有数据块的长度时,则认为该更新分条为完整分条。

实际应用中,在接收到第一写请求302后,由于第一写请求302中携带有起始地址以及待写入数据的大小,因此管理节点110可以根据第一写请求302中携带的起始地址与设置的分条大小的商向上取整数的方式获得第一写请求302待更新的起始位置所属的分条的id。为了描述方便,在本发明实施例中,以raid中设置的分条大小为4mb,条带大小为1mb为例进行描述。若第一写请求302中携带的起始地址为0.5m,则分条id为1,即第一写请求302将从分条1开始更新。

实际应用中,管理节点110可以根据所述第一写请求302中携带的起始地址以及设置的条带大小的商向上取整数的方式获得第一写请求302待更新的起始位置所属的数据块的id。例如,若第一写请求302中携带的起始地址为0.5m,图1所示的条带大小为1mb,则所述更新分条的起始块号为1。换一种表达方式,更新分条从分条1中的第1个数据块开始更新。例如,从分条1中的d11开始更新。进一步的,管理节点110可以根据所述第一写请求302中携带的起始地址以及设置的条带大小执行取模运算的方式获得第一写请求302待更新的起始位置。例如,若第一写请求302中携带的起始地址为0.5m,图1所示的条带大小为1mb,则管理节点110可以计算获得第一写请求302从第1个数据块中的第0.5m开始更新。

可以理解的是,上述对第一写请求302待更新的起始位置所属的分条的id以及数据块的id的获得方式的描述仅仅是一种示例,实际应用中,由于数据块和校验块在分条中分布的位置不同,可能导致分条的id以及数据块的id的计算方式不同,在本发明实施例中,不对具体如何获得第一写请求302待更新的起始位置所属的分条的id以及数据块的id的方式进行限定。

在获得第一写请求302待更新的起始位置后,管理节点110能够进一步根据待写入数据的大小、分条大小以及条带大小对待写入数据进行划分,获得至少一个更新数据片以及所述至少一个更新数据片的更新信息。例如,仍然以一个分条大小为4mb,条带大小为1mb为例。在一种情形下,假设第一写请求302中携带的起始地址为0.5m,待写入数据的大小为0.2mb,也就是说,第一写请求302需要从第0.5m开始更新,更新数据量的大小为0.2m个字节。则第一写请求302待更新的数据块为第1个分条中的第1个数据块,且该更新数据片的块内偏移为0.5m,块长度为0.2mb。进一步的,管理节点110可以根据该待写入数据得到一个更新数据片。具体的,在这种情况下,待更新的数据块可以为图1中所示的分条1中的d11,第一写请求302中携带的数据即为更新数据片d11′。

在又一种情形下,假设第一写请求302中携带待写入数据的起始地址为0.5m,待写入数据的大小为1mb,则第一写请求302待更新的数据块为第1个分条中的第1-2个数据块。具体的,待更新的数据块可以为如图1中分条1中的d11和d12,从而获得更新数据片d11′和d12′。其中,更新数据片d11′为所述待写入数据中第0m至第0.5m的数据,由于d11′用于更新第1个分条中的第1个数据块中的第0.5m至第1m位置的数据,因此,更新数据片d11′的块内偏移为0.5m,块长度为0.5mb。所述更新数据片d12′为所述待写入数据中第0.5m至第1m的数据。由于d12′用于更新第1个分条中第2个数据块中的第0m至第0.5m位置的数据,因此,更新数据片d12′的块内偏移为0m,块长度为0.5mb。

可以理解的是,实际应用中,获得更新数据片的方式有很多种,例如,在一种情形下,可以根据第一写请求302的起始位置以及设置的条带大小直接对待写入数据进行划分,从而能够得到多个更新数据片,并能够根据各更新数据片的分条id确定更新分条。在又一种情形下,也可以先根据待写入数据的大小以及设置的分条的大小获取至少一个更新分条,再根据设置的条带大小对至少一个更新分条进行划分,从而得到属于各个更新分条的多个更新数据片。在本发明实施例中,不对具体如何获得更新数据片的方式进行限定。

本领域技术人员可以理解的是,实际应用中,由于管理节点110接收到的写请求中待写入的数据的大小不同,管理节点110根据接收的写请求获得的至少一个更新数据片可以构成一个更新分条,也可以构成多个更新分条。换一种表达方式,管理节点110接收的写请求可以对一个分条进行更新,也可以对多个分条进行更新。在本发明实施例中,在管理节点110获得多个更新分条的情况下,当某个更新分条为完整分条时,管理节点110可以根据该更新分条中的数据块获得校验块,将该完整分条中的数据块和校验块分别写入所述四个存储节点中。当某个更新分条为非完整分条时,在这种情况下,该更新分条中的更新数据片的大小小于待写入分条中的所有数据块的大小,则管理节点110可以分别向所述更新数据片将进行更新的数据块所属的存储节点发送更新请求,以将更新数据存储于存储节点中。

本领域技术人员可以知道,当更新分条为完整分条时(即,当对整个分条进行更新时)不会造成写入放大的问题。当更新分条为非完整分条时(即,当对分条中的部分数据进行更新时)才会造成写入放大的问题。因此,在本发明实施例中,将以对非完整分条的更新为例进行描述。可以理解的是,在本发明实施例中,可以采用相同的更新方式对每一个非完整更新分条中的更新数据片进行处理。

为了描述方便,本发明实施例以根据所述至少一个更新数据片获得的至少一个更新分条中的第一更新分条s1'304为例进行描述。如图3所示,为了描述方便,以第一更新分条s1'304中包括两个更新数据片:d11′和d12′,其中,d11′用于更新图1中所示的分条1中的数据块d11,d12′用于更新图1中所示的分条1中的数据块d12,且第一更新分条s1'中所有更新数据片的大小小于待更新的分条中的所有数据块的大小为例。可以理解的是,组成第一更新分条s1′的数据块可以是在步骤404中管理节点110获得的所有数据块,也可以是在步骤404中管理节点110获得的数据块中的一部分数据块。

在获得第一更新分条s1'之后,在步骤405中,管理节点110能够判断第一更新分条s1'是不是完整的分条。由于当第一更新分条s1'为非完整分条时会造成写入放大的问题,图4以第一更新分条s1′不是完整的分条为例进行图示和描述。在管理节点110确定第一更新分条s1'不是完整的分条之后,管理节点110可以分别向存储节点112和114发送更新请求,用于指示存储节点112和114分别存储第一更新分条s1'中的更新数据片d11'和d12'。例如,如图3所示,管理节点110可以向存储节点112发送第一更新请求306,其中,第一更新请求306中携带有更新数据片d11′以及更新数据片d11′所属的更新分条s1′的完整性信息。并且,管理节点110可以向存储节点114发送第二更新请求308,其中,第二更新请求308中携带有更新数据片d12′以及更新数据片d12′所属的更新分条s1′的完整性信息。由于每个存储节点处理更新请求的方式是相似的,因此,在下面的实施例中,以存储节点112存储d11′的过程进行详细介绍。为了描述清楚,在本发明实施例中,也可以将更新数据片d11'称为第一更新数据片d11',将更新数据片d12'称为第二更新数据片d12'。

如图4所示,在管理节点110确定第一更新分条s1'不是完整的分条之后,在步骤406中,管理节点110向第一存储节点112发送第一更新请求306。其中,第一更新请求306中携带有更新数据片d11′以及所述更新数据片d11′的更新信息。具体的,更新数据片d11′的更新信息可以包括前述的分条id、块id、块长度、块内偏移以及分条完整性信息。如前所述,第一更新分条s1′不是完整的分条,因此,为了减少写入放大问题,第一更新请求中需携带有更新数据片d11′以及d11′所属的更新分条的完整性信息。当第一存储节点112收到第一更新请求306后,第一存储节点112能够根据第一更新请求306中的分条完整性信息确定第一更新分条s1′为不完整的分条(参见步骤408)。实际应用中,可以用“0”表示更新分条为不完整的分条,用“1”表示更新分条为完整的分条,在此不做限定。

在步骤410中,第一存储节点112在所述第一数据块d1的日志链logchain中记录第一更新数据片d11′的信息。为了减少分条更新过程中的写入放大问题,且为了确保在系统出现掉电、宕机或软件故障等情况下,写入的更新数据也不丢失,在本发明实施例中,采用了在存储节点的pcm中建立日志链(logchain)的方式来保证更新数据在被写入存储节点的外存设备之前的安全性。具体的,在本发明实施例中,当第一存储节点112确定第一更新分条s1′为不完整的分条时,第一存储节点112并不直接将更新数据片d11′存储于第一存储节点112的外存设备中。换一种表达方式,当第一存储节点112确定第一更新分条s1′为不完整的分条时,第一存储节点112并不直接用更新数据片d11′更新存储节点112中存储的数据块d11。在这种情况下,第一存储节点112将更新数据片d11′暂时存储于第一存储节点112的pcm215中。

如图3所示,在本发明实施例中,每一个存储节点的pcm215中可以为该存储节点存储的数据块建立logchain,用于存储对该数据块进行更新的更新数据片。仍然以图1中120所示的存储结构为例,如图3所示,在第一存储节点112的pcm215中为分条1(s1)中的数据块d11建立了logchain310(也可以表示为s1-d11logchain310),类似的,在第一存储节点112的pcm215中,还可以为分条2(s2)中的数据块d21建立logchain312。在第二存储节点114的pcm215中,也可以为分条1(s1)中的数据块d12建立logchain316,也可以为分条2(s2)中的数据块d22建立logchain318。

需要说明的是,存储节点并不会为其存储的每个数据块主动建立logchain,只有在更新分条为不完整分条,需要将该更新分条中的更新数据片存储于pcm215中时,才在pcm215中为需要更新的数据块建立logchain。如图3所示,在一个数据块的logchain中(例如,s1-d11logchain310)可以包括至少一个数据节点,每个数据节点用于存储该数据块(例如,d11)在一次更新过程中的更新数据的信息。下面将结合图5对本发明实施例提供的分条中的一个数据块的logchain进行详细介绍。

为了描述清楚,图5以分条1中的第一个数据块d11的logchain310(图5中表示为s1-d11logchain310)结构为例进行清楚的描述。如前所述,每一个数据块的日志链由对该数据块在至少一次更新过程中形成的数据节点组成。如图5所示,在s1-d11logchain310中可以包括:分条id502、块id503、log信息指针504、第一数据节点506和第二数据节点508。下面将分别就logchain中的各个字段进行详细介绍。

“分条id”502和“块id”503共同构成该数据块的logchain的索引值。“分条id”502用于表示数据块所属的分条的id,“块id”503用于表示该数据块的id。在本发明实施例中,“分条id”和“块id”构成了一个数据块的唯一标识,因此,在一个存储节点中,为某个数据块建立的logchain可以通过该数据块所属分条的分条id和该数据块的块id进行索引。可以理解的是,不同分条中的数据块可以具有相同的块id。在本发明实施例中,当存储节点112根据管理节点110发送的第一更新请求306确定更新数据片d11′所属的第一更新分条s1′为不完整分条时,存储节点112能够根据第一更新分条s1′的分条id查找存储节点112中是否存储有数据块d11的logchain。若没有查找到数据块d11的logchain,则需要为数据块d11建立logchain。若查找到数据块d11的logchain,则说明在本次更新之前已经对数据块d11进行过更新,且数据块d11的logchain中包含有至少一次更新过程中的更新数据的信息。

log信息指针504用于指向数据块的logchain中的第一个数据节点。具体的,log信息指针504可以指向logchain中的第一个数据节点的起始位置。例如,如图5所示,在s1-d11logchain310中,第一个数据节点506的起始字段为“块内偏移”字段,因此,log信息指针504可以指向第一个数据节点506中的“块内偏移”字段的起始地址。

如图5所示,数据块d11的logchain中的每一个数据节点(例如,第一数据节点506和第二数据节点508)中均可以包括如下字段:块内偏移、log数据片长度、上一个log地址、下一个log地址以及log数据片。“块内偏移”,用于指示更新数据片将要更新的数据在分条中的数据块中的起始位置。“log数据片长度”用于指示更新数据片的长度。“上一个log地址”用于指向上一个数据节点的地址。“下一个log地址”用于指向下一个数据节点的地址。“log数据片”用于存储更新数据片或更新数据片在pcm125中的存储地址。其中,根据“块内偏移”和“log数据片长度”信息构成了更新数据片(例如,更新数据片d11′)的块内位置信息,所述块内位置信息用于指示本数据节点中的log数据片(即更新数据片)将要更新的数据在分条中的数据块中的位置。

在本发明实施例中,所述上一个数据节点为本数据节点的前一次插入的数据节点,用于指示该数据块在本次更新之前的前一次更新过程中的更新数据片的信息。具体的,“上一个log地址”用于指示上一个数据节点在pcm215中的起始地址。例如,如图5所示,由于“块内偏移”字段是第一个数据节点中的首个字段,因此,第二个数据节点508中的“上一个log地址”可以指向上一个数据节点中的“块内偏移”字段。可以理解的是,一个数据块的日志链结构中的首个数据节点中的“上一个log地址”字段为空。例如,图5中的第一数据节点506为第一数据块d11的logchain310中的首个数据节点。因此,在第一数据节点506中,“上一个log地址”字段为空。

在本发明实施例中,所述下一个数据节点为本数据节点的下一次插入的数据节点,用于指示该数据块在本次更新后的下一次更新过程中的更新数据的信息。具体的,“下一个log地址”用于指示下一个数据节点在pcm215中的起始地址。例如,如图5所示,由于“块内偏移”字段是第二数据节点508中的首个字段,则第一数据节点506中的“下一个log地址”可以指向第二数据节点508中的“块内偏移”字段。可以理解的是,一个数据块的日志链中的最后一个数据节点中的“下一个log地址”字段为空。当一个数据节点中的“下一个log地址”字段为空时说明该数据节点中存储有与该数据节点对应的数据块的最后一次更新过程中的更新数据的信息。

可以理解的是,数据节点是在分条更新的过程中动态生成的。例如,假设对分条1(s1)进行更新了两次更新,且第一次更新过程以及第二次更新过程中的更新分条均不是完整分条。则在本发明实施例中,可以将s1中的第一数据块d11在第一次更新过程中的更新数据片d11′存储于第一数据节点506中,将第一数据块d11在第二次更新过程中的过程中的更新数据片存储于第二数据节点508中。每一个数据节点中的“上一个log地址”和“下一个log地址”构成了本数据节点中指向其他数据节点的指针信息。根据这种方式,可以将所述新创建的数据节点按照创建时间的先后顺序挂载在该数据块的logchain中,从而能够根据数据块的logchain中的信息获得分条中的数据块的不同更新版本。进一步的,在计算机系统出现故障后的恢复过程中能够根据该数据块的logchain对写入计算机系统中的数据进行恢复,从而能够保持数据的一致性,且便于系统管理。

在本发明实施例中,logchain中的“log数据片”字段用于记录更新数据片的信息。其中,更新数据片的信息可以包括更新数据片以及更新数据片在pcm中的存储地址。例如,如图5中所示,第一数据节点506中的“log数据片”用于指示分条1中的第一数据块d11在第一次更新过程中的更新数据,第二数据节点508中的“log数据片”用于指示分条1中的第一数据块d11在第二次更新过程中的更新数据。实际应用中,在一种情形下,可以在“log数据片”部分直接记录更新数据片。在另一种情形下,也可以将更新数据片存储于pcm215中的其他存储空间,然后在“log数据片”部分记录更新数据片在pcm215中的存储地址。在本发明实施例中不对logchain结构中的数据存储方式进行限定,只要能够根据logchain查找到分条中的数据块在多次更新过程中的更新数据即可。

为了描述清楚,下面以第一存储节点112存储如图3所示的第一更新分条s1′中的第一更新数据片d11′为例进行描述,其中,第一更新分条s1′中包括更新数据片d11′和d12′,其中,更新数据片d11′用于更新分条s1中存储于第一存储节点112中的数据块d11中的数据,更新数据片d12′用于更新分条s1中存储于第二存储节点112中的数据块d12中的数据。假设更新数据片d11′的块内偏移为0.5m,块长度为0.5mb。当第一存储节点112接收到第一更新请求306之后,第一存储节点112可以根据第一更新请求306中携带的分条id和块id查找第一数据块d11的logchain。

在一种情形下,若第一存储节点112根据分条id没有找到第一数据块d11的logchain,则第一存储节点112需要在第一存储节点112的pcm215中为第一数据块d11创建logchain。第一存储节点112在为第一数据块d11创建logchain时,可以根据第一更新数据片d11′的大小在第一存储节点112的pcm215中分配物理空间,并在该分配的物理空间中初始化第一数据块d11的logchain的数据结构s1-d1logchain310。在创建后的logchain结构中插入第一数据节点506,并在第一数据节点506中记录第一更新数据片d11′的更新信息。具体的,可以在第一数据节点506中的块内偏移字段记录:0.5m,在log数据片长度字段记录:0.5mb,并在log数据片字段记录第一更新数据片d11′或第一更新数据片d11′在pcm215中的存储地址。由于第一数据节点506为s1-d1logchain310中的第一个数据节点,因此,第一数据节点506中的上一个log地址为空。由于第一数据节点506是s1-d1logchain310中当前唯一的数据节点,因此,第一数据节点506中的“下一个log地址”也为空。

在又一种情形下,若第一存储节点112根据分条id找到了第一数据块d11的logchain:s1-d1logchain310,假设s1-d1logchain310中已经包含有第一数据节点506。则在这种情况下,第一存储节点112可以在s1-d1logchain310中生成新的数据节点(例如第二数据节点508),并在第二数据节点508中记录记录第一更新数据片d11′的更新信息。具体的,可以在第二数据节点508中的“块内偏移”字段记录:0.5m,在“log数据片长度”字段记录:0.5mb,在“log数据片”字段记录第一更新数据片d11′或第一更新数据片d11′在pcm215中的存储地址,并将第二数据节点508中的“上一个log地址”字段指向第一数据节点506的首地址。由于第二数据节点508当前是s1-d1logchain310中的最后一个数据节点,因此,第二数据节点508中的“下一个log地址”为空。并且,在插入第二数据节点508之后,还需要对第一数据节点506中的“下一个log地址”字段进行更新,将第一数据节点506中的“下一个log地址”字段指向第二数据节点508的首地址。例如,由于第二数据节点508的第一个字段为“页内偏移”字段,因此,可以将第一数据节点506中的“下一个log地址”字段指向第二数据节点508中的“页内偏移”字段。

可以理解的是,本发明实施例中提供的数据更新方法,在分条更新过程中,将更新数据片按照更新顺序依次记录在logchain中的方式,便于通过logchain中的数据节点的先后顺序识别出分条中的数据块的不同更新版本。实际应用中,在插入数据节点的过程中,可以依次在logchain的尾部按照从前往后的顺序插入数据节点,也可以在logchain的头部按照从后往前的顺序依次插入数据节点。在本发明实施例中不对具体的插入顺序进行限定,只要能够按照logchain中的数据节点识别出数据块的更新顺序即可。

通过上述方式,第一存储节点112可以将更新数据片d11′存储于第一存储节点112的pcm中。然而,由于第一存储节点112并没有直接用更新数据片d11′更新分条中的数据块d11,为了进一步保证数据的安全性,避免因为第一存储节点112故障导致分条1的更新数据丢失,在本发明实施例中,还可以采用多副本的方式对第一更新数据片d11′进行备份。多副本技术是通过将同一份数据备份到多个存储节点上进行保存和管理,如果数据出现错误、丢失等情况,可以从其他节点获取该数据的副本。

具体的,在第一存储节点112将第一更新数据片的更新信息记录于所述第一数据块的logchain中之后,第一存储节点112可以向存储系统中的第二存储节点114发送第一备份请求(参见步骤412)。其中,所述第一备份请求中包含有所述第一更新数据片以及所述第一更新数据片的更新信息,所述第一备份请求用于指示所述第二存储节点114备份所述第一更新数据片。换一种表达方式,所述第一备份请求用于指示所述第二存储节点114存储所述第一个更新数据片的副本。

在步骤414中,第二存储节点114在所述第一数据块d11的备份logchain中记录第一更新数据片d11′的更新信息。在本发明实施例中,可以在第二存储节点114的pcm中建立第一数据块d11的备份logchain,根据这种方式,能够将第一数据块d11的在至少一次更新过程中的更新数据片在第二存储接的114中进行备份。换一种表达方式,第一数据块d11的备份logchain用于备份所述第一数据块的logchain中的更新数据片。可以理解的是,备份logchain的结构与图5所示的logchain的结构相同。第二存储节点114根据所述第一更新请求在备份logchain中存储更新数据片d11′时,可以参照第一存储节点112存储第一更新数据片d11′方式。在步骤414中,第二存储节点114存储更新数据片d11′的过程可以参见步骤408和步骤410的描述。需要说明的是,在备份logchain的“log数据片”字段存储的是更新数据片d11′或更新数据片d11′在第二存储节点114的nvm中的存储地址。

在步骤416中,当第二存储节点116将第一更新数据片d11′存储于第一数据块d11的备份logchain中之后,可以向第一存储节点114发送第一写入成功消息,所述第一成功写入消息用于通知第一存储节点114第一更新数据片d11′已在第二存储节点116中备份成功。在步骤418中,当第一存储节点114接收到第二存储节点116返回的第一写入成功消息之后,第一存储节点114向管理节点110返回第二写入成功消息,所述第二写入成功消息用于通知管理节点110第一更新数据片d11′已被成功存储于存储节点中。根据这种方式,可以减少管理节点110处理访问请求的处理时延。

需要说明的是,在本发明实施例中,第一存储节点112和第二存储节点114可以分别用于存储同一个分条中的不同数据块。在对分条进行部分更新的情况下,第二存储节点114也可以对存储于第一存储节点112中的logchain中的更新数据片进行备份。根据这种方式,第一存储节点112和第二存储节点114中存储的数据并不完全相同。类似的,在对某个分条进行部分更新的情况下,第一存储节点112也可以对存储于第二存储节点114的logchain中的更新数据片进行备份。

实际应用中,为了进一步提高安全性,还可以采用三副本的方式对更新数据进行备份。根据这种方式,第一存储节点112除了将第一更新数据片d11′在第二存储节点114中进行备份之外,还可以向第三存储节点116发送第二备份请求,使得第三存储节点116将第一更新数据片d11′在第三存储节点116的pcm215中进行备份。类似的,也可以在第三存储节点116中建立第一数据块d11的备份logchain,将第一更新数据片d11′的更新信息记录于第三存储节点116中的第一数据块d11的备份logchain中。第三存储节点116对第一更新数据片d11′进行备份的方式也可以参见步骤408和步骤410的描述。需要说明的是,本发明实施例中所描述的更新请求或备份请求均可以是一种用于写入数据的写请求。

上面以第一存储节点112存储第一更新分条s1′中的第一更新数据片d11′为例,对本发明实施例提供的存储系统100中的存储节点如何对分条中的部分数据块进行更新进行了详细的阐述。可以理解的是,第二存储节点114也可以按照第一存储节点112存储第一更新数据片d11′的方式存储第一更新分条s1′中的第二更新数据片d12′,并在存储完第二更新数据片d12′之后向管理节点110返回更新成功消息。在步骤420中,当管理节点110接收到第一存储节点112和第二存储节点114返回的更新成功消息之后,管理节点110可以确定第一更新分条中的更新数据片已经分别存储于各个存储节点中,从而,管理节点110可以更新第一分条(s1)的管理信息。

如前所述,在本发明实施例中,当更新分条不是完整分条时,管理节点110中需要记录分条的管理信息,以便于后续可以根据该分条的管理信息对该分条的更新数据进行合并更新。在一种情形下,分条的管理信息中可以包括分条的更新次数。其中分条id用于索引该分条的管理信息。分条的更新次数用于记录该在预设时间内进行更新的次数。实际应用中,当管理节点接收到更新分条中的数据块对应的存储节点返回的更新成功消息之后,管理节点110可以更新第一分条s1的更新次数。例如,管理节点110可以将第一分条s1的更新次数加1。在另一种情形下,分条的管理信息可以包括分条的更新数据量。例如,管理节点110可以根据第一更新分条s1中的更新数据片的大小更新所述的第一分条的更新数据量,所述第一分条的更新数据量是指所述第一分条在至少一次更新过程中的更新数据的总量。在又一种情形下,分条的管理信息还可以包括所述分条的更新时间。

在本发明实施例中,当管理节点110根据写请求需要对某个分条的数据进行修改时,当管理节点110确定更新分条不是完整的分条时,也就是说本次更新并没有对整个分条中的所有数据进行更新,则管理节点110直接将更新数据片分别发送给相应的存储节点(例如第一存储节点112)。存储节点接收到管理节点110发送的更新数据片之后,若确定该更新数据片所属的更新分条不是完整分条,则存储节点并不对整个分条中的数据块直接进行更新,而是采用logchain的方式对更新数据片进行存储和管理,从而能够减少分条更新过程中的写入放大问题。

由于pcm具有非易失性,使得存储于pcm中的更新数据片不会因为存储节点掉电而丢失。并且,在pcm中采用了logchain的记录方式来存储更新数据,能够将分条中的一个数据块在多次更新过程中的更新数据按照时间先后顺序记录下来,从而便于识别更新数据片的版本关系,保证了存储的数据与写入数据之间的一致性。在读取数据的过程中,能够根据同一个数据块的logchain中log数据片的写入时间确定该数据块的有效数据,保证读取数据的正确性。在存储节点掉电或宕机的情况下,存储节点也能够根据pcm的logchain中记录的更新数据片的信息对数据进行恢复,使得存储于pcm中的更新数据片不会丢失,从而能够保证更新数据片的安全性。进一步的,存储节点还可以将更新数据片发给其他存储节点,以使其他存储节点能够对该更新数据片进行备份,从而更进一步的提高了更新数据片的安全性。

在本发明实施例提供的存储系统100中,在将分条的部分更新数据片以图4所示的方法写入部分存储节点中的pcm215后,为了节省存储节点的存储空间,需要及时回收各存储节点pcm215的存储空间。在这种情况下,需要将各个存储节点pcm215中的logchain中的数据块刷到存储节点的磁盘中,并保证各个数据的安全性。下面将结合图6具体对如何将logchain中记录的更新数据片刷回存储节点的磁盘中的方法进行详细描述。图6为本发明实施例提供的一种将数据从pcm写入磁盘的方法。可以理解的是,实际应用中,管理节点110可以按照其存储的多个分条管理信息分别对多个分条触发如图6所示的将更新数据从pcm刷回磁盘的操作,从而可以将多个分条的更新数据片写入各个存储节点的磁盘中。为了描述清楚,仍然以图3所示的第一分条s1以及第一分条s1中的第一数据块d11为例进行描述。如图6所示,该方法可以包括下述步骤。

在步骤602中,管理节点110确定第一分条的更新次数大于阈值。在本发明实施例中,为了及时回收存储节点的存储空间,可以设置一个阈值,当分条的修改次数大于所述设置的阈值时,可以将存储节点中的logchain中记录的更新数据片刷回存储节点的磁盘中,从而可以回收存储节点中的pcm215中的存储空间。例如,可以将修改次数的阈值设置为5次。当某个分条的修改次数大于5次时,则需要将该分条的更新数据片从存储节点的pcm中写到磁盘。如前所述,在步骤420中,当管理节点110接收到各存储节点返回的写入成功消息之后,管理接的110会更新第一分条的管理信息。例如,管理节点110更新所述第一分条的更新次数、所述第一分条的更新数据量或所述第一分条的更新时间。进而,在步骤602中,管理节点110可以按照设定的时间获取第一分条的修改次数、更新数据量或更新时间,并判断所述第一分条的管理信息是否达预设条件,当所述分条的管理信息到达预设条件时,可以将第一分条中的更新数据合并存储到各存储节点的外存设备中的。

在本发明实施例中,所述管理信息的预设条件可以包括:1)所述第一分条的更新次数大于第一阈值;2)所述第一分条的更新数据量达到第二阈值;或3)所述第一分条的更新时间达到预定时间。为了描述方便,在图6所示的实施例中以判断所述第一分条的更新次数达到预设阈值来触发将更新数据存储到各存储节点的磁盘为例进行描述。

在步骤604至步骤608中,管理节点110分别向第一存储节点112、第二存储节点114和第三存储节点116发送用于读取第一分条中的数据块的读请求。具体的,如图6所示,在步骤604中,管理节点110可以向第一存储节点112发送第一读请求,用于读取存储于第一存储节点112中的第一分条中的第一数据块d11。在步骤606中,管理节点110可以向第二存储节点114发送第二读请求,用于读取存储于第二存储节点114中的第一分条中的第二数据块d12。在步骤608中,管理节点110可以向第三存储节点118发送第三读请求,用于读取存储于第三存储节点118中的第一分条中的第三数据块d13。实际应用中,各个读请求中可以携带第一分条s1的分条id以及将要读取的数据块的id。例如,第一读请求中需要携带第一分条s1的分条id以及第一数据块d11的id,第二读请求中需要携带第一分条s1的分条id以及第二数据块d12的id。可以理解的是,管理节点110可以并行向第一存储节点112、第二存储节点114和第三存储节点116发送读请求。

各存储节点接收到管理节点110发送的上述读请求后,在步骤610至步骤614中,各个存储节点分别获取本存储节点中存储的该分条中的数据块。例如,在步骤610中,第一存储节点112获取存储于第一存储节点112中的更新后的第一数据块d11″。在步骤612中,第二存储节点114获取存储于第二存储节点114中的更新后的第二数据块d12″。在步骤614中,第三存储节点116获取存储于第三存储节点116中的更新后的第三数据块d13″。下面以第一存储节点112如何获取更新后的第一数据块d11″为例对各个存储节点获取数据块的过程进行详细描述。

具体的,当第一存储节点112接收到管理节点110发送的第一读请求后,第一存储节点112可以根据所述第一读请求中的第一分条的分条id确定在第一存储节点112的pcm中是否存储有第一分条中的第一数据块d11的logchain。若第一存储节点112的pcm中没有存储第一分条中的第一数据块d11的logchain,则说明该第一数据块d11自从前一次被写入第一存储节点112的磁盘中后未被更新过,则第一存储节点112可以直接从其磁盘中读取第一数据块d11作为更新后的第一数据块d11″。若第一存储节点112确定其pcm中存储有第一分条中的第一数据块d11的logchain时,说明第一数据块d11自从前一次被写入第一存储节点112的磁盘中后又被更新过,在这种情况下,第一存储节点112需要将其logchain中记录的更新数据片与磁盘中存储的第一数据块d11进行合并,以获得更新后的第一数据块d11″。

下面以第一存储节点112的pcm中存储有第一分条s1中的第一数据块d11的logchain为例,对第一存储节点112如何获得更新后的第一数据块d11″进行详细描述。如图7所示,图7为本发明实施例提供的一种数据合并方法。可以理解的是,对每一个有logchain的数据块都可以按照图7所示的方法进行合并操作,以获得更新后的数据块。为了描述方便,仍然以分条1(s1)中的第一数据块d11的logchain为例进行描述。

在步骤702中,第一存储节点112确定所述第一数据块d11的logchain中的有效数据。在本发明实施例中,所述有效数据为所述第一数据块d11的最新更新数据。具体的,第一存储节点112可以根据第一数据块d11的logchain中至少一个数据节点中记录的更新数据片的信息确定所述第一数据块d11的logchain中的有效数据。第一存储节点112可以根据所述第一数据块d11的logchain中各数据节点的更新顺序以及更新数据片的页内位置信息来确定所述logchain中的有效数据。logchain中的各数据节点均是依据对第一数据块d11的修改时间的先后顺序依次获得的,根据这种方式,处于logchain尾部的数据节点的获得时间晚于处于logchain头部的数据节点的获得时间。更新数据片的块内位置可以根据数据节点中的“块内偏移”和“log数据片长度”这两个字段中的信息获得。

在具体进行数据合并的过程中,可能出现以下两种情形。在第一种情形下,logchain中各数据节点中记录的更新数据片的页内位置均没有重叠。在这种情形下,第一存储节点112可以确定该所述logchain中各个数据节点中记录的更新数据片均为有效数据。以图5中所示的第一数据块d11的logchain为例。如图5所示,第一数据块d11的logchain中有两个数据节点:第一数据节点506和第二数据节点508。且第二数据节点508的生成时间晚于第一数据节点506。若第一数据节点506中的更新数据片的块内位置为第0.2m-0.5m字节,第二数据节点508中的更新数据片的页内位置为第0.8m-0.9m字节。在这种情形下,第一存储节点112确定第一数据节点中记录的更新数据片和第二数据节点中记录的更新数据片均为有效数据。

在第二种情形下,logchain中各数据节点中的更新数据片的块内位置有重叠。在这种情形下,对于有重叠的至少两个更新数据片,第一存储节点112确定所述logchain中较晚生成的数据节点中记录的重叠部分的数据为有效数据,并且,第一存储节点112分别确定所述有重叠的至少两个更新数据片中的非重叠部分的数据均为有效数据。换一种表达方式,在有重叠时,第一存储节点112确定较晚生成的数据节点中的全部数据以及较早生成的数据节点中的非重叠部分的数据为有效数据。例如,以图5中的第一数据块d11的logchain为例,若第一数据节点506中记录的更新数据片的块内位置为第0.2m-0.5m字节,第二数据节点508中记录的更新数据片的块内位置为第0.4m-0.7m字节。则第一存储节点112确定第一数据节点中记录的第0.2m-0.4m字节和第二数据节点中的第0.4m-0.7m字节为有效数据。

在步骤704中,第一存储节点112从磁盘中获取分条1(s1)中的第一数据块d11。可以理解的是,第一存储节点112的磁盘中存储的分条1中的第一数据块d11是未更新之前的数据块。在步骤706中,第一存储节点112将所述有效数据更新到第一数据块d11中,以得到更新后的第一数据块d11″。可以理解的是,第一数据块的logchain中记录的更新数据片是在多次更新过程中对分条1中的第一数据块d11中的至少一部分数据进行更新的数据。为了得到更新后的第一数据块,需要将logchain中记录的更新数据片更新到磁盘中存储的第一数据块d11中,以获得所述更新后的第一数据块d11″。具体的,第一存储节点112可以用在步骤702中确定的logchain中的有效数据替换所述第一数据块d11中与所述有效数据的块内位置相同的数据。例如,若在步骤702中,第一存储节点112确定第一数据块d11的logchain中的有效数据的块内位置为第0.2m-0.4m字节,则第一存储节点112可以将确定所述logchain中的第0.2m-0.4m字节的有效数据替换所述第一数据块d11中第0.2m-0.4m字节的数据,从而得到更新后的第一数据块d11″。

在获得更新后的第一数据块d11″后,在步骤616中,第一存储节点112向管理节点110返回更新后的第一数据块d11″。类似的,第二存储节点114也可以采用与第一存储节点112类似的方法获得更新后的第二数据块d12″,并在步骤618中,第二存储节点114向管理节点110返回其获得的更新后的第二数据块d12″。第三存储节点116也可以采用与第一存储节点112获得更新数据片的相同的方法获得更新后的第三数据块d13″,并在步骤620中,第三存储节点118向管理节点110返回其获得的更新后的第三数据块d13″。

当管理节点110接收到各存储节点返回的更新数据片(例如上述的第一数据块d11″、第二数据块d12″以及第三数据块d13″)后,在步骤622中,管理节点110可以根据其接收的第一分条中更新后的数据块计算获得更新后的校验块p1′。在计算校验块时,可以根据预设的ecc算法根据各个数据块获得更新后的校验块。可以理解的是,实际应用中,校验块可以是多个。为了描述方便,本发明实施例以一个校验块为例进行描述。

在获得更新后的校验块后,管理节点110分别向各存储节点发送更新请求以将第一分条中更新后的数据块以及更新后的校验块分别存储于各个存储节点中。具体的,在步骤624中,管理节点110可以向第一存储节点112发送第三更新请求,所述第三更新请求用于指示第一存储节点112存储更新后的第一数据块d11″。在步骤626中,管理节点110可以向第二存储节点114发送第四更新请求,所述第四更新请求用于指示第二存储节点114存储更新后的第二数据块d12″。在步骤628中,管理节点110可以向第三存储节点116发送第五更新请求,所述第五更新请求用于指示第三存储节点116存储更新后的第三数据块d13″。在步骤630中,管理节点110可以向第四存储节点118发送第六更新请求,所述第六更新请求用于指示第四存储节点118存储更新后的校验块p1′。

在步骤632中,第一存储节点112将更新后的第一数据块d11″存储于第一存储节点112的磁盘中。在步骤634中,第二存储节点114将更新后的第二数据块d12″存储于第二存储节点114的磁盘中。在步骤636中,第三存储节点116将更新后的第三数据块d13″存储于第三存储节点116的磁盘中。在步骤638中,第四存储节点118将更新后的校验块p1′存储于第三存储节点116的磁盘中。下面将以第一存储节点112存储更新后的第一数据块d11″为例对存储节点如何存储更新后的数据块进行简单描述。

在本发明实施例中,各更新请求中也携带有更新后的数据块以及更新后的数据块的信息,具体的,更新后的数据块的信息可以包括:分条id、块id、块长度、块内偏移以及分条完整性信息。例如,第三更新请求中可以携带更新后的第一数据块d11″、第一分条的分条id、更新后的第一数据块d11″的块id、更新后的第一数据块d11″的长度、块内偏移以及更新后的第一分条的完整性信息。可以理解的是,由于管理节点从各个存储节点获取更新后的数据块并计算更新后的校验块后,可以获得更新后的第一分条s1″。更新后的第一分条s1″为一个完整的分条,其中,更新后的第一分条s1″包括更新后的第一数据块d11″、更新后的第二数据块d12″、更新后的第三数据块d13″以及更新后的校验块p1′。在第三更新请求中,第一分条的完整性信息用于指示待写入的更新后的第一数据块d11″所属的更新后的第一分条s1″为完整分条。

当第一存储节点112接收到第三更新请求后,第一存储节点112可以根据更新后的第一分条s1″的完整性信息确定更新后的第一数据块d11″所属的更新后的第一分条s1″为完整分条,从而,第一存储节点112将第三更新请求中携带的更新后的第一数据块d11″写入磁盘中的相应位置,以实现更新第一分条中的第一数据块d11的目的。类似的,第二存储节点114能够将更新后的第二数据块d12″存储于第二存储节点114的磁盘中,第三存储节点116能够将更新后的第三数据块d13″存储于第三存储节点116的磁盘中,第四存储节点118能够将更新后的校验块p1′存储于第四存储节点118的磁盘中。

在将更新的第一分条s1″中的数据块和校验块分别存储于存储系统100的各存储节点中后,各存储节点可以删除相应的数据块的logchain。例如,第一存储节点112可以删除第一分条s1中的第一数据块d11的logchain,以释放所述第一数据块d11的logchai占用的存储空间。在某个存储节点删除了其pcm中存储的某个数据块的logchain之后,备份该数据块的logchain的存储节点也需要删除起pcm中的备份logchain。例如,若第二存储节点114中存储有第一数据块d11的备份logchain,第一存储节点112也需要通知第二存储节点114删除第一数据块d11的备份logchain。

需要说明的是,图6中所示方法中步骤602并不是必须的。实际应用中,为了释放存储空间,也可以按照设定的时间将pcm中记录的更新数据片刷回磁盘中。当达到设定时间时,管理节点110就执行数据刷回操作。根据这种方式,当达到设定时间时,管理节点110可以向分别向多个存储节点读取某个分条中的数据块,并计算校验块后,将更新后的数据块和更新后的校验块分别写入多个存储节点中。具体可以参见上述步骤604至步骤638的描述。

在本发明实施例中,由于logchain中记录的更新数据片并不是以分条中的一个数据块为粒度的更新数据,因此,采用本发明的数据更新方法能够支持对分条的小粒度的更新。并且,在对分条进行部分更新时,并未将更新数据片按照raid的方式直接更新到磁盘中,而是将更新数据片写入存储节点的pcm中。在满足一定条件时,才将所述pcm125中记录的更新数据片更新到对应的分条的数据块,并根据更新后的数据块获得更新后的校验块,并将更新后的数据块和校验块写入各存储节点的磁盘中。在本发明实施例提供的数据更新方法中,由于在将数据写入pcm中后,就可以向应用返回写入成功消息,从而能够提供存储系统的处理效率。并且,按照图6所示的将多次修改过程中的更新数据片延迟合并后刷回存储节点的磁盘中的方式,与现有的分条更新方法相比能够减少存储系统的写入放大的问题。

本发明实施例中,即使某个存储节点出现故障被重新启动后,也可以根据所述各存储节点中的pcm中的logchain进行数据写回恢复,保证新写入的数据不丢失,以保证数据的安全性。具体的,若某个存储节点发送故障并重新启动后,管理节点110可以根据其他存储节点中存储的某个分条中的数据块以及校验块对该存储节点中存储的该分条中的数据块进行恢复,并根据该节点的pcm中的logchain中记录的更新数据片或根据备份logchain中记录的所述更新数据片的备份数据对恢复的数据块进行更新,从而能够获得更新后的数据块。

例如,若第一存储节点112出现故障,需要对第一分条中的第一数据块d11进行恢复时,管理节点110可以通过第二存储节点114中存储的数据块d12、第三存储节点116存储的数据块d13以及第四存储节点118中存储的校验块p1对第一分条中的第一数据块d11进行恢复,得到恢复后的第一数据块d11。再根据第一存储节点112的pcm的logchain中记录的更新数据片d11′对恢复后的第一数据块d11按照图7所示的方式进行合并,从而能够得到更新后的第一数据块d11″。

可以理解的是,在又一种情形下,在获得恢复后的第一数据块d11之后,也可以根据第二存储节点114中的所述第一数据块的备份logchain中记录的更新数据片d11′的备份数据对恢复后的第一数据块d11按照图7所示的方式进行合并,以得到更新后的第一数据块d11″。

从本发明实施例提供的上述数据恢复方法可以看出,虽然本发明实施例中将分条中的部分更新数据片未按raid的方式直接进行更新,然而,由于本发明实施例中,在pcm中采用了logchain的方式记录更新数据片,并且进一步的采用了多副本的方式备份更新数据片,从而,即使在更新数据片尚未刷回磁盘之前存储节点出现故障,也能够通过其他存储节点中存储的数据以及logchain或备份logchain中记录的更新数据片对故障节点中存储的数据进行恢复更新,保证数据的安全性。

图8为本发明实施例提供的又一种存储节点的结构示意图。图8所示的存储节点可以作为图1所示的存储系统中的存储节点,例如,图8所示的存储节点可以作为图1中所示的存储节点112、114、116或118。将图8所示的存储节点作为图1所示的多个存储节点中的任意一个存储节点,为了描述方便,将图8所示的存储节点称为第一存储节点。如图1所示,存储系统包括管理节点以及多个存储节点,所述多个存储节点构成磁盘冗余阵列raid,如图8所示,所述存储节点80可以包括下述模块。

接收模块800,用于接收管理节点发送的更新请求。其中,所述更新请求中携带有第一更新分条中的第一更新数据片以及所述第一更新分条的完整性信息,所述第一更新数据片是用于更新所述raid中的第一分条的第一数据块的数据块,所述第一分条包括分别存储于所述多个存储节点中的数据块以及校验块。

判断模块802,用于根据所述第一更新分条的完整性信息确定所述第一更新分条为不完整的分条。

存储模块804,用于在所述第一数据块的日志链logchain中插入数据节点,所述插入的数据节点中记录有所述第一更新数据片的信息。其中,所述第一数据块的logchain存储于所述第一存储节点的非易失性内存nvm中,所述第一数据块的logchain中记录有所述第一数据块在至少一次更新过程中的更新数据的信息,所述第一更新数据片的信息包括所述第一更新数据片或者所述第一更新数据片在所述第一存储节点的nvm中的存储地址。

实际应用中,所述存储模块804具体可以在所述第一数据块的logchain的尾部或头部插入所述数据节点,其中,在插入所述数据节点后,所述第一数据块的logchain中包含有根据所述第一数据块的更新顺序依次链接的至少两个数据节点。

在又一种情形下,存储设备80还可以包括发送模块806。发送模块806,用于向第二存储节点发送备份请求。所述第一备份请求中携带有所述第一更新数据片,所述备份请求用于指示所述第二存储节点备份所述第一更新数据片。具体的,所述第二存储节点可以根据所述备份请求在所述第一数据块的备份日志链logchain中插入新的数据节点,所述插入的数据节点中包含有所述第一更新数据片的备份信息,所述第一更新数据片的备份信息包括所述第一更新数据片或者所述第一更新数据片在所述第二存储节点的nvm中的存储地址,其中,所述第一数据块的备份logchain存储于所述第二存储节点的nvm中。在本发明实施例中,所述备份logchain用于备份所述第一数据块的logchain中的更新数据片。

在又一种情形下,所述接收模块800还用于接收所述管理节点发送的读请求,所述读请求中携带有第一分条的标识以及所述第一数据块的标识。所述存储设备80还可以包括:查找模块808和合并模块810。查找模块808用于根据所述第一分条的标识以及所述第一数据块的标识确定所述第一存储节点的nvm中存储有所述第一数据块的logchain。合并模块810用于根据第一数据块的logchain中记录的至少一个更新数据片的信息以及所述第一存储节点中存储的第一数据块获得更新后的第一数据块。所述发送模块806还用于向所述管理节点返回所述更新后的第一数据块。

实际应用中,合并模块810具体用于根据所述第一数据块的logchain中记录的至少一个更新数据片的信息确定所述第一数据块的logchain中的有效数据,并将所述有效数据合并到第一数据块中,以获得所述更新后的第一数据块。其中,所述有效数据为所述第一数据块的最新修改数据,所述第一数据块从所述第一存储节点的外存设备中读取。

在本发明实施例中,所述第一数据块的logchain中还可以包括所述第一更新数据片在所述第一数据块中的偏移量、所述第一更新数据片的长度以及所述插入的数据节点的相邻数据节点的地址信息。具体对于logchain以及logchain中记录的更新数据片的信息的描述可以参见前述的实施例。

本发明实施例所提供的存储设备80可以参见前述实施例描述的数据更新方法,具体的,各个模块功能的详细描述可参见前述实施例(例如图4-图7所示实施例)中对存储节点的相关描述,在此不再赘述。

本发明实施例还提供一种数据更新方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令用于执行前述任意一个方法实施例所述的方法流程。本领域普通技术人员可以理解,前述的存储介质包括:u盘、移动硬盘、磁碟、光盘、随机存储器(random-accessmemory,ram)、固态硬盘(solidstatedisk,ssd)或者其他非易失性存储器(non-volatilememory)等各种可以存储程序代码的非短暂性的(non-transitory)机器可读介质。

需要说明的是,本申请所提供的实施例仅仅是示意性的。所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。在本发明实施例、权利要求以及附图中揭示的特征可以独立存在也可以组合存在。在本发明实施例中以硬件形式描述的特征可以通过软件来执行,反之亦然。在此不做限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1