分布式存储系统中的数据处理方法、装置和系统转让专利

申请号 : CN201810997240.1

文献号 : CN110874345B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 周泰

申请人 : 阿里巴巴集团控股有限公司

摘要 :

本申请公开了一种分布式存储系统中的数据处理方法、装置和系统。其中,该方法包括:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。本申请解决了由于需要用户处理读到文件尾的事件,并重新打开文件获取输入流,增加用户程序流程的复杂性的技术问题。

权利要求 :

1.一种分布式存储系统中的数据处理方法,包括:

生成数据读取请求,其中,所述数据读取请求的参数中携带了读取数据的偏移和长度;

在所述读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据,其中,所述文件的元数据中至少包括所述文件的当前长度;

在所述读取数据的偏移与长度之和小于所述分布式存储系统中文件的输出流中记录的当前长度的情况下,从所述文件中读取数据;

在根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据之前,所述方法还包括:在打开所述文件时,创建所述文件的输出流及所述文件的输入流;

在向所述输出流数据写入成功的情况下,在所述输出流的缓存中缓存所述文件的元数据和数据块的元数据。

2.根据权利要求1所述的数据处理方法,其中,在向所述输出流数据写入成功的情况下,所述方法还包括:在所述输出流中每成功写满一个数据块后,在名字节点中更新所述文件的元数据和所述文件的记录长度。

3.根据权利要求1所述的数据处理方法,其中,在创建所述文件的输出流之后,所述方法还包括:执行合法性检查,其中,所述合法性检查包括以下至少之一:参数合法性检查、所述输出流状态检查;

在通过所述合法性检查后,确定多个副本数据节点执行数据写入。

4.根据权利要求3所述的数据处理方法,其中,确定所述输出流数据写入成功包括:在目标数据节点和所述多个副本数据节点中的数据均写入成功的情况下,则确定所述输出流数据写入成功;

或者,在目标数据节点和所述多个副本数据节点中的数据写入成功的份数大于预设份数的情况下,则确定所述输出流数据写入成功。

5.根据权利要求1所述的数据处理方法,其中,所述方法还包括:在所述输出流数据写入失败的情况下,在所述输出流的缓存中缓存所述文件的元数据和数据写入失败的信息;

判断是否执行重试数据写入操作;

若执行重试数据写入操作,重新确定副本数据节点,继续执行合法性检查的步骤。

6.根据权利要求5所述的数据处理方法,其中,判断是否执行重试数据写入操作包括:判断重试数据写入操作的次数是否小于预设次数,若重试数据写入操作的次数小于所述预设次数,判定执行重试数据写入操作;和/或,判断当前时刻距获取所述数据读取请求的时刻是否未超过预设时长,若当前时刻距获取所述数据读取请求的时刻未超过预设时长,判定执行重试数据写入操作。

7.根据权利要求1所述的数据处理方法,其中,在创建所述文件的输入流之后,所述方法还包括:检查所述数据读取请求的合法性;

在所述数据读取请求通过合法性检查后,执行判断所述读取数据的字节长度是否超出所述文件的记录长度的步骤。

8.根据权利要求7所述的数据处理方法,其中,检查所述数据读取请求的合法性包括:检查所述输入流的状态是否正常;和/或

检查所述数据读取请求的参数是否具有合法性。

9.根据权利要求8所述的数据处理方法,其中,检查所述数据读取请求的参数是否具有合法性包括:检查所述数据读取请求的携带的缓存是否为空;和/或,检查所述数据读取请求的读取数据的字节长度是否为负数。

10.根据权利要求8所述的数据处理方法,其中,检查所述输入流的状态是否正常包括:检测所述输入流是否处于关闭状态;和/或

检测所述输入流是否处于损坏状态。

11.一种分布式存储系统中的数据处理装置,包括:生成模块,用于生成数据读取请求,其中,所述数据读取请求的参数中携带了读取数据的偏移和长度;

获取模块,用于根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据,其中,所述文件的元数据中至少包括所述文件的当前长度;

读取模块,用于根据获取到的所述文件的当前长度,从所述文件中读取数据;

其中,所述获取模块包括:第一缓存模块,用于在读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据;

所述读取模块包括:第一读取模块,用于在读取数据的偏移与长度之和小于分布式存储系统中文件的输出流中记录的当前长度的情况下,从文件中读取数据;

所述分布式存储系统中的数据处理装置还包括:创建模块,用于在打开文件时,创建文件的输出流及文件的输入流;第二缓存模块,用于在向输出流数据写入成功的情况下,在输出流的缓存中缓存文件的元数据和数据块的元数据。

12.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行以下步骤:生成数据读取请求,其中,所述数据读取请求的参数中携带了读取数据的偏移和长度;

在所述读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据,其中,所述文件的元数据中至少包括所述文件的当前长度;

在所述读取数据的偏移与长度之和小于所述分布式存储系统中文件的输出流中记录的当前长度的情况下,从所述文件中读取数据;

在根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据之前,方法还包括:在打开所述文件时,创建所述文件的输出流及所述文件的输入流;

在向所述输出流数据写入成功的情况下,在所述输出流的缓存中缓存所述文件的元数据和数据块的元数据。

13.一种计算机设备,其特征在于,所述计算机设备包括处理器,所述处理器用于运行程序,其中,在所述程序运行时执行以下步骤:生成数据读取请求,其中,所述数据读取请求的参数中携带了读取数据的偏移和长度;

在所述读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据,其中,所述文件的元数据中至少包括所述文件的当前长度;

在所述读取数据的偏移与长度之和小于所述分布式存储系统中文件的输出流中记录的当前长度的情况下,从所述文件中读取数据;

在根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据之前,方法还包括:在打开所述文件时,创建所述文件的输出流及所述文件的输入流;

在向所述输出流数据写入成功的情况下,在所述输出流的缓存中缓存所述文件的元数据和数据块的元数据。

14.一种分布式存储系统中的数据处理系统,其特征在于,包括:处理器;以及

存储器,与所述处理器连接,用于为所述处理器提供处理以下处理步骤的指令:生成数据读取请求,其中,所述数据读取请求的参数中携带了读取数据的偏移和长度;

在所述读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据,其中,所述文件的元数据中至少包括所述文件的当前长度;

在所述读取数据的偏移与长度之和小于所述分布式存储系统中文件的输出流中记录的当前长度的情况下,从所述文件中读取数据;

在根据所述数据读取请求从分布式存储系统中文件的输出流的缓存中获取所述文件的元数据之前,方法还包括:在打开所述文件时,创建所述文件的输出流及所述文件的输入流;

在向所述输出流数据写入成功的情况下,在所述输出流的缓存中缓存所述文件的元数据和数据块的元数据。

说明书 :

分布式存储系统中的数据处理方法、装置和系统

技术领域

[0001] 本申请涉及计算机存储领域,具体而言,涉及一种分布式存储系统中的数据处理方法、装置和系统。

背景技术

[0002] 分布式存储系统可将数据分散存储在多台独立的设备上,其可将数据存储为多个副本,不再对数据进行备份,提高了对数据的存储速率,节省了存储时间。其中,分布式存储系统包含名字节点和数据节点,用于对外提供文件存储服务。
[0003] 然而用户在使用分布式存储系统存储文件时,需要分布式存储系统能够提供“Read Your Writes”(即“读你所写”)的一致性承诺,即在同一进程内,当用户成功写入数据时,客户端发起读取数据的请求之后,即可读取写入的数据。
[0004] 现有技术通常采用如下方案实现“读你所写”。具体的,写数据时,用户首先需要打开文件File,以得到输出流Output,然后用户通过输出流Output写入数据D1。当用户打开文件File时,可以得到输入流Input1,用户通过输入流Input1可以读取到数据D1。当用户通过输出流Output在文件File中写入数据D2时,由于输入流Input1所记录的文件中不包含写入数据D2,即输入流Input1所记录的文件长度小于此时的文件File的文件长度,因此,用户无法直接读取数据D2,需要关闭文件File,然后再打开文件File,才能得到输入流Input2,并通过输入流Input2读取到数据D2。
[0005] 在进行“读你所写”的过程中,需要用户处理读到文件尾的事件,并需要重新打开文件以获取输入流,增加了用户程序流程的复杂性。并且,打开文件并获得数据流需要两倍的往返时延,相当于进行了重操作,增加了读操作的平均时延。另外,在获取数据流的过程中,需要频繁联系名字节点和数据节点,由此增加了名字节点和数据节点的负载。
[0006] 针对上述由于需要用户处理读到文件尾的事件,并重新打开文件获取输入流,增加用户程序流程的复杂性的问题,目前尚未提出有效的解决方案。

发明内容

[0007] 本发明实施例提供了一种分布式存储系统中的数据处理方法、装置和系统,以至少解决由于需要用户处理读到文件尾的事件,并重新打开文件获取输入流,增加用户程序流程的复杂性的技术问题。
[0008] 根据本发明实施例的一个方面,提供了一种分布式存储系统中的数据处理方法,包括:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。
[0009] 根据本发明实施例的另一方面,还提供了一种分布式存储系统中的数据处理装置,包括:生成模块,用于生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;获取模块,用于根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;读取模块,用于根据获取到的文件的当前长度,从文件中读取数据。
[0010] 根据本发明实施例的另一方面,还提供了一种存储介质,该存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行以下步骤:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。
[0011] 根据本发明实施例的另一方面,还提供了一种计算机设备,该计算机设备包括处理器,处理器用于运行程序,其中,在程序运行时执行以下步骤:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。
[0012] 根据本发明实施例的另一方面,还提供了一种分布式存储系统中的数据处理系统,包括:处理器;以及存储器,与处理器连接,用于为处理器提供处理以下处理步骤的指令:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。
[0013] 在本发明实施例中,在生成数据读取请求之后,客户端根据数据读写请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,以得到文件的当前长度,然后,根据获取到的文件的当前长度从文件中读取数据。其中,数据读取请求的参数中携带了读取数据的偏移和长度,文件的元数据中至少包括文件的当前长度。
[0014] 在上述过程中,当用户在文件中成功写入数据之后,名字节点中记录的文件长度有可能小于文件成功写入数据之后的长度,即名字节点记录的元数据不是最新的元数据,此时,读操作对应的输入流从名字节点获取的元数据也不是最新的元数据,而文件的输出流的缓存中有文件最新的元数据,因此,通过读取输出流的缓存即可读取到最新的元数据,无需再对实例文件进行关闭,从而降低了用户程序流程的复杂性。。
[0015] 由上述内容可知,本申请所提供的方案可以达解决由于需要用户处理读到文件尾的事件,并重新打开文件获取输入流,增加用户程序流程的复杂性的技术问题。

附图说明

[0016] 此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
[0017] 图1是根据本申请实施例的一种用于实现分布式存储系统中的数据处理方法的计算机终端(或移动设备)的硬件结构框图;
[0018] 图2是根据本申请实施例的一种分布式存储系统中的数据处理方法的流程图;
[0019] 图3是根据本申请实施例的一种可选的文件的示意图;
[0020] 图4是根据本申请实施例的一种可选的输出流中数据处理方法的流程图;
[0021] 图5是根据本申请实施例的一种可选的输入流中数据处理方法的流程图;
[0022] 图6是根据本申请实施例的一种分布式存储系统中的数据处理装置的结构示意图;以及
[0023] 图7是根据本申请实施例的一种计算机设备的结构框图。

具体实施方式

[0024] 为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
[0025] 需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0026] 首先,在对本申请实施例进行描述的过程中出现的部分名词或术语适用于如下解释:
[0027] Read Your Writes,即“读你所写”,是用户和存储系统间的一致性约定,该约定规定:在用户收到存储系统确认数据成功写入文件的消息之后,用户可以读取写入的数据。
[0028] 数据块(Chunk),是分布式存储系统中存储数据的最小单位。具体的,用户的大文件会被分布式存储系统的客户端库切分为数据块,以存储到不同的数据节点中。
[0029] 元数据:描述分布式存储系统文件组织信息、路由信息的数据。
[0030] 名字节点,指分布式存储系统中用于存储文件与数据块的映射关系、数据块的路由信息等元数据的节点。
[0031] 数据节点,指分布式存储系统中用于存储数据块的副本的节点。
[0032] 往返时延,Round‑trip time,简称为RTT,是指从通信发起端发出请求到通信发起端收到响应的时间段。
[0033] 输入流,指将数据源读取到程序的通信通道。
[0034] 输出流,指将数据源输出至显示器、打印机、文件、网络等的通信通道。
[0035] 实施例1
[0036] 根据本申请实施例,还提供了一种分布式存储系统中的数据处理方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0037] 本申请实施例一所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。图1示出了一种用于实现分布式存储系统中的数据处理方法的计算机终端(或移动设备)的硬件结构框图。如图1所示,计算机终端A(或移动设备A)可以包括一个或多个(图中采用102a、102b,……,102n来示出)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器104、以及用于通信功能的传输装置106。除此以外,还可以包括:显示器、输入/输出接口(I/O接口)、通用串行总线(USB)端口(可以作为I/O接口的端口中的一个端口被包括)、网络接口、电源和/或相机。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算机终端A还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
[0038] 应当注意到的是上述一个或多个处理器102和/或其他数据处理电路在本文中通常可以被称为“数据处理电路”。该数据处理电路可以全部或部分的体现为软件、硬件、固件或其他任意组合。此外,数据处理电路可为单个独立的处理模块,或全部或部分的结合到计算机终端A(或移动设备)中的其他元件中的任意一个内。如本申请实施例中所涉及到的,该数据处理电路作为一种处理器控制(例如与接口连接的可变电阻终端路径的选择)。
[0039] 存储器104可用于存储应用软件的软件程序以及模块,如本申请实施例中的分布式存储系统中的数据处理方法对应的程序指令/数据存储装置,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的分布式存储系统中的数据处理方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端A。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0040] 传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端A的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
[0041] 显示器可以例如触摸屏式的液晶显示器(LCD),该液晶显示器可使得用户能够与计算机终端A(或移动设备)的用户界面进行交互。
[0042] 需要说明的是,在本实施例中,分布式存储系统由一组名字节点和一组数据节点组成,对外提供存储服务。在客户端将数据写入文件的过程中,分布式存储系统将用户写入的原始数据切分为多个数据块,并将具有相同数据块的不同副本存储至多个数据节点中。同时,分布式存储系统还将文件与数据块的映射关系、数据块的路由信息等元数据存储在名字节点中。
[0043] 为了降低写操作的延迟,在分布式存储系统中采用了降低通信次数的优化技术,具体为,客户端收到数据节点确认写成功之后,不会立即去名字节点更新文件长度,而是在写满一个chunk之后,再联系名字节点更新文件长度。因此,在写操作成功但未写满一个chunk的情况下,文件最后一个chunk实际写成功的长度会大于名字节点记录的文件长度。这样,客户端的读操作就读不到最新的数据(读操作从名字节点获取到的元数据不是最新的),不满足Read Your Writes的要求。
[0044] 具体的,客户端与分布式存储系统中的名字节点进行关联,得到包含文件长度的文件元数据以及数据块的元数据的列表,将列表中的最后一个数据块记为LastChunk,则LastChunk的记录长度RecordLength应该小于等于实际成功写入文件的长度RealLength。为了读取到最新写入文件的数据,客户端需要联系多个数据节点以查询LastChunk对应的多个副本的长度,并确定LastChunk实际成功写入文件的长度RealLength。其中,如果RealLength大于RecordLength,则根据RealLength调整文件长度,并根据文件的元数据以及数据块的元数据得到数据流。
[0045] 在上述运行环境下,本申请提供了如图2所示的分布式存储系统中的数据处理方法。其中,客户端可执行本申请所提供的数据处理方法。具体的,由图2所示的分布式存储系统中的数据处理方法的流程图可知,本申请所提供的数据处理方法可以包括:
[0046] 步骤S202,生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度。
[0047] 客户端需要读取数据时生成数据读取请求,数据读取请求是客户端对分布式存储系统中存储的文件进行数据读取的请求。
[0048] 步骤S204,根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度。
[0049] 在一种可选的方案中,客户端首先从名字节点中获取文件的元数据,在读取数据的偏移与长度之和不大于名字节点中记录的文件长度的情况下,根据从名字节点中获取的元数据执行数据读取操作;在读取数据的偏移与长度之和大于名字节点中记录的文件长度的情况下,客户端根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据。
[0050] 如前所述,当用户在文件中成功写入数据但未写满一个数据块的情况下,名字节点中记录的文件的长度不是最新的长度,此时,对最新数据的读取请求携带的偏移与长度之和会大于名字节点中记录的长度,例如,文件的记录长度为L1,用户写入的输入的字节数为L2(即偏移),则读取数据的偏移与长度之和为L1+L2,大于名字节点中记录的长度L1。在创建输入流时,输入流会从名字节点获取包括文件长度的元数据,此时,文件的输入流中对应的元数据并不包含用户新写入的数据信息。因此,从文件的输入流中得不到最新的数据,此时,可从文件的输出流的缓存获取到最新的元数据。
[0051] 这样,通过读取输出流的缓存即可读取到文件最新的元数据,无需再对文件进行关闭,从而降低了用户程序流程的复杂性。
[0052] 步骤S206,根据获取到的文件的当前长度,从文件中读取数据。
[0053] 需要说明的是,在读取数据的偏移与长度之和小于分布式存储系统中文件的输出流中记录的当前长度的情况下,客户端从文件中读取数据;在读取数据的偏移与长度之和大于分布式存储系统中文件的输出流中记录的当前长度的情况下,说明数据读取请求错误,数据读取失败。
[0054] 基于上述步骤S202至步骤S206所限定的方案,可以获知,在获取数据读取请求之后,客户端根据数据读写请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,以得到文件的当前长度,然后,根据获取到的文件的当前长度从文件中读取数据。其中,数据读取请求的参数中携带了读取数据的偏移和长度,文件的元数据中至少包括文件的当前长度。
[0055] 容易注意到的是,当用户在文件中成功写入数据之后,名字节点中记录的文件长度有可能小于文件成功写入数据之后的长度,即名字节点记录的元数据不是最新的元数据,此时,读操作对应的输入流中从名字节点获取的元数据也不是最新的元数据,而文件的输出流的缓存中有文件最新的元数据,因此,通过读取输出流的缓存即可读取到成功最新的元数据,无需再对实例文件进行关闭,从而降低了用户程序流程的复杂性。
[0056] 由上述内容可知,本申请所提供的方案可以达解决由于需要用户处理读到文件尾的事件,并重新打开文件获取输入流,增加用户程序流程的复杂性的技术问题。
[0057] 本申请所提供的数据处理方法,在步骤S202之前还可包括如下步骤:
[0058] 步骤S20,在打开文件时,创建文件的输出流及文件的输入流。
[0059] 在一种可选的方案中,文件包括N个数据块,需要在文件中写数据时,客户端打开文件创建文件的输出流,并创建M个空的数据块,以供新数据的写入,每个数据块的长度均为0。在创建文件的输出流之后,客户端进一步创建与数据流关联的输入流,并对输入流进行初始化。
[0060] 具体的,如图3所示的文件的示意图,在图3中数据块1至数据块N为文件的输入流所感知到的文件,数据块1至数据块N+M为文件的输出流所感知到的文件,其中,数据块N+1至数据块N+M中未存储任何数据,用于新数据的写入。
[0061] 步骤S22,在向输出流数据写入成功的情况下,在输出流的缓存中缓存文件的元数据和数据块的元数据。
[0062] 具体的,在创建文件的输入流以及输出流之后,客户端可通过判断目标数据节点与多个副本数据节点中的数据写入是否均成功,或者,判断目标数据节点和多个副本数据节点中的数据写入成功的份数是否大于预设份数来确定在文件中的数据写入是否成功。
[0063] 在一种可选的方案中,图4示出了一种可选的输出流中数据处理方法的流程图。具体的,客户端首先创建输出流,再对相关的数据信息进行合法性检查,并确定多个副本数据节点执行数据写入。然后,客户端判断数据是否写入成功,其中,在数据写入成功之后,在输出流的缓存中缓存文件的元数据和数据块的元数据。如果文件中的数据写入失败,则客户端在输出流的缓存中缓存文件的元数据,并判断是否执行重试数据写入操作。如果确定执行重试数据写入操作,则客户端重新确定副本数据节点,继续执行合法性检查的步骤;如果确定不执行重试数据写入操作,则结束输出流中对数据的处理。
[0064] 在一种可选的方案中,在向输出流数据写入成功的情况下,客户端在输出流中每成功写满一个数据块后,在名字节点中更新文件的元数据和文件的记录长度,例如,更新文件的字节长度、数据块中元数据的字节长度。需要说明的是,分布式存储系统中的数据节点用于存储相同数据块的不同副本,名字节点用于存储文件与数据块的映射关系以及数据块的路由信息等。
[0065] 可选的,分布式存储系统调用输出流的函数,并在文件中写入长度为L1的数据D1。在成功写入数据之后,客户端将输出流中的文件长度更新为FL+L1(写入数据之前,文件的文件长度为FL),同时将图3中的数据块N+1中的文件长度更新为L1,但此时,文件的文件长度以及数据块的文件长度未更新至名字节点,即输入流中对应文件长度仍为FL。
[0066] 进一步地,如图4所示,在创建文件的输出流之后,客户端还执行合法性检查,并在通过合法性检查后,确定多个副本数据节点执行数据写入。其中,合法性检查至少包括:参数合法性检查、输出流状态检查。
[0067] 在一种可选的方案中,客户端首先确定输出流中的缓存是否为空,在缓存不为空的情况下,继续检测文件的当前长度是否大于最大写入长度。如果文件的当前长度小于等于最大写入长度,则确定参数合法性检查通过;否则,确定参数合法性检查不通过。其中,参数合法性检查的逻辑如下:
[0068] buffer!=NULL;
[0069] length<=MAX_WRITE_LENGTH;
[0070] 其中,buffer为输出流中的缓存大小,length为文件的当前长度,MAX_WRITE_LENGTH为文件的最大写入长度。
[0071] 在一种可选的方案中,客户端通过检测输出流状态是否正常来确定输出流状态检查是否通过。可选的,输出流状态检查的逻辑如下:
[0072] mStreamStatus==STREAM_STATUS_NORMAL
[0073] 其中,mStreamStatus为输出流状态变量,STREAM_STATUS_NORMAL为输出流状态正常参数。
[0074] 需要说明的是,在对输出流进行合法性检查的过程中,参数合法性检查、输出流状态检查可并列进行,也可在参数合法性检查通过的情况下,进一步进行输出流状态检查,或者,在输出流状态检查通过的情况下,进一步进行参数合法性检查。
[0075] 在一种可选的方案中,在通过合法性检查后,客户端采用星型拓扑结构来完成多个副本数据节点的数据写入操作。
[0076] 需要说明的是,采用星型拓扑结构可以有效降低往返时延。例如,客户端配置了三个副本数据节点,如果采用链状拓扑结构,则在执行数据写入操作时,需要经过三跳网络,数据写入操作对应的往返时延是未配置副本数据节点之前的三倍。而采用星型拓扑结构,在执行数据写入操作时,仅需要经过一个跳网络,数据写入操作对应的往返时延与未配置副本数据节点之前的往返时延相同。由此可见,采用星型拓扑结构可以有效降低往返时延。
[0077] 由图4可知,在完成合法性检查,并确定多个副本数据节点执行数据写入之后,客户端进一步判断在文件中数据写入是否成功,其中,判断方法可以包括:在目标数据节点和多个副本数据节点中的数据均写入成功的情况下,则确定输出流数据写入成功;或者,在目标数据节点和多个副本数据节点中的数据写入成功的份数大于预设份数的情况下,则确定输出流数据写入成功。
[0078] 在一种可选的方案中,在输出流数据写入失败的情况下,客户端在输出流的缓存中缓存文件的元数据和数据写入失败的信息,并判断是否执行重试数据写入操作。其中,若执行重试数据写入操作,则客户端重新确定副本数据节点,继续执行合法性检查的步骤。
[0079] 需要说明的是,客户端判断是否执行重试数据写入操作可以包括:判断重试数据写入操作的次数是否小于预设次数,若重试数据写入操作的次数小于预设次数,则客户端判定执行重试数据写入操作;和/或,判断当前时刻距获取数据读取请求的时刻是否未超过预设时长,若当前时刻距获取数据读取请求的时刻未超过预设时长,则客户端判定执行重试数据写入操作。
[0080] 在一种可选的方案中,图5示出了一种可选的输入流中数据处理方法的流程图。具体的,客户端首先创建输入流,并检测数据读取请求的合法性。在确定数据读取请求通过合法性检查之后,客户端判断读取数据的字节长度是否超出文件的记录长度。其中,如果读取数据的字节长度大于文件的记录长度,则客户端从数据流的缓存中拉取文件,并获取文件的元数据,然后再判断读取数据的字节长度是否大于文件的记录长度,如果此时读取数据的字节长度不大于文件的记录长度,则从文件的元数据中读取数据,否则,结束输入流中对数据的处理。
[0081] 在一种可选的方案中,如图4所示,在创建文件的输入流之后,客户端检查数据读取请求的合法性,并在数据读取请求通过合法性检查后,执行判断读取数据的字节长度是否超出文件的记录长度的步骤。其中,检查数据读取请求的合法性可以包括:检查输入流的状态是否正常;和/或检查数据读取请求的参数是否具有合法性。
[0082] 具体的,检查输入流的状态是否正常可以包括检测输入流是否处于关闭状态;和/或检测输入流是否处于损坏状态。可选的,如果检测到输入流处于关闭状态,则确定输入流的状态异常,其中,可通过检测与输入流对应的输入信息来确定输入流是否处于关闭状态。可选的,如果检测到输入流处于损坏状态(例如,输入流中的数据为乱码),则确定输入流异常。还存在一种可选的方案,在检测到输入流处于开启状态之后,继续检测输入流是否处于损坏状态,如果输入流也未处于损坏状态,则确定输入流的状态正常。如果输入流处于关闭状态,而输入流处于未损坏状态,则确定输入流的状态异常。
[0083] 另外,检查数据读取请求的参数是否具有合法性包括:检查数据读取请求的携带的缓存是否为空;和/或,检查数据读取请求的读取数据的字节长度是否为负数。可选的,如果检测到数据读取请求的携带的缓存为空,则确定数据读取请求的参数不具有合法性。可选的,如果检测到数据读取请求的读取数据的字节长度为负数,则确定数据读取请求的参数不具有合法性。还存在一种可选的方案,在检查数据读取请求的携带的缓存不为空之后,如果数据读取请求的读取数据的字节长度为负数,则确定数据读取请求的参数不具有合法性;如果数据读取请求的读取数据的字节长度不为负数,则确定数据读取请求的参数具有合法性。
[0084] 需要说明的是,在确定了数据读请求的参数具有合法性之后,客户端根据读取数据的字节长度与文件的记录长度读取数据。在一种可选的方案中,文件的记录长度为FL,输出流的缓存中的字节长度为FL+L1。具体的,客户端调用输入流的读函数,并判断读取数据的字节长度是否在0至FL之间。如果读取数据的字节长度在0至FL之间,则客户端直接从文件的元数据中读取数据;如果读取数据的字节长度在FL至FL+L1之间,则客户端拉取输出流的缓存中文件的元数据以及数据块的元数据,从而得到数据块N+1的路由信息,即可读取字节长度在FL至FL+L1之间的数据。
[0085] 还需要说明的是,如果用户连续写入了多个数据,则在从输出流的缓存中拉取文件的元数据之后,即可读取到用户连续写入的多个数据。
[0086] 另外,客户端一般仅支持“一个写者,多个读者”的访问模式。在本实施例中,可以采用一对一的关联关系读取数据,即在同一进程内,只有一个输入流关联到输出流,并从输出流的缓存中拉取的文件的元数据,对外提供Read Your Writes的一致性服务。
[0087] 在另一种可选的方案中,本申请还可采用一对多的关联关系读取数据,即在用户进程中存在多个输入流关联到同一个输出流,多个输入流通过从输出流的缓存中拉取缓存的元数据,对外提供Read Your Writes的一致性服务。
[0088] 需要说明的是,在本申请中,客户端在收到数据节点确认写成功之后,并不会立即在名字节点中更新文件的文件长度,而是在写满一个数据块之后,再联系名字节点更新文件长度。因此,文件中的最后一个数据块实际写入的文件长度可能会大于名字节点所记录的文件长度。
[0089] 最后,在本实施例所提供的方案中,输入流只需要从输出流拉取新增的元数据即可实现Read Your Writes的服务。在这个过程中,客户端无需向名字节点和数据节点发起请求,从而减轻了对名字节点和数据节点的压力。另外,输入流从输出流拉取新增元数据的过程是同进程内的内存访问,其往返时延远低于2倍的往返时延,从而降低了读写操作的平均时延。最后,在本申请所提供的方案中,用户无需重新打开输入流,从而简化了用户程序的处理流程。
[0090] 需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
[0091] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的分布式存储系统中的数据处理方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
[0092] 实施例2
[0093] 根据本申请实施例,还提供了一种用于实施上述分布式存储系统中的数据处理方法的分布式存储系统中的数据处理装置,如图6所示,该装置60包括:生成模块601、获取模块603以及读取模块605。
[0094] 其中,生成模块601,用于生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;获取模块603,用于根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;读取模块605,用于根据获取到的文件的当前长度,从文件中读取数据。
[0095] 此处,需要说明的是,上述生成模块601、获取模块603以及读取模块605对应于实施例1中的步骤S202至步骤S206,三个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端A中。
[0096] 在一种可选的方案中,获取模块包括:第一缓存模块。其中,第一缓存模块,用于在读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据。
[0097] 在一种可选的方案中,读取模块包括:第一读取模块。其中,第一读取模块,用于在读取数据的偏移与长度之和小于分布式存储系统中文件的输出流中记录的当前长度的情况下,从文件中读取数据。
[0098] 在一种可选的方案中,分布式存储系统中的数据处理装置还包括:创建模块以及第二缓存模块。其中,创建模块,用于在打开文件时,创建文件的输出流及文件的输入流;第二缓存模块,用于在向输出流数据写入成功的情况下,在输出流的缓存中缓存文件的元数据和数据块的元数据。
[0099] 此处,需要说明的是,上述创建模块以及第二缓存模块对应于实施例1中的步骤S20至步骤S22,两个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端A中。
[0100] 在一种可选的方案中,在向输出流数据写入成功的情况下,分布式存储系统中的数据处理装置还包括:更新模块。其中,更新模块,用于在输出流中每成功写满一个数据块后,在名字节点中更新文件的元数据和文件的记录长度。
[0101] 在一种可选的方案中,分布式存储系统中的数据处理装置还包括:第一执行模块以及第一确定模块。其中,第一执行模块,用于执行合法性检查,其中,合法性检查包括以下至少之一:参数合法性检查、输出流状态检查;第一确定模块,用于在通过合法性检查后,确定多个副本数据节点执行数据写入。
[0102] 在一种可选的方案中,第一确定模块包括:第二确定模块以及第三确定模块。其中,第二确定模块,用于在目标数据节点和多个副本数据节点中的数据均写入成功的情况下,则确定输出流数据写入成功;第三确定模块,用于在目标数据节点和多个副本数据节点中的数据写入成功的份数大于预设份数的情况下,则确定输出流数据写入成功。
[0103] 在一种可选的方案中,分布式存储系统中的数据处理装置还包括:第三缓存模块、判断模块以及第二执行模块。其中,第三缓存模块,用于在输出流数据写入失败的情况下,在输出流的缓存中缓存文件的元数据和数据写入失败的信息;判断模块,用于判断是否执行重试数据写入操作;第二执行模块,用于若执行重试数据写入操作,重新确定副本数据节点,继续执行合法性检查的步骤。
[0104] 在一种可选的方案中,判断模块包括:第一判断模块。其中,第一判断模块,用于判断重试数据写入操作的次数是否小于预设次数,若重试数据写入操作的次数小于预设次数,判定执行重试数据写入操作;和/或,判断当前时刻距获取数据读取请求的时刻是否未超过预设时长,若当前时刻距获取数据读取请求的时刻未超过预设时长,判定执行重试数据写入操作。
[0105] 在一种可选的方案中,分布式存储系统中的数据处理装置还包括:检查模块以及第三执行模块。其中,检查模块,用于检查数据读取请求的合法性;第三执行模块,用于在数据读取请求通过合法性检查后,执行判断读取数据的字节长度是否超出文件的记录长度的步骤。
[0106] 在一种可选的方案中,检查模块包括:第一检查模块。其中,第一检查模块,用于检查输入流的状态是否正常;和/或检查数据读取请求的参数是否具有合法性。
[0107] 在一种可选的方案中,第一检查模块包括:第二检查模块。其中,第二检查模块,用于检查数据读取请求的携带的缓存是否为空;和/或,检查数据读取请求的读取数据的字节长度是否为负数。
[0108] 在一种可选的方案中,第一检查模块包括:第三检查模块。其中,第三检查模块,用于检测输入流是否处于关闭状态;和/或检测输入流是否处于损坏状态。
[0109] 实施例3
[0110] 根据本申请实施例,还提供了一种分布式存储系统中的数据处理系统,该系统可执行分布式存储系统中的数据处理方法。具体的,该系统包括:处理器以及存储器。
[0111] 其中,存储器与处理器连接,用于为处理器提供处理以下处理步骤的指令:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。
[0112] 在一种可选的方案中,在读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,处理器根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据。
[0113] 在一种可选的方案中,在读取数据的偏移与长度之和小于分布式存储系统中文件的输出流中记录的当前长度的情况下,处理器从文件中读取数据。
[0114] 在一种可选的方案中,在根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据之前,处理器在打开文件时,创建文件的输出流及文件的输入流;在向输出流数据写入成功的情况下,在输出流的缓存中缓存文件的元数据和数据块的元数据。。
[0115] 在一种可选的方案中,在向输出流数据写入成功的情况下,在输出流中每成功写满一个数据块后,处理器在名字节点中更新文件的元数据和文件的记录长度。
[0116] 在一种可选的方案中,在创建文件的输出流之后,处理器执行合法性检查,其中,合法性检查包括以下至少之一:参数合法性检查、输出流状态检查;在通过合法性检查后,确定多个副本数据节点执行数据写入。
[0117] 在一种可选的方案中,处理器在目标数据节点和多个副本数据节点中的数据均写入成功的情况下,则确定输出流数据写入成功;或者,在目标数据节点和多个副本数据节点中的数据写入成功的份数大于预设份数的情况下,则确定输出流数据写入成功。。
[0118] 在一种可选的方案中,在输出流数据写入失败的情况下,处理器在输出流的缓存中缓存文件的元数据和数据写入失败的信息,并判断是否执行重试数据写入操作。其中,若执行重试数据写入操作,重新确定副本数据节点,继续执行合法性检查的步骤。
[0119] 在一种可选的方案中,处理器判断重试数据写入操作的次数是否小于预设次数,若重试数据写入操作的次数小于预设次数,判定执行重试数据写入操作;和/或,判断当前时刻距获取数据读取请求的时刻是否未超过预设时长,若当前时刻距获取数据读取请求的时刻未超过预设时长,判定执行重试数据写入操作。
[0120] 在一种可选的方案中,在创建文件的输入流之后,处理器检查数据读取请求的合法性,并在数据读取请求通过合法性检查后,执行判断读取数据的字节长度是否超出文件的记录长度的步骤。
[0121] 在一种可选的方案中,处理器通过以下方式检查数据读取请求的合法性:检查输入流的状态是否正常;和/或检查数据读取请求的参数是否具有合法性。
[0122] 在一种可选的方案中,处理器通过以下方式检查数据读取请求的参数是否具有合法性:检查数据读取请求的携带的缓存是否为空;和/或,检查数据读取请求的读取数据的字节长度是否为负数。
[0123] 在一种可选的方案中,通过以下方式检查输入流的状态是否正常:检测输入流是否处于关闭状态;和/或检测输入流是否处于损坏状态。
[0124] 实施例4
[0125] 本申请的实施例可以提供一种计算机设备,该计算机设备可以是计算机设备群中的任意一个计算机终端设备。可选地,在本实施例中,上述计算机设备也可以替换为移动终端等终端设备。
[0126] 可选地,在本实施例中,上述计算机设备可以位于计算机网络的多个网络设备中的至少一个网络设备。
[0127] 在本实施例中,上述计算机设备可以执行分布式存储系统中的数据处理方法中以下步骤的程序代码:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。
[0128] 可选地,图7是根据本申请实施例的一种计算机设备的结构框图。如图7所示,该计算机设备A可以包括:一个或多个(图中仅示出一个)处理器702、存储器704、以及传输装置706。
[0129] 其中,存储器可用于存储软件程序以及模块,如本申请实施例中的分布式存储系统中的数据处理方法和装置对应的程序指令/模块,处理器通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的分布式存储系统中的数据处理方法。存储器可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至计算机设备A。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0130] 处理器可以通过传输装置调用存储器存储的信息及应用程序,以执行下述步骤:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。
[0131] 可选的,上述处理器还可以执行如下步骤的程序代码:在读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据。
[0132] 可选的,上述处理器还可以执行如下步骤的程序代码:在读取数据的偏移与长度之和小于分布式存储系统中文件的输出流中记录的当前长度的情况下,从文件中读取数据。
[0133] 可选的,上述处理器还可以执行如下步骤的程序代码:在打开文件时,创建文件的输出流及文件的输入流;在向输出流数据写入成功的情况下,在输出流的缓存中缓存文件的元数据和数据块的元数据。
[0134] 可选的,上述处理器还可以执行如下步骤的程序代码:在输出流中每成功写满一个数据块后,在名字节点中更新文件的元数据和文件的记录长度。
[0135] 可选的,上述处理器还可以执行如下步骤的程序代码:执行合法性检查,其中,合法性检查包括以下至少之一:参数合法性检查、输出流状态检查;在通过合法性检查后,确定多个副本数据节点执行数据写入。
[0136] 可选的,上述处理器还可以执行如下步骤的程序代码:在目标数据节点和多个副本数据节点中的数据均写入成功的情况下,则确定输出流数据写入成功;或者,在目标数据节点和多个副本数据节点中的数据写入成功的份数大于预设份数的情况下,则确定输出流数据写入成功。
[0137] 可选的,上述处理器还可以执行如下步骤的程序代码:在输出流数据写入失败的情况下,在输出流的缓存中缓存文件的元数据和数据写入失败的信息;判断是否执行重试数据写入操作;若执行重试数据写入操作,重新确定副本数据节点,继续执行合法性检查的步骤。
[0138] 可选的,上述处理器还可以执行如下步骤的程序代码:判断重试数据写入操作的次数是否小于预设次数,若重试数据写入操作的次数小于预设次数,判定执行重试数据写入操作;和/或,判断当前时刻距获取数据读取请求的时刻是否未超过预设时长,若当前时刻距获取数据读取请求的时刻未超过预设时长,判定执行重试数据写入操作。
[0139] 可选的,上述处理器还可以执行如下步骤的程序代码:检查数据读取请求的合法性;在数据读取请求通过合法性检查后,执行判断读取数据的字节长度是否超出文件的记录长度的步骤。
[0140] 可选的,上述处理器还可以执行如下步骤的程序代码:检查输入流的状态是否正常;和/或检查数据读取请求的参数是否具有合法性。
[0141] 可选的,上述处理器还可以执行如下步骤的程序代码:检查数据读取请求的携带的缓存是否为空;和/或,检查数据读取请求的读取数据的字节长度是否为负数。
[0142] 可选的,上述处理器还可以执行如下步骤的程序代码:检测输入流是否处于关闭状态;和/或检测输入流是否处于损坏状态。
[0143] 本领域普通技术人员可以理解,图7所示的结构仅为示意,计算机设备也可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌声电脑以及移动互联网设备(Mobi leInternetDevices,MID)、PAD等终端设备。图7其并不对上述电子装置的结构造成限定。例如,计算机设备A还可包括比图7中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图7所示不同的配置。
[0144] 本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read‑Only Memory,ROM)、随机存取器(Random Access Memory,RAM)、磁盘或光盘等。
[0145] 实施例5
[0146] 本申请的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例一所提供的分布式存储系统中的数据处理方法所执行的程序代码。
[0147] 可选地,在本实施例中,上述存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中。
[0148] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:生成数据读取请求,其中,数据读取请求的参数中携带了读取数据的偏移和长度;根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据,其中,文件的元数据中至少包括文件的当前长度;根据获取到的文件的当前长度,从文件中读取数据。
[0149] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在读取数据的偏移与长度之和大于名字节点中记录的长度的情况下,根据数据读取请求从分布式存储系统中文件的输出流的缓存中获取文件的元数据。
[0150] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在读取数据的偏移与长度之和小于分布式存储系统中文件的输出流中记录的当前长度的情况下,从文件中读取数据。
[0151] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在打开文件时,创建文件的输出流及文件的输入流;在向输出流数据写入成功的情况下,在输出流的缓存中缓存文件的元数据和数据块的元数据。
[0152] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在输出流中每成功写满一个数据块后,在名字节点中更新文件的元数据和文件的记录长度。
[0153] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:执行合法性检查,其中,合法性检查包括以下至少之一:参数合法性检查、输出流状态检查;在通过合法性检查后,确定多个副本数据节点执行数据写入。
[0154] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在目标数据节点和多个副本数据节点中的数据均写入成功的情况下,则确定输出流数据写入成功;或者,在目标数据节点和多个副本数据节点中的数据写入成功的份数大于预设份数的情况下,则确定输出流数据写入成功。
[0155] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在输出流数据写入失败的情况下,在输出流的缓存中缓存文件的元数据和数据写入失败的信息;判断是否执行重试数据写入操作;若执行重试数据写入操作,重新确定副本数据节点,继续执行合法性检查的步骤。
[0156] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:判断重试数据写入操作的次数是否小于预设次数,若重试数据写入操作的次数小于预设次数,判定执行重试数据写入操作;和/或,判断当前时刻距获取数据读取请求的时刻是否未超过预设时长,若当前时刻距获取数据读取请求的时刻未超过预设时长,判定执行重试数据写入操作。
[0157] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:检查数据读取请求的合法性;在数据读取请求通过合法性检查后,执行判断读取数据的字节长度是否超出文件的记录长度的步骤。
[0158] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:检查输入流的状态是否正常;和/或检查数据读取请求的参数是否具有合法性。
[0159] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:检查数据读取请求的携带的缓存是否为空;和/或,检查数据读取请求的读取数据的字节长度是否为负数。
[0160] 可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:检测输入流是否处于关闭状态;和/或检测输入流是否处于损坏状态。
[0161] 上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
[0162] 在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0163] 在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
[0164] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0165] 另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0166] 所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read‑Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
[0167] 以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。