对SolrCloud集群Collection进行手动二次Sharding

article/2025/11/4 16:00:44
我们已经基于SolrCloud 4.3.1+Tomcat 7搭建了搜索服务器集群,一个Collection对应3个节点上的3个分片(Shard),同时包含对应分片的副本(Replica),此时,该Collection一共有6000万左右Document,平均每个分片大约接近2000万。
SolrCloud集群节点的具体分布,如图所示:

只有shard1有一个副本,并且位于不同的节点上。
随着索引数据量的增长,如果我们的Collection的每个分片都不断的增大,最后导致单个分片在搜索的时候,相应速度成为瓶颈,那么,我们要考虑将每个分片再次进行分片。因为第一次系统规划时已经设置好分片数量,所以每个分片所包含的Document数量几乎是相同的,也就是说,再次分片后,重新得到的分片的数量是原来的二倍。
目前,SolrCloud不支持自动分片,但是支持手动分片,而且手动分片后得到的新的分片所包含的Document数量有一定的差异(还不清楚SolrCloud是否支持手动分片后大致均分一个分片)。下面,我们看一下,在进行手动分片过程中,需要执行哪些操作,应该如何重新规划整个SolrCloud集群。

首先,我增加了一个节点(slave6 10.95.3.67),把集群中原来的配置文件、solr-cloud.war及其Tomcat服务器都拷贝到这个新增的节点上,目的是将10.95.3.62上的shard1再次分片,然后将再次得到分片运行在新增的10.95.3.67节点上。启动新增节点的Tomcat服务器,它自动去连接ZooKeeper集群,此时ZooKeeper集群增加live_nodes数量,主要是通过在Tomcat的启动脚本中增加如下内容:
JAVA_OPTS="-server -Xmx4096m -Xms1024m -verbose:gc -Xloggc:solr_gc.log -Dsolr.solr.home=/home/hadoop/applications/solr/cloud/multicore -DzkHost=master:2188,slave1:2188,slave4:2188"
这样,就能告知ZooKeeper集群有新节点加入SolrCloud集群。
如上图所示,我们打算将shard1进行二次手动分片,执行如下命令即可:
curl 'http://master:8888/solr-cloud/admin/collections?action=SPLITSHARD&collection=mycollection&shard=shard1'
这个过程花费的时间比较长,而且可能会伴有如下异常相应信息:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">500</int><int name="QTime">300138</int></lst><lst name="error"><str name="msg">splitshard the collection time out:300s</str><str name="trace">org.apache.solr.common.SolrException: splitshard the collection time out:300sat org.apache.solr.handler.admin.CollectionsHandler.handleResponse(CollectionsHandler.java:166)at org.apache.solr.handler.admin.CollectionsHandler.handleSplitShardAction(CollectionsHandler.java:300)at org.apache.solr.handler.admin.CollectionsHandler.handleRequestBody(CollectionsHandler.java:136)at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)at org.apache.solr.servlet.SolrDispatchFilter.handleAdminRequest(SolrDispatchFilter.java:608)at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:215)at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:155)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:722)
</str><int name="code">500</int></lst>
</response>
Solr这个版本,实际真正的执行手动分片的动作已经在SolrCloud集群中进行,可以忽略这个异常。我们需要注意的是,在进行手动分片的时候,尽量不要在集群操作比较频繁的时候进行,例如,我就是在保持10个线程同时进行索引的过程中进行手动分片的,观察服务器状态,资源消费量比较大,而且速度很慢。
在执行手动分片的过程中,我们可以通过Web管理页面。观察当前集群中节点的状态变化。
提交上面的命令以后,可以看到,集群中新增节点的状态,如图所示:

上面的状态是“Recovering”,也就是在将shard1中分成两个子分片,新增节点加入到集群,准备接收分片(或者对应的复制副本),如上图可见,shard3和shard1在新增节点上分别增加了一个副本。
接续看集群状态变化,如图所示:

在shard1所在节点(10.95.3.62)上,将shard1分成了两个子分片:shard1_0和shard1_1,此时,在10.95.3.62节点上有3个分片出于“Active”状态。实际上,到目前为止,子分片shard1_0和shard1_1已经完全接管了shard1分片,只是没有从图中自动离线退出,这个就需要我们在管理页面你上手动“unload”掉不需要的shard。
这时,新得到的两个子分片,并没有处理之前shard1的两个副本,他们也需要进行分片(实际上是重新复制新分片的副本),这个过程,如图所示:

等待“Recovering”恢复完成以后,我们就可以看到进入“Active”状态的节点图,如图所示:

手动分片的工作基本已经完成,这时候,如果继续索引新的数据,shard1及其副本不会再接收请求,所以数据已经在再次分片的子分片上,请求也会发送到那些子分片的节点上,下面需要将之前的shard1及其分片unload掉,即退出集群,要处理的分片主要包含如下几个:
mycollection_shard1_replica1
mycollection_shard1_replica_2
mycollection_shard1_replica_3
一定不要操作失误,否则可能会造成索引数据丢失的。unload这几个分片以后,新的集群的节点分布,如图所示:

shard1_0和shard1_1两个新的分片,对应的副本,分别如下所示:
mycollection_shard1_0_replica1
mycollection_shard1_0_replica2
mycollection_shard1_0_replica3

mycollection_shard1_1_replica1
mycollection_shard1_1_replica2
mycollection_shard1_1_replica3
下面,我们对比一下,手动二次分片以后,各个节点上Document的数量,如下表所示:
分片/副本名称所在节点文档数量
mycollection_shard1_0_replica110.95.3.6218839290
mycollection_shard1_0_replica210.95.3.6718839290
mycollection_shard1_0_replica310.95.3.6118839290
mycollection_shard1_1_replica110.95.3.62957980
mycollection_shard1_1_replica210.95.3.61957980
mycollection_shard1_1_replica310.95.3.67957980
mycollection_shard2_replica110.95.3.6223719916
mycollection_shard3_replica110.95.3.6123719739
mycollection_shard3_replica110.95.3.6723719739
可见,二次分片的shard1_1上面,Document数量相比于其它分片,十分不均。
SolrCloud也正在不断的更新中,在后续的版本可能会更多地考虑到分片的问题。另外,对于某个节点上的分片如果过大,影响了搜索效率,可以考虑另一种方案,就是重建索引,即使新增节点,重新索引再次重新分片,并均匀地分布到各个节点上。


参考链接
  • http://wiki.apache.org/solr/SolrCloud#Managing_collections_via_the_Collections_API
  • http://searchhub.org/2013/06/19/shard-splitting-in-solrcloud/


http://chatgpt.dhexx.cn/article/O8a34Ztq.shtml

相关文章

Solr SolrCloud相关概念

Solr支持服务器的分布式集群部署&#xff0c;即SolrCloud。在SolrCloud中&#xff0c;一个索引可以被分布到不同的服务器&#xff0c;即不同的node&#xff0c;所有的这些node组成一个collection&#xff0c;并且充分考虑了高可靠性和容错的设计。 SolrCloud使用zookeeper来管理…

SolrCloud概述

在Lucene/Solr的SVN trunk中的SolrCloud已经可用, 在即将发布的4.0版本中将正式包含. 目前SolrCloud已经成熟, 可以支持分布式索引和分布式搜索. 下面是我们一个项目采用新的SolrCloud的部署结构图: 看起来是否非常简单? 下面我们看看内部的一些实现细节. SolrCloud功能和架…

solr8.9部署solrcloud

安装solr tar xf solr-8.9.0.tgz cd solr-8.9.0 ./bin/install_solr_service.sh /root/solr-8.8.2.zip -d /data/solr -u solr -n # /root/solr-8.8.2.zip 指定tar包 # -d: 指定solr可写目录&#xff0c;solr数据文件、日志、pid文件、索引会写入到此目录下。默认/var/solr #…

搭建SolrCloud的详细步骤

###一、需求 SolrCloud(solr 云)是Solr提供的分布式搜索方案&#xff0c;当你需要大规模&#xff0c;容错&#xff0c;分布式索引和检索能力时使用 SolrCloud。 当一个系统的索引数据量少的时候是不需要使用SolrCloud的&#xff0c;当索引量很大&#xff0c;搜索请求并发很高&a…

SolrCloud Collection 创建

环境版本: CDH 5.12.0; Solr 4.10.3 CDH搭建SolrCloud集群十分方便,添加服务->solr->选择主机->next即可 在SolrCloud中,跨多个节点的索引分割称为集合(collection),见下图: [root@DXHY-YFEB-01 solr]# pwd /var/lib/solr [root@DXHY-YFEB-01 solr]# mv Invoi…

solrcloud集群搭建

什么是SolrCloud 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案&#xff0c;当你需要大规模&#xff0c;容错&#xff0c;分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的&#xff0c;当索引量很大&#xff0c…

Apache SolrCloud介绍及安装

SolrCloud介绍 在我们应用还很渺小的时候&#xff0c;一台Solr服务器能完全胜任这份工作&#xff0c;随着我们应用慢慢长大&#xff0c;访问也越来越多&#xff0c;一台Solr服务器的弊病也逐渐显现如查询变慢了&#xff0c;机器宕机就无法继续提供服务&#xff0c;于是乎我们引…

solr集群(solrcloud)部署搭建

简介 SolrCloud 旨在提供一个高度可用、容错的环境&#xff0c;用于跨多个服务器分发索引内容和查询请求。它是基于 Solr 和Zookeeper的分布式搜索方案&#xff0c;它的主要思想是使用 Zookeeper作为集群的配置信息中心。它是灵活的分布式搜索和索引&#xff0c;无需主节点来分…

SolrCloud之solr单机搭建使用

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 第一章 zookeeper的搭建 及启动脚本 第二章 solr单机搭建使用 第三章 solrCloud搭建及演化 文章目录 前言 随着互联网技术的不断迭代更新&#xff0c;分布式技术也越…

SolrCloud 搭建之 zookeeper搭建

系列文章目录 第一章 zookeeper的搭建 及启动脚本 第二章 solr单机搭建使用 第三章 solrCloud搭建及演化 文章目录 前言 随着互联网技术的不断迭代更新&#xff0c;分布式技术也越来越重要&#xff0c;很多人都开启了学习模式&#xff0c;本文就介绍了solr搭建及使用的基础…

solrCloud搭建及演化

系列文章目录 第一章 zookeeper的搭建 及启动脚本 第二章 solr单机搭建使用 第三章 solrCloud搭建及演化 文章目录 前言 solr是一个web项目&#xff0c;上一节我们部署了solr的单机版&#xff0c;实际上solrcloud是多个tomcat的组合&#xff0c;将多个tomcat部署之后&#…

SolrCloud原理

本文为调研分布式检索系统的笔记整理&#xff0c;之前调研sphinx和coreseek的时候&#xff0c;发现国内的博客&#xff0c;还是讲怎么配置怎么安装多&#xff0c;原理性的东西并不多。本文为&#xff1a;官网文档阅读笔记&#xff08;有些会附带上文档英文原文&#xff0c; 如果…

SolrCloud简介

原文地址&#xff1a;http://www.chepoo.com/solrcloud-introduction.html 一.简介 SolrCloud是Solr4.0版本以后基于Solr和Zookeeper的分布式搜索方案。SolrCloud是Solr的基于Zookeeper一种部署方式。Solr可以以多种方式部署&#xff0c;例如单机方式&#xff0c;多机Master-S…

Solr云(SolrCloud)

SolrCloud只是作为Solr的一个突出特性&#xff0c;这个特殊的特性能够实现分布式功能。利用这个功能&#xff0c;你能建立高效、容错的Solr服务器群。这对于访问量规模巨大的企业级应用来说&#xff0c;使用SolrCloud能实现高有效性、容错性、分布式索引和搜索功能。 1 了…

solrcloud入门详细使用教程

一、solrcloud介绍 solrcloud是solr提供的分布式的搜索方案&#xff0c;当我们需要大规模&#xff0c;容错&#xff0c;分布式搜索和索引时使用solrcloud。当系统的索引量少&#xff0c;请求并发性低的时候不需要用到solrcloud。solrcloud是基于solr和zookeeper的分布式搜索方案…

Solr--SolrCloud简介与集群搭建

Solr 集群(SolrCloud) 1 什么是 SolrCloud SolrCloud(solr 云)是 Solr 提供的分布式搜索方案&#xff0c;当你需要大规模&#xff0c;容错&#xff0c;分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用 SolrCloud 的&#xff0c;当索引量很大…

SolrCloud详解及搭建

1. 什么是SolrCloud 1.1. 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案&#xff0c;当你需要大规模&#xff0c;容错&#xff0c;分布式索引和检索能力时使用SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的&#xff0c;当索引量很大&am…

SolrCloud简介——solr 名词解释

转自——找不到出处了。。 一.简介 SolrCloud是Solr4.0版本以后基于Solr和Zookeeper的分布式搜索方案。SolrCloud是Solr的基于Zookeeper一种部署方式。Solr可以以多种方式部署&#xff0c;例如单机方式&#xff0c;多机Master-Slaver方式。 二.特色功能 SolrCloud有几个特色…

MySQL全文索引功能

说明自然语言全文索引布尔全文索引 相关性计算 扩展查询 官网地址:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html 说明 简介 1).MySQL中的全文索引是FultLeXT类型的索引。 2).全文索引只能用于InnoDB或MyISAM表&#xff0c;只能为CHAR、VARCHAR或文本列创建…

Mysql——全文索引

概念&#xff1a; 一般查询都是根据数值范围或者精准的字符串进行数据过滤查询&#xff0c;而全文索引则通过关键字的匹配来进行查询过滤&#xff0c;那么就需要基于相似度的查询&#xff0c;而不是原来的精确数值或字符串比较。 版本支持&#xff1a; 在MySQL 5.7.6之前&am…