数据存储方法、装置、设备及存储介质与流程

文档序号:20917786发布日期:2020-05-29 13:45阅读:192来源:国知局
数据存储方法、装置、设备及存储介质与流程

本申请涉及数据存储技术领域,具体而言,涉及一种数据存储方法、装置、设备及存储介质。



背景技术:

随着互联网的发展及数字化转型的深入,海量数据对存储方式提出了新的要求。为了满足海量数据的存储需求,市场上出现了分布式存储技术。分布式存储是一种数据存储技术,通过网络使用每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在网络中的各个角落。

现有技术中,分布式存储采用分布式文件系统(hdfs)最多,适用于大文件、大数据处理,处理数据达到gb、tb、甚至pb级别的数据;适合流式文件访问,一次写入,多次读取。

但是对于小文件数据的分存储,这种存储方式就会使得每个数据块都产生磁盘碎片,造成磁盘的浪费。



技术实现要素:

本申请的目的在于,针对上述现有技术中的不足,提供一种数据存储方法、装置、设备及存储介质,以解决现有技术中小文件数据的存储过程中,由于每个数据块都产生磁盘碎片,所以造成磁盘浪费的问题。

为实现上述目的,本申请实施例采用的技术方案如下:

第一方面,本申请一实施例提供了一种数据存储方法,应用于小文件的数据存储,所述方法包括:

根据数据标识获取对应的数据作为写请求;其中,所述标识用于唯一指示对应的数据;

将获取的写请求加入节点队列尾部;

按照预设时间间隔,读取所述节点队列中的队列头部的写请求作为目标写请求;

将所述目标写请求加入至目标节点。

可选地,所述按照预设时间间隔,读取所述节点队列中的队列头部的写请求作为目标写请求之后,所述方法还包括:

计算所述节点存储区域的剩余空间和当前其他节点的平均存储区域的剩余空间;

若所述节点存储区域的剩余空间大于所述其他节点的平均存储区域剩余空间;则将所述节点存储区域对应的节点作为目标节点。

可选地,所述将获取的写请求加入节点队列尾部之前,所述方法还包括:

服务器通过预设协议建立与客户端之间的连接;并通过所述连接进行数据的读写;

所述服务器返回给所述客户端每个数据对应的标识,所述标识存储于客户端数据库中,用于客户端读取数据时,指示对应的数据。

可选地,所述根据数据标识获取对应的数据作为写请求之后,所述方法还包括:

判断所述节点队列是否已满;

若所述节点队列未满,则将获取的写请求加入节点队列尾部。

可选地,若所述节点存储区域的剩余空间小于所述其他节点的平均存储区域剩余空间;则获取所述其他节点中,存储区域的剩余空间最大的节点作为目标节点,并将所述写请求加入所述目标节点队列尾部。

可选地,若所述目标写请求写入失败,则将所述目标写请求加入所述节点队列的队列头部,等待下一次读取。

第二方面,本申请另一实施例提供了一种数据存储装置,应用于小文件的数据存储,所述装置包括:获取模块、加入模块和读取模块,其中:

所述获取模块,用于根据数据标识获取对应的数据作为写请求;其中,所述标识用于唯一指示对应的数据;

所述加入模块,用于将获取的写请求加入节点队列尾部;

所述读取模块,用于按照预设时间间隔,读取所述节点队列中的队列头部的写请求作为目标写请求;

所述加入模块,还用于将所述目标写请求加入至目标节点。

可选地,所述装置还包括:计算模块和执行模块,其中:

所述计算模块,用于计算所述节点存储区域的剩余空间和当前其他节点的平均存储区域的剩余空间;

所述执行模块,用于若所述节点存储区域的剩余空间大于所述其他节点的平均存储区域剩余空间;则将所述节点存储区域对应的节点作为目标节点。

可选地,所述装置还包括:建立模块和返回模块,其中:

所述建立模块,用于通过预设协议建立与客户端之间的连接;并通过所述连接进行数据的读写;

所述返回模块,用于所述服务器返回给所述客户端每个数据对应的标识,所述标识存储于客户端数据库中,用于客户端读取数据时,指示对应的数据。

可选地,所述装置还包括:判断模块,用于判断所述节点队列是否已满;

所述加入模块,还用于若所述节点队列未满,则将获取的所述写请求加入节点队列尾部。

可选地,所述加入模块还用于,若所述节点存储区域的剩余空间小于所述其他节点的平均存储区域剩余空间;则获取所述其他节点中,存储区域的剩余空间最大的节点作为目标节点,并将所述写请求加入所述目标节点队列尾部。

可选地,所述加入模块还用于,若所述目标写请求写入失败,则将所述目标写请求加入所述节点队列的队列头部,等待下一次读取。

第三方面,本申请另一实施例提供了一种数据存储设备,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当数据存储设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行如上述第一方面任一所述方法的步骤。

第四方面,本申请另一实施例提供了一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如上述第一方面任一所述方法的步骤。

本申请的有益效果是:采用本申请提供的数据存储方法,在客户端需要读取数据时,只需在数据库中获取该数据对应的标识,并将该数据对应的标识传给服务器,就可以获取该数据,这种去中心节点化的策略,由于不需要在节点上浪费磁盘去存储元数据,直接通过标识定位数据,且标识存储在客户端数据库中,所以可以解决现有技术中每个节点都会产生磁盘碎片,造成磁盘浪费的问题,并且通过队列进行数据的读写,可以最大程度上利用磁盘空间,进一步减少磁盘浪费的问题。

附图说明

为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本申请一实施例提供的数据存储方法的流程示意图;

图2为本申请另一实施例提供的数据存储方法的流程示意图;

图3为本申请另一实施例提供的数据存储方法的流程示意图;

图4为本申请另一实施例提供的数据存储方法的流程示意图;

图5为本申请一实施例提供的数据存储装置的结构示意图;

图6为本申请另一实施例提供的数据存储装置的结构示意图;

图7为本申请另一实施例提供的数据存储装置的结构示意图;

图8为本申请另一实施例提供的数据存储装置的结构示意图;

图9为本申请一实施例提供的数据存储设备的结构示意图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。

为方便理解,下述内容为本申请中相关名词的解释:

zookeeper:是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

hadoop是一个由apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。hadoop实现了一个分布式文件系统(hadoopdistributedfilesystem),简称hdfs。

hbase是一个分布式的、面向列的开源数据库,hbase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。

图1为本申请一实施例提供的一种数据存储方法的流程示意图,在本申请的一个实施例中,该方法应用于小文件的数据存储,下述实施例均以小文件的数据存储为例进行说明,但是本申请提供的方法也可以应用在大文件的数据存数上,具体大文件的数据存储与小文件的数据存储类似,在此不再赘述。如图1所示,该方法包括:s101-s104,其中:

s101:根据数据标识获取对应的数据作为写请求。

其中,标识用于唯一指示对应的数据,在数据读取时,只需在数据库中获取到该数据对应的标识,并将该标识传输给对应的服务器,并获取服务器返回的该标识对应的数据,就可以实现文件数据的读取。

s102:将获取的写请求加入节点队列尾部。

其中,根据先入先出原则,在写请求加入节点队列时,将最新获取的写请求加入至节点队列的尾部。

其中,在本申请的一个实施例中,针对小文件数据的合并,可以提供一种类似于hdfs设计的文件块,每个块由大量的小文件数据合并而成。为减少文件索引容量,提高磁盘的空间利用率,文件个数要控制在一个合理的范围内。考虑到机械硬盘的磁头寻址和寻道机制,可以在服务器端构建合并队列,将多个用户的输入/输出(input/output,io)进行划分,将那些逻辑上有一定顺序的请求划分到相同的队列中,对某个时间点的写请求统一写到同一个磁盘分区文件上,提高磁盘io的吞吐率,但是划分队列的依据可以根据用户需要设计,并不以上述实施例为限,本申请在此不做任何限制。

s103:按照预设时间间隔,读取节点队列中的队列头部的写请求作为目标写请求。

其中,等待预设时间间隔后,通过合并存储线程对队列中的各写请求进行合并操作,其中,合并操作时,合并线程会根据预设时间间隔定时读取节点队列中的数据,若读取到数据则进入下一步,若没有读取到数据,则继续在预设时间间隔后对节点队列中的数据进行读取。

s104:将目标写请求加入至目标节点。

其中,目标节点为用户根据预设规则选择的,为当前各节点中的最优节点。

可选地,预设规则可以为计算各节点的剩余存储区域、也可以为比较各节点的数据传输速度等,具体预设规则可以根据用户需要设计,本申请在此不做任何限制。

采用本申请提供的数据存储方法,在客户端需要读取数据时,只需在数据库中获取该数据对应的标识,并将该数据对应的标识传给服务器,就可以获取该数据,这种去中心节点化的策略,由于不需要在节点上浪费磁盘去存储元数据,直接通过标识定位数据,且标识存储在客户端数据库中,所以可以解决现有技术中每个节点都会产生磁盘碎片,造成磁盘浪费的问题,并且通过队列进行数据的读写,可以最大程度上利用磁盘空间,进一步减少磁盘浪费的问题。

图2为本申请另一实施例提供的数据存储方法的流程示意图,如图2所示,s103之后,该方法还包括:

计算节点存储区域的剩余空间和当前其他节点的平均存储区域的剩余空间。

随后将两者之间进行比较,执行s105:判断节点存储区域的剩余空间是否大于当前其他节点的平均存储区域的剩余空间。若大于,则执行s106a:将该节点存储区域对应的节点作为目标节点。

图3为本申请另一实施例提供的数据存储方法的流程示意图,如图3所示,若节点存储区域的剩余空间小于其他节点的平均存储区域剩余空间;则执行s106b:获取其他节点中,存储区域的剩余空间最大的节点作为目标节点。

可选地,获取其他节点中,当前存储区域的剩余空间最大的节点的索引,根据该索引确定对应的节点为目标节点,并再次通过合并线程进行写入操作,将目标写请求加入至目标节点中。

其中,s101之前,该方法还包括:s107-s108,其中:

s107:服务器通过预设协议建立与客户端之间的连接,并通过连接进行数据的读写。

可选地,在本申请的一个实施例中,以zookeeper作为注册中心,当服务器启动后,将相关的地址及传输端口注册到该中心,客户端(业务端)服务启动时,从zookeeper获取提供服务器对应的数据节点相关信息,通过本地协议解析规则,建立服务器与客户端之间的传输控制协议(tcp,transmissioncontrolprotocol)连接,直接通过tcp连接进行数据的读写,从而在数据的读写过程中不需要进行多次网络传输。

s108:服务器返回给客户端每个数据对应的标识。

其中,标识存储于客户端的数据库中,用于客户端读取数据时,指示对应的数据。

其中,每个数据的读写传输完成后,服务器返回给客户端该数据对应的标识,客户端在获取到标识后,将标识存储至数据库中,在下次读取该数据时,只需在数据库中获取到该数据对应的标识,并将该标识通过tcp连接传输给对应的服务器,并获取服务器返回的该标识对应的数据,从而实现文件数据的读取。

在本申请的一个实施例中,返回的标识为key,其中包括对应数据的通用唯一识别码(universallyuniqueidentifier,uuid)、所在分组groupid、小文件合并后的名称filename、小文件的数据存储在大文件中的偏移量offset和小文件需要读取的长度length,但是具体标识的名称和包括的内容可以根据用户需要调整,并不以上述实施例为限,本申请在此不做任何限制。

采用本申请提供的数据存储方法,可以通过预设协议建立服务器与客户端之间的连接,并通过建立的连接进行数据之间的读写,在数据读写完成后,服务器还会返回给客户端每个数据对应的标识,下次客户端需要再次读取该数据时,直接将该数据对应的标识传给服务器,就可以获取该数据,这种去中心节点化的策略,由于不需要在节点上浪费磁盘去存储元数据,直接通过标识定位数据,且标识存储在客户端数据库中,所以可以解决现有技术中每个节点都会产生磁盘碎片,造成磁盘浪费的问题。

图4为本申请另一实施例提供的数据存储方法的流程示意图,如图4所示,s101之后,该方法可包括:

s109:判断节点队列是否已满。

若节点队列已满,则将当前写请求转发至其他服务器节点,并继续执行s108,直至成功加入某一节点队列的尾部。

若节点队列未满,则执行s102,将获取的写请求加入节点队列尾部。

若目标写请求写入失败,则将目标写请求加入节点队列的队列头部,等待下一次读取。

采用本申请提供的数据存储方法可以通过预设协议建立服务器与客户端之间的连接,并通过建立的连接进行数据之间的读写,在数据读写完成后,服务器还会返回给客户端每个数据对应的标识,下次客户端需要再次读取该数据时,直接将该数据对应的标识传给服务器,就可以获取该数据,这种去中心节点化的策略,由于不需要在节点上浪费磁盘去存储元数据,直接通过标识定位数据,且标识存储在客户端数据库中,所以可以解决现有技术中每个节点都会产生磁盘碎片,造成磁盘浪费的问题。同时各数据在写入服务器节点时,均是利用合并线程和队列及负载均衡算法来完成的,通过在服务器端构建合并队列,提高磁盘的i/o吞吐率。

图5为本申请一实施例提供的数据存储装置的结构示意图,该装置应用于小文件数据存储,如图5所示,该装置包括:获取模块201、加入模块202和读取模块203,其中:

获取模块201,用于根据数据标识获取对应的数据作为写请求;其中,标识用于唯一指示对应的数据。

加入模块202,用于将获取的写请求加入节点队列尾部。

读取模块203,用于按照预设时间间隔,读取节点队列中的队列头部的写请求作为目标写请求;

加入模块202,还用于将目标写请求加入至目标节点。

图6为本申请另一实施例提供的数据存储装置的结构示意图,如图6所示,该装置包括:计算模块204和执行模块205,其中:

计算模块204,用于计算节点存储区域的剩余空间和当前其他节点的平均存储区域的剩余空间。

执行模块205,用于若节点存储区域的剩余空间大于其他节点的平均存储区域剩余空间;则将节点存储区域对应的节点作为目标节点。

图7为本申请另一实施例提供的数据存储装置的结构示意图,如图7所示,该装置包括:建立模块206和返回模块207,其中:

建立模块206,用于通过预设协议建立与客户端之间的连接;并通过连接进行数据的读写。

返回模块207,用于服务器返回给客户端每个数据对应的标识,标识存储于客户端数据库中,用于客户端读取数据时,指示对应的数据。

图8为本申请另一实施例提供的数据存储装置的结构示意图,如图8所示,该装置还包括:判断模块208,判断节点队列是否已满。

加入模块202,还用于若节点队列未满,则将获取的写请求加入节点队列尾部。

可选地,加入模块202还用于,若节点存储区域的剩余空间小于其他节点的平均存储区域剩余空间;则获取其他节点中,存储区域的剩余空间最大的节点作为目标节点,并将写请求加入目标节点队列尾部。

可选地,加入模块202还用于,若目标写请求写入失败,则将目标写请求加入节点队列的队列头部,等待下一次读取。

上述装置用于执行前述实施例提供的方法,其实现原理和技术效果类似,在此不再赘述。

以上这些模块可以是被配置成实施以上方法的一个或多个集成电路,例如:一个或多个特定集成电路(applicationspecificintegratedcircuit,简称asic),或,一个或多个微处理器(digitalsingnalprocessor,简称dsp),或,一个或者多个现场可编程门阵列(fieldprogrammablegatearray,简称fpga)等。再如,当以上某个模块通过处理元件调度程序代码的形式实现时,该处理元件可以是通用处理器,例如中央处理器(centralprocessingunit,简称cpu)或其它可以调用程序代码的处理器。再如,这些模块可以集成在一起,以片上系统(system-on-a-chip,简称soc)的形式实现。

图9为本申请一实施例提供的数据存储设备的结构示意图,该数据存储设备可以集成于终端设备或者终端设备的芯片。

该数据存储设备包括:处理器501、存储介质502和总线503。

处理器501用于存储程序,处理器501调用存储介质502存储的程序,以执行上述图1-图4对应的方法实施例。具体实现方式和技术效果类似,这里不再赘述。

可选地,本申请还提供一种程序产品,例如存储介质,该存储介质上存储有计算机程序,包括程序,该程序在被处理器运行时执行上述方法对应的实施例。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本申请各个实施例所述方法的部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(英文:read-onlymemory,简称:rom)、随机存取存储器(英文:randomaccessmemory,简称:ram)、磁碟或者光盘等各种可以存储程序代码的介质。

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