具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
相关技术中,为了提高存储的数据的可靠性,大型的数据存储系统一般是通过分布式存储系统实现的,即数据上传后,复制多份副本,不同的副本存储在不同的存储节点中,这样,即使一个存储节点出现故障,该存储节点上的数据在分布式存储系统中还存有其他副本,保证数据不会丢失。其中,分布式存储系统中,数据一般以多个数据块的形式来存储。举例而言,如果用户上传了一张图片,分布式存储系统会将一张图片划分为多个数据块进行存储。
如上所述,相关技术中,对于分布式存储系统而言,已经有一种HDFS三阶段写的方法来完成数据写入。HDFS三阶段写的方法具体而言包括以下步骤,客户端设备的执行模块先将用户上传的数据写入客户端设备的临时存储区(这个过程称之为write),再将数据从客户端设备的临时存储区写入存储节点的临时存储区(这个过程称之为flush),最后存储节点的执行模块将数据从存储节点的临时存储区写入存储节点的持久化存储区,完成数据写入并持久化写入的过程(这个过程称之为sync)。HDFS三阶段写的方法虽然能写入用户上传的数据,但是写入速度并不快。这种方法对于一些对写入速度没有较高要求的业务来说已经足够,但是对于一些要求高性能写入(即要求写入速度较高)的业务来说,当前的HDFS三阶段写的方法并不够快。
其中,要求高性能写入的业务有:搜索业务、开发数据处理(Open DataProcessing Service,ODPS)业务、深度优先搜索(Depth First Search,DFS)业务等等。对于这些业务来说,利用分布式存储系统执行业务的过程具体是,预先或者实时将需要进行处理/搜索的数据上传至分布式存储系统,然后在分布式存储系统的已上传的数据中,对数据进行处理/搜索。
HDFS三阶段写不够快的原因具体来说,HDFS三阶段写的方法中,write、flush、sync的过程一般是串行执行的,即完成本次数据sync后,才能执行下一次数据的write,如果sync过程失败了,也需要等待重新sync完成才能进行下一次数据的write。而由于sync过程相较于write和flush过程而言相对较慢,N次向持久化存储区写入小块数据所耗费的时间,也比一次性向持久化存储区写入N次写入的所有数据的时间要长,因此为了能在原本的三阶段写入的基础上实现快速写入,考虑可以将sync过程与write、flush解耦,以使得sync过程不影响数据的高速写入。进一步地,减少调用存储节点执行模块的次数也可以提升速度,也可以考虑并行执行write和flush过程,减少flush的次数。
此外,考虑到相关技术中,串行执行的目的是为了保证每次写入的数据都能完成持久化写入,以保证数据的可靠存储,也就是说,相关技术中是通过使得写入过程中不会丢失数据来保证数据的可靠存储的。而数据的可靠存储只要保证数据在持久化存储后不丢失就可以,至于写入过程中的数据而言,如果存储节点出现故障或者客户端设备出现故障,只要除了存储节点之外的其他设备可以得知用户上传的数据有多少已经完成持久化写入,就能通过用户上传,或者从其他设备获得丢失的数据,以重新将丢失的数据持久化写入,完成数据的可靠存储。因此,串行执行改为并行执行仍然能够在满足数据快速写入的同时,保证数据的可靠存储。
基于上述分析,本说明书中,客户端设备有2个模块,分别为写流处理模块及持久化写入请求模块,两个模块分别独立执行各自的任务,写流处理模块负责write过程,及flush过程的一部分(向存储节点发送包括需要写入的数据的临时写入请求),持久化写入请求模块负责触发sync过程。而存储节点负责flush过程的另一部分(根据临时写入请求,将数据写入存储节点的临时存储区),及执行sync过程。同一设备内部的各个模块分别独立执行,这样使得write、flush和sync过程可以分开,flush过程中,可以在存储空间数据达到一定值后再flush,减少客户端设备调用存储节点的次数;sync过程中,可以在临时存储区中数据达到一定值后再sync,减少调用sync的次数。通过减少这两个过程调用的次数,提升了写入速度。
此外,sync过程与write、flush过程解耦,不仅仅是使得sync过程与write、flush过程可以并行执行,还包括sync过程与write、flush过程不互相影响,基于上述考虑,原本在HDFS三阶段写中,sync过程完成以后,才能将最开始写入客户端设备临时存储区中对应的数据删除。而如果sync完成后才能将客户端设备存储区中对应的数据删除,可能会影响write过程的进行。举例来说,在客户端设备的存储区较小的情况下,由于sync过程比write和flush过程要慢,如果要等待sync完成后才删除客户端设备存储区中的数据,那么会使得客户端设备存储区中的数据逐渐增多,最后客户端设备存储区中的数据趋近于满的时候,write过程就需要等待sync完成才能继续进行,使得write过程仍然被sync影响。考虑到以上问题,本说明书中,完成flush过程后,就会将客户端设备存储区中对应的数据删除,以使得sync过程不会影响数据的write和flush过程。
基于此,为了使得sync过程中,客户端设备可以得知仍未被持久化写入的数据有哪些,客户端设备需要有一个列表(待持久化列表),用于存储未完成持久化写入的数据的数据标识。在flush过程完成后,客户端设备的临时写入请求子模块需要将已完成flush过程的数据写入待持久化列表,以使得sync过程可以正常进行。
最后,HDFS三阶段写的方法中,中心节点不会保存每个文件已经完成持久化写入的长度,且一般如果需要向三个存储节点写入数据的话,向两个存储节点写入成功后就会结束sync过程进行下一次的write,所以,HDFS中,中心节点无法得知已经完成写入的数据中哪些数据已经持久化,这样使得HDFS无法保证数据的可靠性存储。考虑到该问题,本说明书实施例中,为了保证数据额可靠存储,使得作为整个系统管理设备的中心节点可以得知哪些数据已经写入持久化存储区,在完成持久化写入后,需要使得中心节点可以得知该消息。
基于上述分析本说明书一个或多个实施例中,数据存储系统中包括存储节点和客户端设备,客户端设备具有写流处理模块、持久化写入请求模块、存储区及待持久化列表,存储节点具有临时存储区及持久化存储区;写流处理模块负责将用户上传的数据写入存储区,及给存储节点发送临时写入请求,以使存储节点将数据写入临时存储区,并在数据临时写入完成的情况下,将数据标识添加到待持久化列表;持久化写入请求模块负责根据待持久化列表给存储节点发送持久化写入请求,以使存储节点将数据从临时存储区写入持久化存储区;各个模块分别独立执行。通过将数据的持久化写入过程与数据临时写入的过程解耦,提高了写入速度。
接下来将对本说明书示出的数据写入方法进行详细说明。为了解决相关技术中的数据写入方法速度不够快的问题,本说明书一个或多个实施例示出了一种数据写入方法,应用于包括客户端设备和存储节点的数据存储系统。通过三阶段写的三个阶段并行执行,即各个设备内部不同模块之间并行执行,使得持久化写入的过程与写入临时存储区的过程解耦,这样速度较慢的sync过程不会影响write和flush过程,提升了写入速度。后文中,为了能更好的对本说明书示出的数据写入方法进行说明,本说明书将通过四个部分对该方法进行说明,第一部分是对数据存储系统中客户端设备和存储节点中各个模块的功能进行描述,第二部分将对数据在数据存储系统中的流经过程进行描述,第三部分将通过一个具体的例子对该方法进行形象的描述,第四部分将分别从客户端设备侧和存储节点侧对该方法进行描述。
首先从各个模块的功能的角度来对数据写入方法进行说明。本说明书应用于数据存储系统,本说明书中并不限制数据存储系统中客户端设备和存储节点的数量。如果本说明书的方法应用于分布式存储系统中,客户端设备同时写入多个存储节点的方法,相当于把客户端设备写入一个存储节点的方法执行多遍。为了方便描述,以一个客户端设备和一个存储节点为例,如图1A所示,图1A是本说明书根据一示例性实施例示出的一种数据写入方法的应用场景图,客户端设备包括两个模块,分别是写流处理模块和持久化写入请求模块,客户端设备还包括存储区和待持久化列表;写流处理模块负责接收用户的数据写入请求,并将数据写入存储区;以及从存储区读取数据,向存储节点发送临时写入请求,并在临时写入完成后,将临时写入完成的数据的数据标识加入待持久化列表;持久化写入请求模块负责监控待持久化列表中的数据标识的数量,并在数量超过持久化阈值的情况下,向存储节点的持久化模块发送持久化写入请求。存储节点包括临时存储区是持久化存储区,负责接收临时写入请求,将对应的数据写入临时存储区;以及接收持久化写入请求,并将对应的数据从临时存储区写入持久化存储区,完成数据的持久化存储。需要注意的是,同一设备内部的各个模块分别独立执行。
具体而言,如图2所示,图2是本说明书根据一示例性实施例示出的一种数据写入方法的流程图,包括以下步骤:
步骤201,客户端设备的写流处理模块,接收用户的数据写入请求,将所述数据写入请求对应的数据写入客户端设备的存储区;从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表。
步骤203,客户端设备的持久化写入请求模块,向存储节点发送持久化写入请求,所述持久化写入请求包括从所述待持久化列表中读取的数据标识;
步骤211,存储节点,在接收到临时写入请求的情况下,将临时写入请求包括的数据写入存储节点的临时存储区;在接收到持久化写入请求的情况下,将对应的数据从临时存储区写入存储节点的持久化存储区。
其中,需要进行说明的是,图2中的箭头并不表征每个模块执行的先后顺序,而是用于表征数据的流向。
其中,步骤201的第一句所描述的步骤为上文中提及的write过程,相较于相关技术中的write过程,本说明书的实施例中的write过程无需等待上一个sync执行周期完成就可以触发write过程,使得写入速度得到提升。步骤201的第二局和步骤211的第一句组合起来是flush过程。步骤203和步骤211的第二句共同组成sync过程。
其中,客户端设备的存储区可以是临时存储区,比如缓存区buffer等,也可以是持久化存储区,比如硬盘等。考虑到写入临时存储区的速度大于写入持久化存储区的速度,为了提升写入速度,客户端设备的存储区可以选为临时存储区。对于存储节点而言,持久化存储区与临时存储区相对应,临时存储区指的是读写速度较快的存储区,一般是掉电易失性存储,而持久化存储区指的是掉电非易失性存储介质。
其中,不同的模块可以是不同的进程,不同的进程可以并行执行;不同的模块也可以是不同的线程,这几个不同的线程也可以并行执行。
其中,上述过程中,客户端设备执行write过程和触发flush过程未解耦,存储节点执行flush写入过程和执行sync写入过程也并未解耦。为了进一步提升写入速度,步骤201中的写流处理模块可以包括写入子模块和临时写入请求子模块,各个模块分别独立执行:写入子模块,接收用户的数据写入请求,根据所述数据写入请求,将对应的数据写入所述存储区;临时写入请求子模块,在满足临时写入条件的情况下,从所述存储区读取数据,并向存储节点的临时写入模块发送临时写入请求,所述临时写入请求包括读取的数据;并在满足添加条件的情况下,将完成临时写入的数据的数据标识添加到所述待持久化列表。所述存储节点包括:临时写入模块、持久化写入模块,临时存储区和持久化存储区;各模块分别独立执行:临时写入模块,在接收到临时写入请求的情况下,将临时写入请求包括的数据写入所述临时存储区;持久化写入模块,在接收到持久化写入请求的情况下,根据持久化写入请求包括的数据标识,将对应的数据从所述临时存储区,写入所述持久化存储区。上述所示的方法的应用场景图如图1B所示,这样使得客户端设备将write过程与触发flush的过程解耦,存储节点也将flush写入过程与sync写入过程解耦,进一步提升了写入速度。具体而言,写入子模块所执行的为write过程,临时写入请求子模块和临时写入模块所执行的为flush过程,通过将write过程及flush过程解耦,第二个数据的write不用等待第一个数据的flush执行完成才执行,通过将sync写入过程与flush写入过程解耦,第二个数据的sync不用等待第一个数据的flush执行完成才执行,将进一步提升写入速度。
接下来将对write过程进行详细说明。
其中,用户的数据写入请求可以是只包括write指令的数据写入请求,也可以是包括整个三阶段写的数据写入请求。用户需要写入的文件可能是较大的文件,在接收到针对大文件的写入请求的情况下,一般会在收到的文件的数据达到一定大小的情况下,开始将接受到的数据作为本次需要写入的数据,并写入客户端设备的存储区;此外,如果很长时间没有达到一定大小,也需要将已经上传的数据写入客户端设备的存储区。在接收到的文件大小较小(小于调用一次写入可以写入的最大大小)的情况下,可以选择调用一次写入,将该文件写入存储区,如果一次性传输的文件较多,也可以等待收到的数据达到一定大小的情况下再将接收到的数据写入存储区。
此外,考虑到如果存储区的空间较小,那么在存储区中有空余空间的情况下,或者说在存储区中空余空间大小大于本次需要写入的数据的大小的情况下,才能将本次需要写入的数据成功写入。因此为了保证数据能正常写入,可以选择在存储区中有足够空余空间时再写入;也可以在执行向存储区内写入数据之前,确定存储区内的空余空间大小满不满足写入条件,并在不满足写入条件的情况下,主动触发flush过程,以使得存储区内有足够的空余空间。
对于上述第二种情况来说,将所述数据写入请求对应的数据写入客户端设备的存储区,包括:根据所述数据写入请求,在数据大小满足写入条件的情况下,判断客户端设备的存储区的空余空间是否够本次写入;若所述空余空间不够本次写入,则触发向存储节点发送临时写入请求;向客户端设备的存储区写入数据。也就是说,如图3所示,图3是本说明书根据一实施例示出的一种数据写入客户端设备方法(write过程)的流程图,应用于写流处理模块或写入模块,具体包括以下步骤:
步骤2011,接收用户的数据写入请求。
步骤2013,根据所述数据写入请求,在数据大小满足写入条件的情况下,判断客户端设备的存储区的空余空间是否够本次写入。如果是,则执行步骤307,如果否,则执行步骤305。
其中,写入条件如上所述,可以是满足一定大小的情况下,判断客户端设备的存储区的空余空间是否够本次写入。
步骤2015,若所述空余空间不够本次写入,则向存储节点发送临时写入请求(触发flush过程)。
这样做可以使得存储区中的空余空间足够的原因是,在flush完成后,可以将已经写入存储节点临时存储区的数据从客户端设备的存储区中删除。
步骤2017,向客户端设备的存储区写入数据。
根据如图3所示的步骤,可以使得在存储区中的空余空间不足的情况下,触发flush过程,以使得存储区有足够的空余空间,这种写入过程相较于第一种方法,更加迅速。此外,虽然write过程和flush过程可以并行执行,但是为了提升写入速度,两个过程之间并没有解耦,仍然相互影响。
接下来将对flush过程进行详细说明。
其中,flush可以无条件执行,也可以在满足临时写入条件的情况下执行,临时写入条件包括:客户端设备的存储区中存储的数据大小达到临时写入阈值,或由写入模块/写流处理模块触发,或由用户触发。用户触发指的是用户输入了flush指令或sync指令。此外,并不是每次write后都会进行flush,如上所述,为了减少向存储节点的临时存储区写入的次数,以提升写入速度,因此并不是每次write(可以是写入模块执行一次)后,都会进行flush,可以选择在存储区中数据大小达到临时写入阈值时,进行flush写入,其中临时写入阈值可以综合考虑存储区大小、数据块大小、临时写入模块/存储节点的性能等来确定。或者为了进一步减少flush次数,如图3所示的方法所述,由写入模块/写流处理模块来触发。
其中,临时写入请求包括本次需要写入的数据,这样是为了使得存储节点/存储节点的临时写入模块在接受到临时写入请求后,可以直接将对应的数据写入临时存储区。其中,临时存储区的一个重要的特点就是读写速度快,因此临时存储区可以是任何读写速度较快的存储区,比如可以是掉电易失性存储介质,可以是buffer等。此外,在分布式存储系统中,数据一般是以数据块(chunk)的形式在存储节点存储的,在这种情况下,临时写入请求中除了需要包含本次需要写入的数据,还需要包括数据块的信息,比如可以是数据块的数据块标识信息,以使得存储节点知晓数据该存放在哪个数据块中。
数据标识的作用是为了识别数据,也就是说,使得持久化写入模块/存储节点在收到包含数据标识的持久化写入请求的情况下,可以根据数据标识,得知需要将哪些数据写入持久化存储区,比如可以是数据在存储节点存储的地址信息,或者在数据以数据块形式存储时,数据标识可以是数据块标识。本说明书不限制数据标识的形式。
如上所述,待持久化列表是一个连接sync过程和write、flush过程的中介,使得两者解耦后也能够完成持久化过程。待持久化列表可以是任何形式的,比如可以是数组或者队列等等。待持久化列表中存储着需要完成持久化写入(也就是需要sync)的数据的数据标识。添加条件可以是某一数据已完成flush,在数据以数据块形式存储的情况下,也可以是临时存储区中某一数据块已满的情况下,将该数据块标识添加至待持久化列表。
此外,在客户端设备的存储区不够大的情况下,还需要在完成flush后,将客户端设备存储区中对应的内容删除,以使得客户端设备的存储区中有足够的空间,写入子模块/写流处理模块可以将数据写入。具体而言,临时写入模块,还用于在写入临时存储区的数据块完成后,向临时写入请求子模块/写流处理模块发送写入成功信息;临时写入请求子模块/写流处理模块,还用于在接收到写入成功信息后,删除所述存储空间中的对应的数据。
最后,在数据以数据块形式存储的情况下,数据标识为数据块标识;数据存储系统还可以包括一个中心节点,中心节点包括一个管理数据块的管理模块。所述从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表,包括:在满足临时写入条件的情况下,从客户端设备的存储区读取数据;检测当前数据块内空余空间是否够本次读取的数据的写入;若当前数据块内空余空间不够本次写入,则将当前数据块的数据块标识添加至待持久化列表,并从所述管理模块获取新的数据块作为当前数据块;向存储节点发送数据块写入请求,所述数据块写入请求中包括读取的数据及当前数据块的数据块标识。
具体而言,如图4A所示,图4A示出了上述过程的应用场景图,临时写入请求子模块/写流处理模块给管理模块发送信息来请求新的数据块,管理模块负责告知临时写入请求子模块/写流处理模块新的数据块的数据块标识,以使得flush流程可以继续。
对于整个flush过程来说,在数据以数据块形式存储的情况下,flush过程的执行过程如图4B所示,图4B是本说明书根据一实施例示出的一种数据写入存储节点临时存储区方法的流程图,包括以下步骤:
步骤401,临时写入请求子模块/写流处理模块在满足临时写入条件的情况下,从客户端设备的存储区读取数据。
步骤403,临时写入请求子模块/写流处理模块检测当前数据块内空余空间是否够本次读取的数据的写入。如果当前数据块空余空间不足够本次写入,则执行步骤405,如果当前数据块空余空间足够本次写入则执行步骤411。
在分布式存储系统中,每次flush过程中,一般是写入多个数据块,而不是只是写入一个数据块(不同数据块属于不同的存储节点),但是多个数据块由于写入的是完全一致的内容,因此本申请中,一个数据块空间不够的情况下,其他同步写入的其他数据块也是不够,因此本说明书实施例中,只以一个数据块的情况举例,多个数据块的情况与之相同,在多个数据块的情况下,管理模块发送的数据块标识是多个数据块的数据块标识。其中,管理模块发送的新的数据块标识对应的数据块可以和之前的当前数据块是同一存储节点的,也可以不是同一存储节点的,在图4A中,为了方便描述,以这两者是同一个存储节点的为例。
步骤405,临时写入请求子模块/写流处理模块将当前数据块的数据块标识添加至待持久化列表,并向管理模块请求新的数据块。
步骤407,管理模块根据临时写入请求子模块/写流处理模块的请求,向临时写入请求子模块/写流处理模块发送新的数据块的数据块标识。
步骤409,临时写入请求子模块/写流处理模块接收新的数据块的数据块标识。
步骤411,临时写入请求子模块/写流处理模块向存储节点/临时写入模块发送数据块写入请求,所述数据块写入请求中包括读取的数据及当前数据块的数据块标识。
步骤413,存储节点/临时写入模块,在接收到临时写入请求的情况下,将临时写入请求包括的数据写入所述临时存储区。
通过上述方法,可以完成写入临时存储区的flush过程。
接下来将对sync过程进行详细说明。
如上所述,持久化写入请求模块属于客户端设备,而持久化写入过程由存储节点执行,而持久化写入过程是将数据从存储节点的临时存储区写入持久化存储区,看起来和客户端设备并没有关系,需要客户端设备来执行这个步骤的目的为:如果是每个存储节点自身保存有一个待持久化列表的话,为了提升速度,可能需要在待持久化列表中的数据标识足够多的情况下,才会调用持久化写入过程,这样的话,如果很长一段时间内,只有一条数据写入临时存储区,那么可能这条数据很长时间不能进行持久化写入,那么反而增加了写入的时间。因此为了尽可能提高数据写入持久化存储区的速度,需要由客户端设备来控制持久化过程。此外,如果将该方法应用于分布式存储系统中的话,一份数据会存储在多个不同的存储节点上,需要保证存储在不同存储节点的相同的数据尽早持久化完成,因此由客户端设备来持久化过程的话,可以保证不同存储节点上的相同数据可以同步持久化。
其中,为了提升持久化写入速度,持久化条件可以是,在待持久化列表中的数据条数达到待持久化阈值的情况下,才会开始持久化,这样做的原因是为了节省调用sync的次数,如上所述,N次将多个小数据分别进行持久化写入所耗费的时间,要比一次性对N次的总共的数据进行持久化写入过程所耗费的时间要长,因此,在待持久化列表中数据条数达到一定值的情况下进行,可以提高持久化写入的效率。待持久化阈值可以根据临时存储区的大小、一次性持久化写入多少数据效率最高等方面,综合考虑来决定。
其中,考虑到如果待持久化列表很久没有更新的话,为了提升持久化写入速度,仍需要将待持久化列表中的数据持久化,持久化条件还可以是,在第一预设时间段内,待持久化列表中未添加新的待持久化的数据对应的数据标识的情况下。这样可以使得,即使很长时间没有更新待持久化列表,待持久化列表中的数据标识对应的数据也能持久化写入。
其中,在待持久化列表中的数据标识不止一个时,可以一次性向多个数据标识对应的持久化写入模块/存储节点发送持久化写入请求,其中,不同数据标识可以对应于不同的存储节点的持久化写入模块/存储节点,但是为了方便描述,在说明书附图中,仅以一个存储节点为例进行描述。
进一步地,如上所述,为了保证数据的可靠存储,需要使得中心节点知道哪些数据已经完成持久化存储了,因此,所述数据存储系统还包括中心节点,所述中心节点包括管理模块,所述中心节点具有已持久化列表;管理模块,获取已完成持久化写入的数据的数据标识,在已持久化列表中添加获取的数据标识。
其中,管理模块获取的数据标识可以是存储节点/存储节点的持久化写入模块在写入完后发送给管理模块的,也可以是客户端设备发送给中心节点的。进一步地,考虑到,如果待持久化列表中的数据标识对应的数据已经持久化写入完成,但是待持久化列表上没有显示该信息的话,那么持久化写入请求模块可能会向存储节点/存储节点的持久化写入模块发送,携带有已完成持久化写入的数据的数据标识,这样可能会消耗存储节点/存储节点持久化写入模块的多余资源,去分辨持久化写入请求中哪些数据标识对应的数据是还未完成持久化写入的,因此为了提高数据写入的效率,客户端设备的待持久化列表需要删除已完成持久化写入的数据的数据标识。因此基于上述考虑,在客户端设备可以得知每个数据是否已经完成持久化写入的情况下,为了保证存储节点写入数据的速度,可以选择由客户端设备来告知中心节点。
如图5A所示,图5A是本说明书根据一实施例示出的一种数据写入存储节点持久化存储区方法的一种应用场景图。在由客户端设备来告知中心节点哪些数据已完成持久化写入的情况下,存储节点/持久化写入模块,还要在数据完成持久化写入后,向所述持久化写入请求模块发送持久化写入成功信息,所述持久化写入成功信息包括本次已完成持久化写入的数据的数据标识;持久化写入请求模块,还要在接收到持久化写入成功信息的情况下,根据持久化写入成功信息包括的数据标识,告知所述管理模块该数据标识对应的数据已完成持久化写入。
在完成上述步骤的基础上,如上所述,客户端设备需要更新待持久化列表,删除已完成持久化写入的数据的数据标识,具体而言,包括:持久化写入请求模块,还要在接收到持久化成功信息的情况下,将已写入持久化存储区的数据块的信息从待持久化列表中删除。
此外,如果中心节点是根据记录一个文件已完成持久化存储的长度来记录哪些数据块已经完成持久化写入的话,由于文件是顺序存储的,因此为了保证中心节点可以通过得知已完成持久化存储的数据来更新已完成持久化的长度,考虑到在write和flush阶段是按照顺序写入的,因此,告知所述管理模块该数据标识对应的数据已完成持久化写入,包括:若待持久化列表中的第一个数据标识对应的数据已完成持久化写入,则向所述管理模块发送该第一个数据块对应的数据块状态更新信息。这样,使得更新的已完成持久化存储的长度是准确的。
在中心节点知晓哪些数据已完成持久化写入的情况下,可以更好地面对客户端设备故障。具体而言,如果客户端设备故障,客户端设备将无法继续write、flush和sync过程,由于三个过程是分开的,用户如果已经上传了100M数据,已经完成持久化写入的数据有80M的话,那么存储节点中存储的文件大小不一定会是多少,以存储节点中的数据有90M为例,这时,由于中心节点知道已完成持久化写入的数据有多少,就可以根据数据存放的地址,将10M的数据完成持久化写入,并通知用户从90M开始上传。这样,在客户端设备故障的情况下,由于中心节点可以得知多少数据已经完成持久化写入,使得在sync过程和其他过程解耦的情况下,也能保证完成持久化写入的数据是可靠的。
进一步地,为了应对存储节点在持久化写入过程中故障的情况,需要在持久化写入失败的情况下,由中心节点控制将持久化写入失败的数据在另一个存储节点上复原,并使得复原的数据完成持久化写入。其中,复原可以是从客户端设备的存储区,将数据复制到新的存储节点,也可以是从原本的存储节点上,将数据从原本的存储节点的临时存储区,复制到新的节点的存储区。为了提升复制速度,可以是先复制到新存储节点的临时存储区,再进行持久化写入。
以数据从原本存储节点复制到新存储节点的临时存储区为例,具体来说,如图5B所示,图5B是本说明书根据一实施例示出的一种数据写入存储节点持久化存储区方法的另一种应用场景图,图5B示出了上述流程。具体而言,所述数据存储系统还包括中心节点,所述中心节点包括管理模块;所述方法还包括:存储节点/持久化写入模块,在持久化写入失败的情况下,向所述持久化写入请求模块发送持久化写入失败消息;在持久化写入成功的情况下,向所述持久化写入请求模块发送持久化写入成功消息;持久化写入请求模块,在接收到持久化写入失败消息或预设时间内未收到持久化写入成功消息的情况下,向所述管理模块发送复制请求;接收管理模块针对所述复制请求的响应信息,所述响应信息中包括新存储节点的标识;向新存储节点/新存储节点的持久化写入模块发送持久化写入请求;管理模块,在接收到复制请求的情况下,确定持久化写入失败的数据所对应的存储节点,控制该存储节点/存储节点的临时写入模块,向指定的新存储节点/新存储节点的临时写入模块发送临时写入请求;在向新存储节点临时写入成功后,向持久化写入请求模块发送复制请求的响应信息。
结合以上两点,持久化写入(也就是sync)的过程,可以具体如图5C所示,图5C是本说明书根据一实施例示出的一种数据写入存储节点持久化存储区方法的流程图,包括以下步骤:
步骤501,持久化写入请求模块,在满足持久化条件的情况下,向所述存储节点/存储节点的持久化写入模块发送持久化写入请求。
步骤511,存储节点/持久化写入模块,在接收到持久化写入请求的情况下,根据持久化写入请求包括的数据标识,将对应的数据从所述临时存储区,写入所述持久化存储区。
步骤513,存储节点/持久化写入模块,在持久化写入成功的情况下,向持久化写入请求模块发送持久化发送成功消息;在持久化写入失败的情况下,向持久化写入请求模块发送持久化写入失败消息。
步骤503,持久化写入请求模块,判断持久化写入是否成功。成功的情况下步骤505,失败的情况下执行步骤507。
步骤505,持久化写入请求模块,更新待持久化列表,并向管理模块发送已完成持久化的数据的数据标识。
步骤521,管理模块在接收到已完成持久化的数据的数据标识的情况下,更新已持久化列表。
步骤507,持久化写入请求模块向管理模块发送复制请求。
步骤523,管理模块,在接收到复制请求的情况下,确定持久化写入失败的数据所对应的存储节点,控制该存储节点/存储节点的临时写入模块,向指定的新存储节点/新存储节点的临时写入模块发送临时写入请求。
步骤525,管理模块,在向新存储节点临时写入成功后,向持久化写入请求模块发送复制请求的响应信息。
步骤509,持久化写入请求模块,接收管理模块针对所述复制请求的响应信息,向新存储节点/新存储节点的持久化写入模块发送持久化写入请求。
通过上述方法,可以更新待持久化列表,提升写入速度,还可以使得中心节点得知哪些数据已完成持久化写入,保证数据的可靠存储。
上一部分是从每个模块所执行的步骤的角度对数据写入方法进行的说明。接下来,将从数据在数据存储系统中的流经过程对本说明书示出的数据写入方法进行详细说明。如图6所示,图6是本说明书根据数据流的处理过程示出的一种数据写入方法的流程图,包括以下步骤:
步骤601,用户发送数据写入请求。
步骤603,客户端设备写入子模块将用户上传的数据写入客户端设备的存储区。
步骤605,客户端设备临时写入请求子模块将客户端设备存储区的数据发送给存储节点的临时写入模块,临时写入模块将数据写入存储节点的临时存储区。
步骤607,持久化写入请求模块告知中心节点管理模块已完成持久化写入的数据。
上述实施例中数据写入方法中各个步骤的实现过程参见第一部分,在此不再赘述。
接下来将从以具体实施例对本说明书提供的数据写入方法进行说明。
以分布式存储系统为例,分布式存储系统包括若干个客户端设备(client),若干个存储节点(chunkserver),和中心节点(master)。假设一个用户要向分布式存储系统上传一个文件,通过客户端设备上传,客户端设备包括写入子模块、临时写入请求子模块、持久化写入请求模块、buffer及待持久化列表;每个存储节点都包括临时写入模块、持久化写入模块、buffer及硬盘;中心节点包括。那么以写入一个数据为例,本说明书提供的数据写入方法如图7A和图7B所示,包括以下步骤:
步骤701,用户发送数据写入请求。
用户的写入请求可能是携带write指令的请求,可能是携带sync指令的请求。
步骤703,写入子模块判断Buffer中空余空间是否足够。如果足够,则执行步骤707如果不足,则执行步骤705。
如上所述,只有buffer中空余空间足够才能完成写入。
步骤705,写入子模块触发临时写入请求子模块发送临时写入请求。
由于flush完成后会删除buffer中对应的数据,因此发送临时写入请求可以将客户端设备的buffer中的数据清除。在触发临时写入请求后,需要将当前的写入操作暂时挂起,等待flush完成。
步骤707,写入子模块将用户上传的数据写入客户端设备的buffer。
在接受到用户的写入请求后,在用户上传的文件大小达到一定大小时,可以将用户上传的数据上传至客户端设备的buffer,比如100M大小的文件,在达到128kb的时候可以进行一次写入。
步骤711,在满足临时写入条件的情况下,临时写入请求子模块判断当前数据块内空余空间是否足够。如果不足,则执行步骤713,如果足够,则执行步骤717。
如上所述,临时写入条件可以是用户触发、写入子模块触发或者客户端设备buffer中数据量达到一定值。
步骤713,将当前数据块的数据块标识添加至待持久化列表,并向管理模块请求新的数据块。
步骤721,管理模块根据临时写入请求子模块的请求,向临时写入请求子模块发送新的数据块的数据块标识。
步骤715,临时写入请求子模块接收管理模块发送的的新的数据块的数据块标识,并将新的数据块作为当前数据块。
步骤717,临时写入请求子模块读取客户端设备buffer中的数据,并向临时写入模块发送临时写入请求。
临时写入请求包含读取的数据的数据,以及指定的数据块的数据块标识,指定的数据块就是当前数据块。
步骤731,临时写入模块接收临时写入请求,根据临时写入请求中包含的数据写入buffer中指定的数据块。
步骤741,持久化写入请求模块,在满足持久化条件的情况下,向待持久化列表中的数据标识对应的存储节点发送持久化写入请求。
持久化写入请求中包含数据块标识,这样能使得持久化写入模块知晓将对哪些数据块进行持久化写入。
步骤751,持久化写入模块,响应于持久化写入请求,将持久化请求中包含的数据块标识对应的数据块从存储节点的buffer写入硬盘。
步骤753,持久化写入模块在持久化写入成功的情况下,向写入成功的数据块对应的持久化写入请求模块发送持久化写入成功消息;在持久化写入失败的情况下,向持久化写入请求模块发送持久化写入失败消息。
持久化写入成功和持久化写入失败消息中都包含对应的写入成功和写入失败的数据块的数据块标识。
步骤743,持久化写入请求模块判断持久化写入是否成功。如果成功执行步骤745,如果不成功执行步骤747。
步骤745,持久化写入请求模块更新待持久化列表,并向管理模块发送已完成持久化的数据块的数据块标识。
步骤723,管理模块在接收到已完成持久化写入的数据块的数据块标识的情况下,更新已持久化列表。
步骤747,向持久化写入请求模块管理模块发送复制请求。
复制请求中包含持久化写入失败的数据块的数据块标识,这样使得管理模块可以知晓将哪些数据块进行复制。
步骤725,管理模块在接收到复制请求的情况下,确定持久化写入失败的数据块所在的存储节点,控制该存储节点的临时写入模块向指定的新存储节点的临时写入模块发送临时写入请求。
步骤727,管理模块在向新存储节点临时写入成功后,向持久化写入请求魔偶快发送复制请求的响应信息。
步骤749,持久化写入请求模块接收管理模块针对复制请求的响应信息,向新存储节点的持久化写入模块发送持久化写入请求。
如图7C所示,通过上述步骤,实现了写流与持久化流解耦,提升了写入速度。其中写流处理模块包括写入子模块及临时写入请求子模块,中心节点和存储节点包括的模块在图中未示出。
本说明书一个或多个实施例中,数据存储系统中包括存储节点和客户端设备,客户端设备具有写入子模块、临时写入请求子模块、持久化写入请求模块、存储区及持久化列表,存储节点具有临时写入模块、持久化写入模块、临时存储区及持久化存储区;写入子模块负责将用户上传的数据写入存储区,临时写入请求子模块负责给存储节点的临时写入模块发送临时写入请求,以使临时写入模块将数据写入临时存储区,持久化写入模块负责给存储节点的持久化写入模块发送持久化写入请求,以使持久化写入模块将数据从临时存储区写入持久化存储区;其中,各个模块分别独立执行。通过将数据的持久化写入过程与数据临时写入过程解耦,使得速度较慢的持久化写入过程不会影响快速的数据临时写入的过程;相较于每次写入都调用持久化过程,持久化调用次数减少,提升了数据写入速度。
接下来将从客户端设备单侧所执行的数据写入方法和存储节点单侧执行的数据写入方法进行说明。
先从客户端设备侧执行的数据写入方法进行说明,如图8所示,图8是本说明书根据一示例性实施例示出的另一种数据写入方法的流程图。应用于数据存储系统的客户端设备,所述数据存储系统还包括存储节点;所述客户端设备包括写流处理模块,及持久化写入请求模块,各个模块分别独立执行:
步骤801,写流处理模块,接收用户的数据写入请求,将所述数据写入请求对应的数据写入客户端设备的存储区;从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,以使存储节点临时存储对应的数据,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表。
步骤803,持久化写入请求模块,向存储节点发送持久化写入请求,以使存储节点持久化存储对应的数据,所述持久化写入请求包括从所述待持久化列表中读取的数据标识。
其中,所述将所述数据写入请求对应的数据写入客户端设备的存储区,包括:根据所述数据写入请求,在数据大小满足写入条件的情况下,判断客户端设备的存储区的空余空间是否够本次写入;若所述空余空间不够本次写入,则触发向存储节点发送临时写入请求;向客户端设备的存储区写入数据。
其中,所述从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表,包括:在满足临时写入条件的情况下,从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表;其中,所述临时写入条件包括客户端设备的存储区中存储的数据大小达到临时写入阈值。
其中,数据在存储节点以数据块的形式存储,所述数据标识为数据块标识;该数据存储系统还包括中心节点,所述从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表,包括:在满足临时写入条件的情况下,从客户端设备的存储区读取数据;检测当前数据块内空余空间是否够本次读取的数据的写入;若当前数据块内空余空间不够本次写入,则将当前数据块的数据块标识添加至待持久化列表,并从所述管理模块获取新的数据块作为当前数据块;向存储节点发送数据块写入请求,所述数据块写入请求中包括读取的数据及当前数据块的数据块标识。
其中,所述数据存储系统还包括中心节点;所述方法还包括:持久化写入请求模块,在接收到持久化写入失败消息或预设时间内未收到持久化写入成功消息的情况下,向所述管理模块发送复制请求;接收管理模块针对所述复制请求的响应信息,所述响应信息中包括新存储节点的标识;向新存储节点发送持久化写入请求;管理模块,在接收到复制请求的情况下,确定持久化写入失败的数据所对应的存储节点,控制该存储节点,向指定的新存储节点发送临时写入请求;在向新存储节点临时写入成功后,向持久化写入请求模块发送复制请求的响应信息。
其中,所述写流处理模块包括写入子模块及临时写入请求子模块,各个模块分别独立执行:写入子模块,接收用户的数据写入请求,根据所述数据写入请求,将对应的数据写入所述存储区;临时写入请求子模块,在满足临时写入条件的情况下,从所述存储区读取数据,并向存储节点的临时写入模块发送临时写入请求,所述临时写入请求包括读取的数据;并在满足添加条件的情况下,将完成临时写入的数据的数据标识添加到所述待持久化列表。
再从存储节点侧所执行的数据写入方法进行说明,如图9所示,图9是本说明书根据一示例性实施例示出的又一种数据写入方法的流程图。应用于数据存储系统的存储节点,所述数据存储系统还包括客户端设备;所述方法包括:
步骤901,在接收到客户端设备发送的临时写入请求的情况下,将临时写入请求包括的数据写入存储节点的临时存储区。
步骤903,在接收到客户端设备发送的持久化写入请求的情况下,将对应的数据从临时存储区写入存储节点的持久化存储区。
其中,所述方法还包括存储节点在持久化写入失败的情况下,向所述持久化写入请求模块发送持久化写入失败消息;在持久化写入成功的情况下,向所述持久化写入请求模块发送持久化写入成功消息。
其中,所述存储节点包括:临时写入模块、持久化写入模块,临时存储区和持久化存储区;各模块分别独立执行:临时写入模块,在接收到临时写入请求的情况下,将临时写入请求包括的数据写入所述临时存储区;持久化写入模块,在接收到持久化写入请求的情况下,根据持久化写入请求包括的数据标识,将对应的数据从所述临时存储区,写入所述持久化存储区。
上述单侧的方法中各个模块的功能和作用的实现过程具体详见本说明书第一方面示出的数据写入方法中对应步骤的实现过程,在此不再赘述。
接下来将从分布式存储系统进行说明,本说明书提供一种数据存储系统,包括客户端设备和存储节点。
所述客户端设备包括写流处理模块,及持久化写入请求模块,各个模块分别独立执行:
写流处理模块,接收用户的数据写入请求,将所述数据写入请求对应的数据写入客户端设备的存储区;从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表;
持久化写入请求模块,向存储节点发送持久化写入请求,所述持久化写入请求包括从所述待持久化列表中读取的数据标识;
存储节点,在接收到临时写入请求的情况下,将临时写入请求包括的数据写入存储节点的临时存储区;在接收到持久化写入请求的情况下,将对应的数据从临时存储区写入存储节点的持久化存储区。
与前述方法的实施例相对应,本说明书还提供了数据写入装置及其所应用的终端的实施例。
如图10所示,图10是本说明书根据一示例性实施例示出的一种数据写入装置的框图,应用于数据存储系统的客户端设备,所述数据存储系统还包括存储节点;所述客户端设备包括写流处理模块,及持久化写入请求模块,各个模块分别独立执行:
写流处理模块1010,接收用户的数据写入请求,将所述数据写入请求对应的数据写入客户端设备的存储区;从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,以使存储节点临时存储对应的数据,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表。
持久化写入请求模块1020,向存储节点发送持久化写入请求,以使存储节点持久化存储对应的数据,所述持久化写入请求包括从所述待持久化列表中读取的数据标识。
其中,所述将所述数据写入请求对应的数据写入客户端设备的存储区,包括:根据所述数据写入请求,在数据大小满足写入条件的情况下,判断客户端设备的存储区的空余空间是否够本次写入;若所述空余空间不够本次写入,则触发向存储节点发送临时写入请求;向客户端设备的存储区写入数据。
其中,所述从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表,包括:在满足临时写入条件的情况下,从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表;其中,所述临时写入条件包括客户端设备的存储区中存储的数据大小达到临时写入阈值。
其中,数据在存储节点以数据块的形式存储,所述数据标识为数据块标识;该数据存储系统还包括中心节点,所述从所述存储区读取数据,向存储节点发送包括读取的数据的临时写入请求,并将完成临时写入的数据的数据标识添加到客户端设备的待持久化列表,包括:在满足临时写入条件的情况下,从客户端设备的存储区读取数据;检测当前数据块内空余空间是否够本次读取的数据的写入;若当前数据块内空余空间不够本次写入,则将当前数据块的数据块标识添加至待持久化列表,并从所述管理模块获取新的数据块作为当前数据块;向存储节点发送数据块写入请求,所述数据块写入请求中包括读取的数据及当前数据块的数据块标识。
其中,所述数据存储系统还包括中心节点;所述方法还包括:持久化写入请求模块,在接收到持久化写入失败消息或预设时间内未收到持久化写入成功消息的情况下,向所述管理模块发送复制请求;接收管理模块针对所述复制请求的响应信息,所述响应信息中包括新存储节点的标识;向新存储节点发送持久化写入请求;管理模块,在接收到复制请求的情况下,确定持久化写入失败的数据所对应的存储节点,控制该存储节点,向指定的新存储节点发送临时写入请求;在向新存储节点临时写入成功后,向持久化写入请求模块发送复制请求的响应信息。
其中,写流处理模块1010包括写入子模块及临时写入请求子模块,各个模块分别独立执行:写入子模块,接收用户的数据写入请求,根据所述数据写入请求,将对应的数据写入所述存储区;临时写入请求子模块,在满足临时写入条件的情况下,从所述存储区读取数据,并向存储节点的临时写入模块发送临时写入请求,所述临时写入请求包括读取的数据;并在满足添加条件的情况下,将完成临时写入的数据的数据标识添加到所述待持久化列表。
如图11所示,图11是本说明书根据一示例性实施例示出的另一种数据写入装置的框图应用于数据存储系统的存储节点,所述数据存储系统还包括客户端设备;所述装置包括:
临时写入模块1110,用于在接收到客户端设备发送的临时写入请求的情况下,将临时写入请求包括的数据写入存储节点的临时存储区。
持久化写入模块1120,用于在接收到客户端设备发送的持久化写入请求的情况下,将对应的数据从临时存储区写入存储节点的持久化存储区。
其中,持久化写入模块1120,还用于在持久化写入失败的情况下,向所述持久化写入请求模块发送持久化写入失败消息;在持久化写入成功的情况下,向所述持久化写入请求模块发送持久化写入成功消息。
其中临时写入模块1110和持久化写入模块1120可以分别独立执行。
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
如图12所示,图12示出了实施例数据写入装置所在计算机设备的一种硬件结构图,该设备可以包括:处理器1210、用于存储处理器可执行指令的存储器1220、输入/输出接口1230、通信接口1240和总线1250。其中处理器1210、存储器1220、输入/输出接口1230和通信接口1240通过总线1250实现彼此之间在设备内部的通信连接。其中,所述处理器通过运行所述可执行指令以实现如本说明书实施例第二方面或第三方面所述的数据写入方法。
处理器1210可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器1220可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1220可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1220中,并由处理器1210来调用执行。
输入/输出接口1230用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1240用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1250包括一通路,在设备的各个组件(例如处理器1210、存储器1220、输入/输出接口1230和通信接口1240)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1210、存储器1220、输入/输出接口1230、通信接口1240以及总线1250,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本说明书实施例第一至第三方面任一方面所述的数据写入方法。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
此外,本说明书实施例还提供一种计算机程序,该计算机程序被运行时实现如本说明书实施例第一至第三方面任一方面所述的数据写入方法。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。