一种分布式存储方法、服务器及客户端
技术领域
本申请涉及分布式存储技术领域,具体而言,涉及一种分布式存储方法、服务器及客户端。
背景技术
随着互联网大数据时代的来临,人类面临着前所未有的信息过载问题,对海量数据的存储和检索需求成为困扰人们的难题。基于倒排索引存储方案是目前业界公认的最强大、最高效的,所以基于倒排索引的检索引擎基本成为了业界公认的标准,例如比较成熟的开源组件有ElasticSearch、Solr等。
在当前信息爆炸的时代,现有的基于倒排索引的检索引擎随着索引数据量越来越大,会导致服务节点的性能不稳定的问题。
发明内容
本申请实施例的目的在于提供一种分布式存储方法服务器及客户端,用以解决现有技术中当有大量的索引数据时,服务节点的性能不稳定的问题。
第一方面,本申请实施例提供一种分布式存储系统,包括:至少一个客户端和多个服务器;所述客户端用于:通过第一负载均衡策略向所述多个服务器中的一个发送写请求,所述写请求包括待写入的目标数据;所述服务器用于:响应所述客户端发送的所述写请求,通过第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘。
本申请实施例通过第一负载均衡策略和第二负载均衡策略,实现写入性能随服务节点数量线性扩展,并且避免了merge对写性能的影响,从而提高了服务节点性能的稳定性。
进一步地,所述服务器的磁盘中存储有一个索引的一个主分片和/或副本分片;所述服务器用于:通过第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘,包括:通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;将所述目标数据写入所述目标磁盘存储的索引的主分片。
本申请实施例通过第二负载均衡策略,使得数据能够均匀的写入到服务器中的各个磁盘中。
进一步地,一个索引的主分片的个数等于所述多个服务器的磁盘总数,一个索引的不同主分片存储在不同的磁盘上。提高了服务器中磁盘的利用率。
进一步地,所述服务器还用于:若当前用于存储新数据的第一索引的存储容量达到预设阈值,则创建第二索引的主分片,所述第二索引为替换所述第一索引作为用于存储新数据的索引。本申请实施例通过固定容量自动分区机制,排除了merge对写性能的影响,从而提高了写性能的稳定性。
进一步地,所述客户端用于:通过第一负载均衡策略向所述多个服务器中的一个发送写请求,包括:所述客户端通过轮询算法向所述多个服务器中的一个发送写请求。通过轮询算法使得多个服务器共同分担数据写入的压力,避免的客户端到服务端之间存在瓶颈的问题。
进一步地,所述服务器用于:通过第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘,包括:通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;将所述目标数据存入缓存区;通过flush方式将所述目标数据从所述缓存区写入所述目标磁盘。本申请实施例通过将目标数据存储缓存区,然后从缓存区将目标数据flush到目标磁盘,减少了服务器的IO次数。
进一步地,所述服务器还用于:在将所述目标数据写入所述缓存区时,将所述目标数据写入事务日志区。防止服务器意外宕机造成缓存区数据丢失。
进一步地,所述服务器还用于:当所述服务器由异常宕机到恢复正常工作时,通过所述事务日志区中恢复数据。保证了数据的安全性。
第二方面,本申请实施例提供一种分布式存储方法,包括:客户端获得待写入的目标数据;所述客户端通过第一负载均衡策略向多个服务器中的一个发送写请求,所述写请求包括所述目标数据。通过第一负载均衡策略使得多个服务器共同分担写数据的压力,提高写入性能。
进一步地,所述客户端通过第一负载均衡策略向多个服务器中的一个发送写请求,包括:所述客户端通过轮询算法向所述多个服务器中的一个发送写请求。
第三方面,本申请实施例提供一种分布式存储方法,包括:服务器接收客户端发送的写请求,其中,所述写请求由客户端通过第一负载均衡策略发送,所述写请求包括待写入的目标数据;所述服务器响应所述客户端发送的所述写请求,根据第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘。本申请实施例通过第二负载均衡策略能够将目标数据均匀的存储在服务器内的各个磁盘上。
进一步地,所述服务器的磁盘中存储有一个索引的一个主分片和/或副本分片;所述通过第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘,包括:通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;将所述目标数据写入所述目标磁盘存储的索引的主分片。
进一步地,一个索引的主分片的个数等于所述多个服务器的磁盘总数,一个索引的不同主分片存储在不同的磁盘上。提高了服务器中磁盘的利用率。
进一步地,所述方法还包括:若当前用于存储新数据的第一索引的存储容量达到预设阈值,则创建第二索引的主分片,所述第二索引为替换所述第一索引的用于存储新数据的索引。本申请实施例通过固定容量自动分区机制,排除了merge的影响,避免单独的分区过大,致使merge影响写入稳定性。
进一步地,所述根据第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘,包括:所述服务器采用轮询算法将所述目标数据写入多个磁盘中的一个磁盘。
进一步地,所述通过第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘,包括:通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;将所述目标数据存入缓存区;通过flush方式将所述目标数据从所述缓存区写入所述目标磁盘。本申请实施例通过先将目标数据存储缓存区,然后在flush到磁盘中,减少了服务器的IO次数。
进一步地,所述方法还包括:在将所述目标数据写入所述缓存区时,将所述目标数据写入事务日志区。保证了数据的一致性和高可用性。
进一步地,所述方法还包括:当所述服务器由异常宕机到恢复正常工作时,通过所述事务日志区中恢复数据。保证了数据的一致性和高可用性。
第四方面,本申请实施例提供一种客户端,包括:数据获得模块,用于获得待写入的目标数据;请求发送模块,用于通过第一负载均衡策略向多个服务器中的一个发送写请求,所述写请求包括所述目标数据。
第五方面,本申请实施例提供一种服务器,包括:请求接收模块,用于接收客户端发送的写请求,其中,所述写请求由客户端通过第一负载均衡策略发送,所述写请求包括待写入的目标数据;数据写入模块,用于响应所述客户端发送的所述写请求,根据第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘。
第六方面,本申请实施例提供一种电子设备,包括:处理器、存储器和总线,其中,所述处理器和所述存储器通过所述总线完成相互间的通信;所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行第二方面或第三方面的方法。
第七方面,本申请实施例提供一种非暂态计算机可读存储介质,包括:所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行第二方面或第三方面的方法。
本申请的其他特征和优点将在随后的说明书阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请实施例了解。本申请的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请实施例提供的性能测试图;
图2为本申请实施例提供的在merge的作用下CPU状态示意图;
图3为本申请实施例提供的关闭merge节流机制后CPU状态示意图;
图4为本申请实施例提供的分布式存储系统结构示意图;
图5为本申请实施例提供的第一索引未达到分区阈值时的示意图;
图6为本申请实施例提供的固定容量自动分区示意图;
图7为本申请实施例提供的自动分区后的示意图;
图8为本申请实施例提供的一种分布式存储方法流程示意图;
图9为本申请实施例提供的另一种分布式存储方法流程示意图;
图10为本申请实施例提供的客户端的结构示意图;
图11为本申请实施例提供的服务器结构示意图;
图12为本申请实施例提供的电子设备实体结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。
现代搜索引擎的索引都是基于倒排索引,是实现单词到文档映射关系的最佳实现方式和最有效的索引结构。
现有的基于倒排索引的检索引擎有时无法满足更高性能的数据加载需求。以ElasticSearch为例,主要存在以下局限性:
(1)服务节点增加数据加载性能无法实现横向的线性扩展
研究人员采用相同的配置的服务节点对ElasticSearch横向扩展性进行测试。图1为本申请实施例提供的性能测试图,如图1所示,横坐标标识服务节点的数量,纵坐标表示数据加载性能。虚线表示理想状态下,随着服务节点的增加,数据加载性能线性增加。实线表示实际的数据加载性能。由此可以看出,随着ElasticSearch集群节点的增加,整体集群的数据加载性能呈上升趋势,但上升速度逐渐趋于平缓,不能实现线性增加。
(2)随着索引数据量越来越大,写入性能不稳定
当倒排索引索引的数据量越来越大时,索引文件的合并操作的性能开销也逐渐增加,这将成为干扰数据加载性能的主要因素。
ElasticSearch本身提供了对数据接入节流机制,当系统检测到merge索引文件耗时超过指定阈值时则对写入线程进行限制,这时会把写入压力回传给客户端。图2为本申请实施例提供的在merge的作用下CPU状态示意图,峰值是索引merge过程的影响。由于merge的影响,所以导致大量客户端数据积压,线程池活跃线程数剧增,形成cpu和内存的满载。
当关闭了ElasticSearch的merge节流机制后,在单节点的ElasticSearch环境中进行测试。客户端使用恒定的高速率的方式进行数据写入,ElasticSearch的Index存储量达到100G左右时,检测的cpu和内存状态,图3为本申请实施例提供的关闭merge节流机制后CPU状态示意图。
为了使服务节点的性能更加稳定,本申请实施例提供一种分布式存储系统,如图4所示,该系统包括至少一个客户端401和多个服务器402,应当说明的是,虽然图4中只示出了一个客户端和三个服务器的例子,但本申请实施例对客户端401和服务器402的数量不作具体限定。并且,该分布式存储系统可以用于倒排索引,服务器402可以为ElasticSearch,但不仅仅限于倒排索引,以及服务器也可以是其他服务器,本申请实施例对此不作具体限定。
当客户端401有目标数据需要写入服务器402中时,为了减少个别服务节点的网络传输压力,客户端401通过第一负载均衡策略向多个服务器402中的一个发送写请求,例如,选中了服务器1,那么向服务器1发送写请求。其中,写请求中包括待写入的目标数据,目标数据为客户端要写入的一个数据包,这样,在第一负载均衡策略下,将每一个数据包平均分配给服务器。当然,也可以是两个数据包、三个数据包等,若目标数据为两个数据包,那么第一负载均衡策略是每次为服务器分配两个数据包,这样做的好处是提高数据分配的效率,但是数据包的数量不宜过大。可以理解的是,客户端401可以采用轮询算法从多个服务器402中选择一个服务器402作为目标服务器,然后向目标服务器发送写请求。应当说明的是,当客户端401网络传输达到瓶颈,可通过增加客户端401来扩展写入性能。应当说明的是,客户端401还可以将目标数据发送给实时负载最小的服务器,也可以随机分配,本申请实施例对第一负载均衡策略的具体实施不做具体限定。
服务器402中包括至少一个磁盘,图4中示出了每个服务器402中有三个磁盘,但实际情况下,不同服务器402中磁盘的数量也可以不相同,并且,服务器402中的磁盘数量可以多于三个,也可以少于三个,本申请实施例对此不作具体限定。当服务器1接收到了写请求之后,响应该写请求,为了能够平均每个磁盘的负载,将数据均匀的存入磁盘中,可以通过第二负载均衡策略将写请求中的目标数据写入多个磁盘中的一个磁盘。应当说明的是,服务器1可以采用轮询算法确定目标磁盘,然后将目标数据存储该目标磁盘中。也可以选择实时负载最小的磁盘作为目标磁盘,还可以随机选择目标磁盘,本申请实施例不对第二负载均衡策略的具体实施进行限定。
本申请实施例通过第一负载均衡策略和第二负载均衡策略,实现写入性能随服务节点数量线性扩展,并且避免了merge对写性能的影响,从而提高了服务节点性能的稳定性。
在上述实施例的基础上,将逻辑上具有相同结构的数据存储在一个单元中,这个单元即为索引(index),一个index划分为多个主分片,每个主分片就是一个单独的倒排索引目录。
可以理解的是,分片是用来存储数据的,Elasticsearch是利用分片将数据分发到集群内各处的。因此,分片是数据的容器,文档保存在分片内,分片又被分配到服务集群内的各个节点里。在往Elasticsearch中添加数据是时,需要用到索引,索引实际上是指向一个或多个分片的逻辑命名空间。
服务器402中的磁盘存有一个索引的一个主分片和/或副本分片。应当说明的是,一个索引的主分片的数量可以等于服务器402中磁盘的数量之和,也可以小于磁盘的数量之和。当主分片的数量等于磁盘的数量之和时,将主分片均匀分布在磁盘中,即,每个磁盘中存储有一个索引的一个主分片。这样做的好处是充分利用集群所有硬盘的读写能力,保证最大的吞吐量,从而,读写能力随着硬盘数量的增加而线性增加。当主分片的数量小于磁盘的数量之和时,还是可以将不同的主分片分给不同的磁盘,这样会使得有些磁盘中没有包括主分片。
为了保证数据存储的可靠性,以及服务器402的高可用性,可以对每个主分片设置一个或多个副本分片,并且,可以将副本分片存储在其他服务器402的磁盘中,当然,也可以将副本分片存储在本服务器402的其他磁盘中。可以理解的是,将副本分片存储在其他服务器402的磁盘中的好处是:若主分片所在的服务器402宕机导致存储在主分片的数据丢失,则在服务恢复正常后,可以通过存储在其他服务中的副本分片进行数据恢复。将副本分片存储在主分片所在的服务器402的其他磁盘的好处是:若本分片所在的磁盘发生故障,导致主分片的数据丢失,则可以在该服务器402本地进行数据恢复,无需从其他服务器402中获取数据,其能够更快的恢复数据。
另外,由于将数据同步到副本分片的过程需要带来很大的网络传输开销,因此,本申请实施例提供了三种可配置的同步策略,以满足不同的一致性要求的场景。
第一种:对于一致性要求最高的情况,写入主分片的同事,向副本分片发送同步阻塞请求,将目标数据同步至副本分片,等待主分片写入成功并且副本分片所在的服务器402响应写入成功时,向客户端401回复写入成功的应答消息ACK。
第二种:对于一致性要求适中的情况,写入主分片的同时发送异步请求,将目标数据写入副本分片,无需等待副本分片所在的服务器402响应即向客户端401回复ACK。
第三种:对于一致性要求较低的情况,写入主分片即向客户端401回复ACK。
服务器402在通过第二负载均衡策略将目标数据写入多个磁盘中的一个磁盘时,先通过第二负载均衡策略确定存储目标数据的目标磁盘,然后将目标数据写入到目标磁盘存储的索引的主分片中。应当说明的是,此处的索引是指当前可用的索引,也就是当前还可以存储数据的索引。
本申请实施例中的服务器通过第二负载均衡策略将目标数据写入目标磁盘的索引的分片中,使得该服务器中各个分片存储的数据更加均匀,不会导致某个分片的存储压力较大,而其他的分片存储压力较小的问题。
在上述实施例的基础上,为了解决merge机制对写入性能带来的影响,merge的影响主要是来自于索引已存储的数据量对实时写入性能的影响。本申请实施例引入固定容量自动分区机制来解决该问题,即所述服务器402还用于:若当前用于存储新数据的第一索引的存储容量达到预设阈值,则创建第二索引,用所述第二索引替换所述第一索引作为用于存储新数据的索引。
在具体的实施过程中,本申请实施例的分布式协调基于Zookeeper实现,主要实现以下功能:
(1)服务器节点间的注册于发现;
(2)客户端连接服务器时通过Zookeeper发现;
(3)服务节点间的数据共享。
第一索引可以理解为是当前正在存储新数据的索引,图5为本申请实施例提供的第一索引未达到分区阈值时的示意图,如图5所示,每个服务器402定时将本服务节点下第一索引(将当前可用的索引称为第一索引)中所有分片的存储总量同步至zookeeper,默认10秒同步一次,当然同步周期也可以根据实际情况进行调整,例如还可以是15秒、20秒等。进而在zookeeper中存储了第一索引在所有节点下的第一索引的存储容量。每次将目标数据写入之前,服务器402都要判断第一索引的存储总量是否达到预设阈值,以决定是否创建第二索引。为了避免每次写入请求都要访问zookeeper,产生过多的网络开销。服务器402可以定时从zookeeper同步第一索引存储总量,缓存至内存当中,默认10秒同步一次,还可以是15秒、20秒等。图6为本申请实施例提供的固定容量自动分区示意图,如图6所示,假设一个索引的容量的预设阈值为20G,当第一索引存储了20G的数据之后,则创建第二索引。其中,每个服务器402创建自己磁盘中的第二索引的主分片。
图7为本申请实施例提供的自动分区后的示意图,如图7所示。在创建出第二索引时,每个磁盘中主分片和副本分片的编号与对应的第一索引中的主分片和副本分片可以是相同的,例如:服务器1的第一个磁盘中的对应的第一索引的主分片1和副本分片2,在创建了第二索引后,第二索引的主分片1和副本分片2还是存储在服务器1的第一个磁盘中。当然,第二索引的各个主分片和副本分片也可以不按照第一索引的分布方式进行分布,其第一、第二索引的分布方式可以预先设定。
本申请实施例引入固定容量自动分区机制解决了由merge机制对写入性能带来的影响,能够避免产生很大的索引文件,从而控制merge的性能开销,最大限度减少服务器网络IO,提升数据写入性能,确保稳定可靠的服务。
在上述实施例的基础上,所述服务器402用于:通过第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘,包括:
通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;
将所述目标数据存入缓存区;
通过异步方式定时的将所述目标数据从所述缓存区写入所述目标磁盘。
在具体的实施过程中,基于写性能的考虑,本申请实施例采用基于内存缓冲的索引结构,以减少系统IO次数。其中,异步方式可以是flush方式,即,服务器402中有一个或多个缓存区,当服务器402通过第二负载均衡策略确定存储目标数据的目标磁盘之后,将目标数据存储缓存区,每个磁盘中的分片会分配指定大小的线程池,负责定时地从缓存区中将目标数据flush到磁盘上。这样做的好处是,在将数据写入缓存区之后,即可向客户端发送写入成功的应答消息,减少了客户端的等待时长;另外,在缓存区中存储多个数据时,可以一次写入多个数据,因此多个数据的写入位置可能比较接近,从而减少磁盘IO。
在另一实施例中,在服务器402将目标数据存储在缓存中之后,并且在flush到磁盘之前,若服务器402发生异常宕机,则可能会导致缓存中的数据丢失。所以,为了避免该情况发生,引入了事务日志CommitLog机制,即在将目标数据写入所述缓存区时,将目标数据写入CommitLog区中。若服务器402由异常宕机到恢复正常工作,可以从CommitLog区中恢复数据。
图8为本申请实施例提供的一种分布式存储方法流程示意图,如图8所示,该方法包括:
步骤801:客户端获得待写入的目标数据;
步骤802:所述客户端通过第一负载均衡策略向多个服务器中的一个发送写请求,所述写请求包括所述目标数据。
在具体的实施过程中,目标数据为需要写入到服务器的数据,其来源可以是客户端产生的数据,也可以是客户端从其他终端处接收的,因此本申请实施例对目标数据的来源不作具体限定。
为了减少服务节点间的网络传输带来的大量开销,客户端可以通过第一负载均衡策略向多个服务器中的一个发送写请求,其中,写请求中包括待写入的目标数据。其中,第一负载均衡策略可以为采用轮询算法,例如:客户端可以将第一个目标数据发送给第一个服务器,第二个目标数据发送给第二个服务器,以此类推。
本申请实施例通过客户端利用第一负载均衡策略向服务器发送写请求,减少了服务器节点间的网络传输带来的大量开销,避免了在客户端和服务端之间产生瓶颈,从而提高了数据写入的性能。
图9为本申请实施例提供的另一种分布式存储方法流程示意图,如图9所示,该方法包括:
步骤901:服务器接收客户端发送的写请求,其中,所述写请求由客户端通过第一负载均衡策略发送,所述写请求包括待写入的目标数据;
步骤902:所述服务器响应所述客户端发送的所述写请求,根据第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘。
在具体的实施过程中,客户端通过第一负载均衡策略从多个服务器中选择一个服务器,并向该服务器发送写请求。该服务器在接收到写请求之后,采用第二负载均衡策略将写请求中的目标数据写入到多个磁盘中的一个磁盘中。其中,第二负载均衡策略也可以是采用轮询算法,例如:服务器第一次接收到目标数据后,将目标数据写入第一个磁盘中;当服务器第二次接收到目标数据后,将目标数据写入第二个磁盘中,以此类推。
本申请实施例通过服务器采用第二负载均衡,从而使得数据能够均匀的存储在每块磁盘上。
在上述实施例的基础上,所述服务器的磁盘中存储有一个索引的一个主分片和/或副本分片;
所述通过第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘,包括:
通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;
将所述目标数据写入所述目标磁盘存储的索引的主分片。
在具体的实施过程中,为了使磁盘得到充分的利用,一个索引包括的主分片的数量可以与所有的服务器中的磁盘数量之和相等,然后将一个索引中的主分片均匀的分布在磁盘上。可以理解的是,一个索引的主分片的数量也可以小于所有的服务器中的磁盘数量之和。为了保证服务容灾能力,可以为每一个主分片配置至少一个副本分片,并且主分片不与副本分片在同一个磁盘中。
服务器在接收到目标数据后,利用第二负载均衡策略从该服务器对应的多个磁盘中确定一个目标磁盘,将该目标数据写入到目标磁盘的主分片中。
在另一实施例中,在服务器将目标数据写入到主分片的同时,若主分片的副本分片也在该服务器的其他磁盘中,则该服务器也可以将该目标数据写入到主分片对应的副本分片中;若主分片的副本在其他服务器中,那么该服务器将目标数据发送给副本分片所在的服务器,然后由副本分片所在的服务器将目标数据写入到副本分片中。应当说明的是,这里所述的同时不应理解为严格意义上的同时,写入主分片的时间和写入副本分片的时间在一个预设的时间差之内,都可以理解为是同时写入的。写入副本分片的目的是,当主分片所在的磁盘不可用,可唤醒放置在其他磁盘中的副本分片来提供数据读取能力。由于写入副本过程的开销较大,可以根据数据一致性要求配置不同的策略,具体策略参见上述实施例,此处不再赘述。
在上述实施例的基础上,所述方法还包括:
若当前用于存储新数据的第一索引的存储容量达到预设阈值,则创建第二索引的主分片,所述第二索引为替换所述第一索引的用于存储新数据的索引。
在具体的实施过程中,在创建索引时,预先设定索引的最大容量,最大容量即为预设阈值,第一索引可以理解为是当前正在存储新数据的索引,如图5所示,Zookeeper可以获知每个磁盘中分片的已存储数据的容量,进而可以获知第一索引已存储数据的总容量,每个服务器均可以通过Zookeeper获知第一索引的存储容量,当服务器得知第一索引的存储容量达到预设阈值,则创建第二索引,如图6所示,假设一个索引的容量的预设阈值为20G,当第一索引存储了20G的数据之后,则创建第二索引。在创建了第二索引之后,便关闭第一索引的写入,此时,第二索引为可用的索引。应当说明的是,创建第二索引的方式与上述实施例一致,此处不再赘述。
本申请实施例引入固定容量自动分区机制解决了由merge机制对写入性能带来的影响,能够避免产生很大的索引文件,从而控制merge的性能开销,最大限度减少服务器网络IO次数,提升数据写入性能,确保稳定可靠的服务。
在上述实施例的基础上,所述通过第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘,包括:
通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;
将所述目标数据存入缓存区;
通过异步方式定时的将所述目标数据从所述缓存区写入所述目标磁盘。
在具体的实施过程中,异步方式可以为flush方式,在服务器将目标数据写入目标磁盘的过程中,在确定了要存储目标数据的目标磁盘之后,为了减少系统的IO次数,可以先将目标数据写入缓存区,目标磁盘中的主分片会分配指定大小的线程池,负责定时地调度从系统缓存区的目标数据flush到目标磁盘上,应当说明的是,从缓存区将目标数据flush到目标磁盘上的周期可以是10秒、15秒等,本申请实施例对此不做具体限定。另外,在将目标数据flush到目标磁盘后,清空缓冲区和CommitLog区。
在另一实施例中,当目标数据写入到缓存区,但还没有flush到目标磁盘时,这时若服务器发生异常宕机,那么缓存区的目标数据便可能丢失,因此,为了避免数据丢失,保证数据的安全性,在将目标数据写入到缓存区的同时,将目标数据也写入到CommitLog区。若服务器由异常宕机到恢复正常工作的情况下,服务器可以从CommitLog区中恢复数据,从而保证数据不会因服务器异常宕机而丢失。
图10为本申请实施例提供的客户端的结构示意图,该客户端可以是电子设备上的模块、程序段或代码。应理解,该客户端与上述图8方法实施例对应,能够执行图8方法实施例涉及的各个步骤,该客户端具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。如图10所示,该客户端包括:数据获得模块1001和请求发送模块1002,其中:
数据获得模块1001用于获得待写入的目标数据;请求发送模块1002用于通过第一负载均衡策略向多个服务器中的一个发送写请求,所述写请求包括所述目标数据。
在上述实施例的基础上,请求发送模块1002具体用于:
通过轮询算法向所述多个服务器中的一个发送写请求。
图11为本申请实施例提供的服务器结构示意图,该服务器可以是电子设备上的模块、程序段或代码。应理解,该服务器与上述图9方法实施例对应,能够执行图9方法实施例涉及的各个步骤,该服务器具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。如图11所示,该服务器包括:请求接收模块1101和数据写入模块1102,其中:
请求接收模块1101用于接收客户端发送的写请求,其中,所述写请求由客户端通过第一负载均衡策略发送,所述写请求包括待写入的目标数据;数据写入模块1102用于响应所述客户端发送的所述写请求,根据第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘。
在上述实施例的基础上,所述服务器的磁盘中存储有一个索引的一个主分片和/或副本分片;
数据写入模块1102具体用于:
通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;
将所述目标数据写入所述目标磁盘存储的索引的主分片。
在上述实施例的基础上,一个索引的主分片的个数等于所述多个服务器的磁盘总数,一个索引的不同主分片存储在不同的磁盘上。
在上述实施例的基础上,服务器还包括自动分区模块,用于:若当前用于存储新数据的第一索引的存储容量达到预设阈值,则创建第二索引的主分片,所述第二索引为替换所述第一索引的用于存储新数据的索引。
在上述实施例的基础上,服务器还包括副本写入模块,用于:在将所述目标数据写入所述目标磁盘存储的索引的主分片的同时,将所述目标数据写入所述主分片对应的副本分片中。
在上述实施例的基础上,数据写入模块1102具体用于:
所述服务器采用轮询算法将所述目标数据写入多个磁盘中的一个磁盘。
在上述实施例的基础上,数据写入模块1102具体用于:
通过所述第二负载均衡策略确定存储所述目标数据的目标磁盘;
将所述目标数据存入缓存区;
通过异步方式定时的将所述目标数据从所述缓存区写入所述目标磁盘。
在上述实施例的基础上,服务器还包括数据恢复模块,用于:
当所述服务器由异常宕机到恢复正常工作时,通过所述事务日志区中恢复数据。
图12为本申请实施例提供的电子设备实体结构示意图,如图12所示,所述电子设备,包括:处理器(processor)1201、存储器(memory)1202和总线1203;其中,
所述处理器1201和存储器1202通过所述总线1203完成相互间的通信;
所述处理器1201用于调用所述存储器1202中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:客户端获得待写入的目标数据;所述客户端通过第一负载均衡策略向多个服务器中的一个发送写请求,所述写请求包括所述目标数据。或,服务器接收客户端发送的写请求,其中,所述写请求由客户端通过第一负载均衡策略发送,所述写请求包括待写入的目标数据;所述服务器响应所述客户端发送的所述写请求,根据第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘。
处理器1201可以是一种集成电路芯片,具有信号处理能力。上述处理器1201可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(NetworkProcessor,NP)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。其可以实现或者执行本申请实施例中公开的各种方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
存储器1202可以包括但不限于随机存取存储器(Random Access Memory,RAM),只读存储器(Read Only Memory,ROM),可编程只读存储器(Programmable Read-OnlyMemory,PROM),可擦除只读存储器(Erasable Programmable Read-Only Memory,EPROM),电可擦除只读存储器(Electric Erasable Programmable Read-Only Memory,EEPROM)等。
本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:客户端获得待写入的目标数据;所述客户端通过第一负载均衡策略向多个服务器中的一个发送写请求,所述写请求包括所述目标数据。或,服务器接收客户端发送的写请求,其中,所述写请求由客户端通过第一负载均衡策略发送,所述写请求包括待写入的目标数据;所述服务器响应所述客户端发送的所述写请求,根据第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘。
本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:客户端获得待写入的目标数据;所述客户端通过第一负载均衡策略向多个服务器中的一个发送写请求,所述写请求包括所述目标数据。或,服务器接收客户端发送的写请求,其中,所述写请求由客户端通过第一负载均衡策略发送,所述写请求包括待写入的目标数据;所述服务器响应所述客户端发送的所述写请求,根据第二负载均衡策略将所述目标数据写入多个磁盘中的一个磁盘。
在本申请所提供的实施例中,应该理解到,所揭露装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
另外,作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
再者,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。
以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。