本发明涉及计算机技术领域,具体涉及一种支持均衡资源的SOLR集群扩展方法及系统。
背景技术:
随着社会的发展进步,已经迈入大数据时代,海量数据的存储和检索已经应用到各个领域。其中全文检索属于其中常用功能之一,类似实现百度、淘宝的查询效果。而SOLR属于全文检索中使用最多的企业级搜索应用服务器,具备功能丰富、近实时检索、支持集群等特点,且属于Apache旗下的项目,免费开源。
SOLR本身的集群机制比较完善,采用SOLRCloud组件支持分片(shard)和复制集(replication)。当系统数据量大到一定程度导致服务器资源不足时,一般都是新增服务器添加到集群中,分担压力。SOLRCloud支持两种分片模式:compositeId和implicit。compositeId是基于ID算Hash值来确定数据落到哪个分片中,创建collection时就必须固定分片数量,不适合后续新增分片,因此不适合集群动态横向扩展。而implicit分片模式支持在创建分片时指定片键,插入数据时设置片键的值来确定数据存储到哪个分片。因此,可以通过implicit分片模式的操作接口,实现人工或系统简单的自动给新服务器添加分片。
现有技术中,SOLRCloud的implicit分片模式有提供动态添加分片的接口,因此一类方法是简单的通过按时间段自动动态分片,比如按月分片,每个月建立一个分片。在月初第一天自动选数据量少的一台服务器上添加一个分片,用来存储下个月的数据。这样虽然实现了自动分片,但是存在局部热点的问题。而且集群中的每台服务器资源可能都一样,比如存在新老服务器混合组合的集群,新老服务器磁盘的转速、空间大小、内存大小等资源都可能不一样,这时分片的数量就不能平均分配。
技术实现要素:
为此,本发明提出一种支持均衡资源的SOLR集群扩展方法及系统,在新服务器加入时,自动根据服务器上的节点数和数据量的增长情况创建新的分片,保证新数据按均衡入库到相应的服务器上。本发明先根据服务器硬件资源安装相应数量的SOLR节点,系统通过一个线程动态监测集群中的文档数量,根据情况动态创建分片。入库线程根据动态线程中调整的分片参数,把新入库的数据均衡插入到新的分片中。
具体方案如下:
一种支持均衡资源的SOLR集群扩展方法,包括步骤:
S10,根据服务器的硬件资源安装SOLR节点;
S20,设置SOLR集群的参数;
S30,根据SOLR集群中的SOLR集群的参数、当前的文档数量和当前的SOLR集群的状态值动态创建分片,SOLR集群的状态值被更新;
S40,根据步骤S30更新后的SOLR集群的状态值将要写入的新文档插入至相应的分片,文档数量被更新;
循环执行步骤S10至S40。
进一步的,所述的步骤S10具体包括:分别获取服务器的CPU、内存、磁盘空间和网络带宽所能允许支持的最多SOLR节点数,从中获取最小值即为服务器能支持SOLR节点数取最小值,按该最小值的数量安装SOLR节点。
进一步的,所述的SOLR集群的参数包括:name,即集合collection的名称、configName,即集合collection的配置名称、serverNodes,即集合collection允许创建Core的节点以及replicationFactor,即复制因子,所述的SOLR集群的动态值包括:liveShardMinIndex,即入库数据存储分片列表中最小的下标、liveShardMaxIndex,即入库数据存储分片列表中最大的下标、liveCoreNumPerNode,即每个节点分配Core的平均值、nextShardedDocNum,即下一次分片时的文档数以及sumCoreNum,即所有节点中Core的数目。
进一步的,所述的步骤S30具体包括:
S300,创建第一线程,所述第一线程监测SOLR集群的文档数量并执行S301以及S303至S311的步骤,以实现动态创建分片;
S301,读取SOLR集群中集合collection总的文档数量,判断是否大于nextShardedDocNum,如果大于或等于,则表示需要新增分片,进入步骤S302,如果小于,则进入步骤S313;
S302,对第一线程创建互斥锁;
S303,根据公式addCoreNum=liveCoreNumPerNode*Nodes–sumCoreNum计算出此次计划新增的Core数量;
S304,判断addCoreNum是否小于复制因子replicationFactor,如果小于,则进入步骤S305,否则进入步骤S307;
S305,调整liveCoreNumPerNode值加1;
S306,根据公式addCoreNum=liveCoreNumPerNode*Nodes–sumCoreNum计算出此次计划新增的Core数量;
S307,根据公式addShard=addCoreNum/replicationFactor计算出计划新增的分片数,取整数;
S308,读取SOLR集群状态值,获取每个节点上已经安装的SOLR Core数量,然后与liveCoreNumPerNode值比较,差值即为允许安装Core的最多个数;
S309,根据每个节点上允许安装的Core数,创建一个分片到replicationFactor个Core上,将该replicationFactor个Core分布到不同的节点中,分片的名称为shardX,其中X的值为一个递增不重复的整数,若当前这轮新增的第i个分片,则X的值为liveCoreNumPerNode+i;
S310,判断是否已经创建完addShard个分片,如果否,则跳转到步骤S309继续创建分片,如果是则进入步骤S311;
S311,更新SOLR集群状态值,并更新持久化到磁盘,状态值更新如下:
liveShardMinIndex=liveShardMaxIndex+1;
liveShardMaxIndex=liveShardMaxIndex+addShard;
sumCoreNum=sumCoreNum+addCoreNum;
nextShardedDocNum=sumCoreNum*docNumPerCore;
S312,释放互斥锁;
S313,第一线程休眠一定时间,待唤醒后进入步骤S301重新检测。
进一步的,所述的步骤S40具体包括:
S401,创建第二线程,并对第二线程创建互斥锁,所述第二线程执行下述S402至S404的步骤,以将文档插入至相应的分片,所述互斥锁为与第一线程创建的互斥锁相同的互斥锁;
S402,读取SOLR集群的参数liveShardMinIndex和liveShardMaxIndex;
S403,在分片列表中shardI~shardJ中随机选择一个分片(I的值为liveShardMinIndex,J的值为liveShardMaxIndex)作为新文档数据的入库目标分片,设置片键字段为选中的分片名称;
S404,提交文档,均衡的将新文档数据插入到相应的分片中。
一种支持均衡资源的SOLR集群扩展系统,包括:
节点安装模块,用于根据服务器的硬件资源安装SOLR节点;
设置模块,用于设置SOLR集群的参数;
分片创建模块,用于根据SOLR集群中的SOLR集群的参数、当前的文档数量和当前的SOLR集群的状态值动态创建分片,SOLR集群的状态值被更新;
数据插入模块,用于根据更新后的SOLR集群的状态值将要写入的新文档插入至相应的分片,文档数量被更新;
循环模块,用于循环进入节点安装模块、设置模块、分片创建模块以及数据插入模块。
进一步的,所述的节点安装模块具体还用于:分别获取服务器的CPU、内存、磁盘空间和网络带宽所能允许支持的最多SOLR节点数,从中获取最小值即为服务器能支持SOLR节点数取最小值,按该最小值的数量安装SOLR节点。
进一步的,所述设置模块中的SOLR集群的参数包括:name,即集合collection的名称、configName,即集合collection的配置名称、serverNodes,即集合collection允许创建Core的节点以及replicationFactor,即复制因子,所述的SOLR集群的动态值包括:liveShardMinIndex,即入库数据存储分片列表中最小的下标、liveShardMaxIndex,即入库数据存储分片列表中最大的下标、liveCoreNumPerNode,即每个节点分配Core的平均值、nextShardedDocNum,即下一次分片时的文档数以及sumCoreNum,即所有节点中Core的数目。
进一步的,所述的分片创建模块具体还用于执行以下步骤:
S300,创建第一线程,所述第一线程监测SOLR集群的文档数量并执行S301以及S303至S311的步骤,以实现动态创建分片;
S301,读取SOLR集群中集合collection总的文档数量,判断是否大于nextShardedDocNum,如果大于或等于,则表示需要新增分片,进入步骤S302,如果小于,则进入步骤S313;
S302,对第一线程创建互斥锁;
S303,根据公式addCoreNum=liveCoreNumPerNode*Nodes–sumCoreNum计算出此次计划新增的Core数量;
S304,判断addCoreNum是否小于复制因子replicationFactor,如果小于,则进入步骤S305,否则进入步骤S307;
S305,调整liveCoreNumPerNode值加1;
S306,根据公式addCoreNum=liveCoreNumPerNode*Nodes–sumCoreNum计算出此次计划新增的Core数量;
S307,根据公式addShard=addCoreNum/replicationFactor计算出计划新增的分片数,取整数;
S308,读取SOLR集群状态值,获取每个节点上已经安装的SOLR Core数量,然后与liveCoreNumPerNode值比较,差值即为允许安装Core的最多个数;
S309,根据每个节点上允许安装的Core数,创建一个分片到replicationFactor个Core上,将该replicationFactor个Core分布到不同的节点中,分片的名称为shardX,其中X的值为一个递增不重复的整数,若当前这轮新增的第i个分片,则X的值为liveCoreNumPerNode+i;
S310,判断是否已经创建完addShard个分片,如果否,则跳转到步骤S309继续创建分片,如果是则进入步骤S311;
S311,更新SOLR集群状态值,并更新持久化到磁盘,状态值更新如下:
liveShardMinIndex=liveShardMaxIndex+1;
liveShardMaxIndex=liveShardMaxIndex+addShard;
sumCoreNum=sumCoreNum+addCoreNum;
nextShardedDocNum=sumCoreNum*docNumPerCore;
S312,释放互斥锁;
S313,第一线程休眠一定时间,待唤醒后进入步骤S301重新检测。
进一步的,所述的数据插入模块具体还用于执行以下步骤:
S401,创建第二线程,并对第二线程创建互斥锁,所述第二线程执行下述S402至S404的步骤,以将文档插入至相应的分片,所述互斥锁为与第一线程创建的互斥锁相同的互斥锁;
S402,读取SOLR集群的参数liveShardMinIndex和liveShardMaxIndex;
S403,在分片列表中shardI~shardJ中随机选择一个分片(I的值为liveShardMinIndex,J的值为liveShardMaxIndex)作为新文档数据的入库目标分片,设置片键字段为选中的分片名称;
S404,提交文档,均衡的将新文档数据插入到相应的分片中。
本发明有益效果:1)能对SOLR集群中根据服务器的性能负载均衡存储相应比例的数据量,并支持按目标数据量自动创建分片,扩展集群。避免一个分片数据量太大,也避免了新数据插入时出现局部热点的问题,同时兼任新的服务器加入集群后,能自动识别并对SOLR Core数和文档数做负载均衡;
2)提出一种动态模型,用一个线程来监控SOLR中的文档数据量增长情况,在一定情况下动态根据服务器上节点数创建新的Core,并让后续新插入的数据分布到新的Core中,实现SOLR集群的动态分片和负载均衡。
附图说明
图1为本发明一实施例的动态创建分片的流程图;
图2为本发明一实施例的的将文档插入至相应的分片的流程图。
具体实施方式
为进一步说明各实施例,本发明提供有附图。这些附图为本发明揭露内容的一部分,其主要用以说明实施例,并可配合说明书的相关描述来解释实施例的运作原理。配合参考这些内容,本领域普通技术人员应能理解其他可能的实施方式以及本发明的优点。现结合附图和具体实施方式对本发明进一步说明。
本发明一实施例的支持均衡资源的SOLR集群扩展方法具体包括以下步骤:
1.根据服务器硬件资源安装SOLR节点:
SOLR集群中物理结构上以节点(node)来存储相应的数据,每台服务器上要充分利用资源,就得先评估出最多能安装的节点数。对于服务器资源,最大支持节点数量主要依赖于CPU、内存、磁盘空间、网络带宽等硬件设备性能,对于每一项的依赖先根据经验给出一个估计函数作为计算公式。比如内存的估计函数,可以先得出服务器上总的内存大小Sall,然后减去操作系统和其他非SOLR应用需要的内存资源Sother,这样就得出能分配给SOLR节点的最大的内存资源SSOLR=Sall-Sother。除以每个节点需要的内存资源Snode就能评估出从内存资源上允许支持的最多SOLR节点数,内存空间支持节点数的估计函数fmem的计算公式如下:
fmem=(Sall-Sother)/Snode
同理根据具体系统的情况和业务应用分别给出CPU、磁盘、网络这些设备能支持SOLR节点数的估计函数fcpu、fdisk、fnet。最终服务器能支持SOLR节点数取最小值fserver=Min(fdisk,fcpu,fmem,fnet)。按照估计数量安装SOLR节点,并加入到SOLRCloud中,默认先不创建分片。
2.设置动态集群的基本参数:
在SOLR的动态集群中,须先设置一些基本参数,比如对哪个collection(name)在哪些节点(serverNodes)上,以哪个配置(configName)创建分片,创建分片有几个节点(replicationFactor)。其次要记录动态集群的一些状态值,比如当前分片编号区间的编号(liveShardMinIndex~liveShardMaxIndex),当前每个节点分配Core的平均值,下一次新增分片时的文档数,目前所有相关节点中的Core的数目。这些参数和动态值以数据库或XML等形式持久化到磁盘中。
3.根据参数动态创建分片和调整入库策略,支持动态集群:
先创建一个线程,定时检测文档数,根据文档数量和系统参数动态创建分片,如图1所示,主要处理流程如下:
第一步:从SOLRCloud中读取collection总的文档数量,判断是否大于nextShardedDocNum,如果大于或等于则表示需要新增分片,进入步骤二。如果小于则进入步骤十三;
第二步:为了防止入库线程读取到不完整的数据,加上互斥锁;
第三步:根据公式addCoreNum=liveCoreNumPerNode*Nodes–sumCoreNum计算出这次计划新增的Core数量;
第四步:判断addCoreNum是否小于复制因子replicationFactor,如果小于则进入步骤五,否则进入步骤七;
第五步:调整liveCoreNumPerNode值加1;
第六步:根据公式addCoreNum=liveCoreNumPerNode*Nodes–sumCoreNum计算出这次计划新增的Core数量;
第七步:根据公式addShard=addCoreNum/replicationFactor计算出计划新增的分片数,取整数;
第八步:从zookeeper上读取集群状态,得到每个节点上已经安装的SOLR Core数量,然后跟liveCoreNumPerNode值比较,差值就是允许安装Core的最多个数;
第九步:根据每个节点上允许安装的Core数,创建一个分片到replicationFactor个Core上,为了提供容灾性,这replicationFactor个Core尽量分布到不同的节点中。分片的名称为shardX,其中X的值为一个递增不重复的整数,比如当前这轮新增的第i个分片,则X的值为liveCoreNumPerNode+i;
第十步:判断是否已经创建完addShard个分片,如果否则跳转到步骤九继续创建分片;如果是则进入步骤十一;
第十一步:更新动态分库的状态值,并更新持久化到磁盘。
liveShardMinIndex=liveShardMaxIndex+1;
liveShardMaxIndex=liveShardMaxIndex+addShard;
sumCoreNum=sumCoreNum+addCoreNum;
nextShardedDocNum=sumCoreNum*docNumPerCore;
第十二步:释放互斥锁,允许继续入库;
第十三步:线程休眠一定时间,待唤醒后进入步骤一重新检测;
需要说明的是:如果有新的服务器加入集群,先人工安装SOLR节点并配置加入到集群中,同时修改serverNodes参数值。新服务器加入后不会马上往新的服务器上创建Core,为了使得数据分布更加均衡,而是等到下一轮重新需要创建分片时触发,因为新服务器上的节点没有创建Core,则新的一轮中会把大部分的Core创建在新的服务器中,这样把Core均衡分布到相应的节点上。如果有新的服务器加入集群,第四步判断中会直接跳转到第七步,否则就从第四步顺序执行到第七步。
4.数据解析入库线程根据动态分库的状态值,把新数据均衡插入到相应的Core中,如图2所示,主要处理流程如下:
第一步:为了防止读取不完整的数据,先加互斥锁,跟动态分库的线程的互斥锁是同一个;
第二步:读取动态分片的参数liveShardMinIndex和liveShardMaxIndex;
第三步:在分片列表中shardI~shardJ中随机选择一个分片(I的值为liveShardMinIndex,J的值为liveShardMaxIndex)作为新数据的入库目标分片,设置片键字段为选中的分片名称;
第四步:提交文档,这样就均衡的把新数据插入到相应的分片中,同时消除了局部热点。
在另外的一个实施例中,本发明提出一种支持均衡资源的SOLR集群扩展系统,包括:
节点安装模块,用于根据服务器的硬件资源安装SOLR节点;
设置模块,用于设置SOLR集群的参数;
分片创建模块,用于根据SOLR集群中的SOLR集群的参数、当前的文档数量和当前的SOLR集群的状态值动态创建分片,SOLR集群的状态值被更新;
数据插入模块,用于根据更新后的SOLR集群的状态值将要写入的新文档插入至相应的分片,文档数量被更新;
循环模块,用于循环进入节点安装模块、设置模块、分片创建模块以及数据插入模块。
进一步的,所述的节点安装模块具体还用于:分别获取服务器的CPU、内存、磁盘空间和网络带宽所能允许支持的最多SOLR节点数,从中获取最小值即为服务器能支持SOLR节点数取最小值,按该最小值的数量安装SOLR节点。
进一步的,所述设置模块中的SOLR集群的参数包括:name,即集合collection的名称、configName,即集合collection的配置名称、serverNodes,即集合collection允许创建Core的节点以及replicationFactor,即复制因子,所述的SOLR集群的动态值包括:liveShardMinIndex,即入库数据存储分片列表中最小的下标、liveShardMaxIndex,即入库数据存储分片列表中最大的下标、liveCoreNumPerNode,即每个节点分配Core的平均值、nextShardedDocNum,即下一次分片时的文档数以及sumCoreNum,即所有节点中Core的数目。
进一步的,所述的分片创建模块具体还用于执行以下步骤:
S300,创建第一线程,所述第一线程监测SOLR集群的文档数量并执行S301以及S303至S311的步骤,以实现动态创建分片;
S301,读取SOLR集群中集合collection总的文档数量,判断是否大于nextShardedDocNum,如果大于或等于,则表示需要新增分片,进入步骤S302,如果小于,则进入步骤S313;
S302,对第一线程创建互斥锁;
S303,根据公式addCoreNum=liveCoreNumPerNode*Nodes–sumCoreNum计算出此次计划新增的Core数量;
S304,判断addCoreNum是否小于复制因子replicationFactor,如果小于,则进入步骤S305,否则进入步骤S307;
S305,调整liveCoreNumPerNode值加1;
S306,根据公式addCoreNum=liveCoreNumPerNode*Nodes–sumCoreNum计算出此次计划新增的Core数量;
S307,根据公式addShard=addCoreNum/replicationFactor计算出计划新增的分片数,取整数;
S308,读取SOLR集群状态值,获取每个节点上已经安装的SOLR Core数量,然后与liveCoreNumPerNode值比较,差值即为允许安装Core的最多个数;
S309,根据每个节点上允许安装的Core数,创建一个分片到replicationFactor个Core上,将该replicationFactor个Core分布到不同的节点中,分片的名称为shardX,其中X的值为一个递增不重复的整数,若当前这轮新增的第i个分片,则X的值为liveCoreNumPerNode+i;
S310,判断是否已经创建完addShard个分片,如果否,则跳转到步骤S309继续创建分片,如果是则进入步骤S311;
S311,更新SOLR集群状态值,并更新持久化到磁盘,状态值更新如下:
liveShardMinIndex=liveShardMaxIndex+1;
liveShardMaxIndex=liveShardMaxIndex+addShard;
sumCoreNum=sumCoreNum+addCoreNum;
nextShardedDocNum=sumCoreNum*docNumPerCore;
S312,释放互斥锁;
S313,第一线程休眠一定时间,待唤醒后进入步骤S301重新检测。
进一步的,所述的数据插入模块具体还用于执行以下步骤:
S401,创建第二线程,并对第二线程创建互斥锁,所述第二线程执行下述S402至S404的步骤,以将文档插入至相应的分片,所述互斥锁为与第一线程创建的互斥锁相同的互斥锁;
S402,读取SOLR集群的参数liveShardMinIndex和liveShardMaxIndex;
S403,在分片列表中shardI~shardJ中随机选择一个分片(I的值为liveShardMinIndex,J的值为liveShardMaxIndex)作为新文档数据的入库目标分片,设置片键字段为选中的分片名称;
S404,提交文档,均衡的将新文档数据插入到相应的分片中。
通过上述的方法及系统可以自动在SOLR的集群中,灵活的根据系统性能和数据量添加服务器到集群中,然后系统会自动根据服务器性能创建分片和复制集,均衡数据量到相应的SOLR Core中,无需人工手动添加分片,也不会造成局部热点的现象。
尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。