`
扬州老鬼
  • 浏览: 305769 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

关于SolrCloud的集群启动慢的原因调查

    博客分类:
  • solr
 
阅读更多
原创,转载请注明出处


在维护SolrCloud 集群过程中,最害怕的重启SolrCloud 集群,因为这需要等待很长的时间。
至于为啥要等待这么长的时间,到了今天我才花了点时间弄明白了。了解原理之后我也找到了快速重启集群的方法。
首先我们要说明的是,SolrCloud 集群在重启过程中步骤。
1.启动core实例,加载配置,replay log。这个不是本文所讲述的重点,暂时不去探讨。
2.Recover 、Sync恢复和同步。
整个事件就花费在recover和sync上面。
那么这个过程到底做了什么?
通过对比日志和代码,solr会把第一个启动实例作为集群中的leader,这个leader在启动的时候,首先做recover和sync,

Leader在做同步和恢复的时候的日志
引用
27771 [coreLoadExecutor-4-thread-23] INFO  org.apache.solr.cloud.SyncStrategy  – Sync replicas to http://192.168.1.166:9080/solr/testcore_r1/
27771 [coreLoadExecutor-4-thread-23] INFO  org.apache.solr.update.PeerSync  – PeerSync: core=testcore_r1 url=http://192.168.1.166:9080/solr START replicas=[http://192.168.1.165:9080/solr/testcore/] nUpdates=100
27903 [coreLoadExecutor-4-thread-43] INFO  org.apache.solr.cloud.ShardLeaderElectionContext  – Enough replicas found to continue.
27903 [coreLoadExecutor-4-thread-43] INFO  org.apache.solr.cloud.ShardLeaderElectionContext  – I may be the new leader - try and sync


从日志可以看出:作为leader的实例会发送http请求要求其他replica来向他自身进行recover和sync,但是此时由于leader和replica的web容器都还未启动好,所以发送请求是不成功,也就是会超时,这个超时恰好就是30秒,该timeout时间是在
SyncStrategy.requestRecovery():
  server.setConnectionTimeout(30000);
  server.setSoTimeout(120000);

这段代码到处可见。


所以在30秒时候就会出现超时,此时solr就会将这种情况是为自己已经准备好。
引用
57406 [coreLoadExecutor-4-thread-14] WARN  org.apache.solr.update.PeerSync  – PeerSync: core=testcore_r1 url=http://192.168.1.166:9080/solr  couldn't connect to http://192.168.1.165:9080/solr/testcore/, counting as success

57407 [coreLoadExecutor-4-thread-14] INFO  org.apache.solr.update.PeerSync  – PeerSync: core=testcore_r1 url=http://192.168.1.166:9080/solr DONE. sync succeeded

一旦solr的leader实例将自己的同步状态视为成功。此时他就再一次会去向replica发送同步命令。同样此时leader和replica的实例都没有准备好。
引用
57408 [coreLoadExecutor-4-thread-14] INFO  org.apache.solr.cloud.SyncStrategy  – http://192.168.1.166:9080/solr/testcore_r1/: try and ask http://192.168.1.165:9080/solr/testcore/ to sync


Replica日志如下:
引用
24149 [RecoveryThread] INFO  org.apache.solr.cloud.RecoveryStrategy  – ###### startupVersions=[]
24149 [RecoveryThread] INFO  org.apache.solr.cloud.ZkController  – publishing core=defaultcore1 state=recovering
24149 [RecoveryThread] INFO  org.apache.solr.cloud.ZkController  – numShards not found on descriptor - reading it from system property
25629 [localhost-startStop-1-EventThread] INFO  org.apache.solr.common.cloud.ZkStateReader  – A cluster state change: WatchedEvent state:SyncConnected type:NodeDataChanged path:/clusterstate.json, has occurred - updating... (live nodes size: 2)
。。。

从replica的日志上看你觉得他正在做recovery,但是我认为,由于web容器根本还没有启动好,根本不能接受和响应http请求,所以在SyncStrategy 中,到这里,我觉得http线程会timeout的。

这时你只有等待,等待,solr完成同步和恢复。于是你就等啊等啊,5分钟,10分钟,15分钟。。还没好。。

奇迹发生在780秒以后(是第18分钟),780秒之后,随着一大对异常的抛出,你集群好像活了,至少leader活了,并且replica上面的一些core活了。此时你要做的是将replica节点重新启动一遍,这一次,你发现replica启动非常快。

但是为什么需要等待18分钟?答案是solr这么固定了这个时间,SolrCloud的lead选举中设置了780(600+180)秒来作为leader选举的超时时间。至于代码么,就在org.apache.solr.cloud.ZkController.getLeaderProps中:
 String leaderUrl = getLeader(cloudDesc, leaderVoteWait + 600000);

这里的leaderVoteWait 时间ConfigSolr.DEFAULT_LEADER_VOTE_WAIT=180

以上代码就解释了为啥要等待18秒。

由于在web 容器启动过程中,阻塞了http的请求,所以lead向replica发送出来的请求都会超时,超时时长如前面所述:30秒。

所以总共要等待的时间是30+780=810秒,也就是说重启集群你至少需要810秒。

实际上在leader完成自身的同步之后,并没有能讲集群的leader信息写入到zk上面,而replica就是需要依赖在zk上面元数据,这样就会出现了死锁,只能利用超时来强行关闭replica上面的core。
那么如何要加快这个过程呢,答案是在集群重启之后,replica和leader都启动了,让leader尽快知道replica死了,也就是发送的http返回connection异常,而不是一直等待。
当leader发现replica死了之后,他就跳过等待replica的步骤,直接向zk上面写元数据。
当zk上面的有关集群的描述的元数据好了之后,再去启动replica就会,replica启动就会很快。
分享到:
评论

相关推荐

    SolrCloud集群搭建和使用步骤

    在传统的Solr基础上,SolrCloud引入了ZooKeeper作为集群的配置信息中心,实现了分布式索引和检索的高效管理。 1. **ZooKeeper的角色与功能** - **配置管理**:ZooKeeper作为一个分布式协调服务,可以集中管理配置...

    SolrCloud集群架构图

    一个简单的关于Solr集群部署的,SolrCloud集群架构图

    centos搭建solrcloud集群

    centos下搭建好solrcloud集群,可以直接使用!!!!!!

    SolrCloud集群搭建教程

    SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。 它有几个特色功能: 1)集中式的配置信息 2)自动容错 3)近实时搜索 4)查询时自动负载均衡 zookeeper是...

    SolrCloud集群部署

    SolrCloud集群部署详解 SolrCloud是Apache Solr的一项重要特性,为大规模、高容错性和分布式索引与检索提供了强大的解决方案。当面临大量索引数据和高并发搜索请求时,采用SolrCloud能够有效地应对挑战。它基于Solr...

    solrCloud的集群部署

    ### SolrCloud 集群部署相关知识点 #### 一、SolrCloud基本概念与架构 **1.1 SolrCloud的关键概念** - **Core**:在传统的Solr单机环境中,Core通常指的是一个单独的索引。但在SolrCloud环境中,一个索引可能由多...

    solrcloud高可用集群搭建

    ### SolrCloud 高可用集群搭建详解 #### 一、环境准备 为了构建一个SolrCloud高可用集群,首先需要准备好必要的软硬件环境。这里提到的环境包括操作系统、JDK、Zookeeper集群以及Solr集群。 **操作系统选择:** -...

    solrcloud分布式集群部署zookeeper集群安装+ClientCRUD实例

    SolrCloud是Apache Solr的一个分布式搜索和分析平台,它利用Zookeeper进行集群管理和协调。在本教程中,我们将深入探讨如何部署一个SolrCloud分布式集群,并安装Zookeeper集群,同时提供客户端的CRUD(创建、读取、...

    solrcloud 高可用集群搭建

    SolrCloud高可用集群搭建是实现大规模、分布式搜索引擎的关键步骤,它通过集成Zookeeper来管理和协调各个Solr节点,确保数据的一致性和可用性。在搭建过程中,我们需要遵循一定的步骤和配置,以下是一些关键的知识点...

    solrcloud windows 环境搭建

    - **启动Zookeeper集群**:完成配置后,分别启动三个Zookeeper实例。在Windows环境下,可以通过命令行执行`zkServer.cmd`来启动Zookeeper服务。 ##### 2. SolrCloud配置与部署 - **SolrCloud环境准备**:下载Solr...

    solr入门之搭建具有安全控制和权限管理功能的SolrCloud集群-附件资源

    solr入门之搭建具有安全控制和权限管理功能的SolrCloud集群-附件资源

    Window与Linux下搭建SolrCloud分布式集群环境

    Window与Linux下搭建SolrCloud分布式集群环境 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以...

    SolrCloud文档

    - **启动服务**:启动Tomcat和Solr服务,并确认集群状态正常。 ### 实战案例分析 假设我们需要为一个电商平台构建一个支持高并发搜索请求的系统,我们可以按照以下步骤来设计SolrCloud集群: 1. **规划Collection...

    solrcloud.rar

    SolrCloud是Apache Solr的一种分布式搜索和索引服务模式,它允许用户在多台服务器上部署和管理Solr实例,形成一个高可用、可扩展的搜索引擎集群。在这个集群中,数据分散存储并被索引,同时提供故障转移和负载均衡...

    solrcloud6安装配置

    为了启动SolrCloud,我们需要进入`bin`目录,并以集群模式运行Solr,指定Zookeeper集群的地址。例如,如果Zookeeper运行在`10.16.80.9:2181`, `10.16.80.10:2181`, 和 `10.16.80.11:2181`,可以运行以下命令: ```...

    SolrCloud应用

    SolrCloud模式引入了Zookeeper作为集群协调者,实现了分布式索引、搜索以及配置管理。在这个环境中,多个Solr节点组成一个集群,共同提供服务。 1. **分布式索引**:在SolrCloud中,数据被分割成多个逻辑单元,称为...

Global site tag (gtag.js) - Google Analytics