`
wbj0110
  • 浏览: 1586619 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

深入剖析SolrCloud(一)

阅读更多

   SolrCloud是基于SolrZookeeper分布式搜索方案,是正在开发中的Solr4.0的核心组件之一,它的主要思想是使用Zookeeper作为集群的配置信息中心。它有几个特色功能:1)集中式的配置信息 2)自动容错 3)近实时搜索 4)查询时自动负载均衡 

 

基本可以用上面这幅图来概述,这是一个拥有4Solr节点的集群,索引分布在两个Shard里面,每个Shard包含两个Solr节点,一个是Leader节点,一个是Replica节点,此外集群中有一个负责维护集群状态信息的Overseer节点,它是一个总控制器。集群的所有状态信息都放在Zookeeper集群中统一维护。从图中还可以看到,任何一个节点都可以接收索引更新的请求,然后再将这个请求转发到文档所应该属于的那个ShardLeader节点,Leader节点更新结束完成,最后将版本号和文档转发给同属于一个Shardreplicas节点。

下面我们来看一个简单的SolrCloud集群的配置过程。

首先去https://builds.apache.org/job/Solr-trunk/lastSuccessfulBuild/artifact/artifacts/下载Solr4.0的源码和二进制包

示例1,简单的包含2Shard的集群

这个示例中,我们把一个collection的索引数据分布到两个shard上去,步骤如下:

为了弄2solr服务器,我们拷贝一份example目录 

cp -r example example2

然后启动第一个solr服务器,并初始化一个新的solr集群, 

cd example
java -Dbootstrap_confdir=./solr/conf -Dcollection.configName=myconf -DzkRun -DnumShards=2 -jar start.jar

-DzkRun参数是启动一个嵌入式的Zookeeper服务器,它会作为solr服务器的一部分,-Dbootstrap_confdir参数是上传本地的配置文件上传到zookeeper中去,作为整个集群共用的配置文件,-DnumShards指定了集群的逻辑分组数目。 

然后启动第二个solr服务器,并将其引向集群所在位置

cd example2
java -Djetty.port=7574 -DzkHost=localhost:9983 -jar start.jar

-DzkHost=localhost:9983就是指明了Zookeeper集群所在位置

我们可以打开http://localhost:8983/solr/collection1/admin/zookeeper.jsp 或者http://localhost:8983/solr/#/cloud看看目前集群的状态,

现在,我们可以试试索引一些文档,

cd exampledocs
java -Durl=http://localhost:8983/solr/collection1/update -jar post.jar ipod_video.xml
java -Durl=http://localhost:8983/solr/collection1/update -jar post.jar monitor.xml
java -Durl=http://localhost:8983/solr/collection1/update -jar post.jar mem.xml

最后,来试试分布式搜索吧:

http://localhost:8983/solr/collection1/select?q

Zookeeper维护的集群状态数据是存放在solr/zoo_data目录下的。

现在我们来剖析下这样一个简单的集群构建的基本流程:

先从第一台solr服务器说起:

1)       它首先启动一个嵌入式的Zookeeper服务器,作为集群状态信息的管理者,

2 将自己这个节点注册/node_states/目录下

3 同时将自己注册到/live_nodes/目录下

4)创建/overseer_elect/leader,为后续Overseer节点的选举做准备,新建一个Overseer

5) 更新/clusterstate.json目录下json格式的集群状态信息

6) 本机从Zookeeper中更新集群状态信息,维持与Zookeeper上的集群信息一致

7)上传本地配置文件到Zookeeper中,供集群中其他solr节点使用

8) 启动本地的Solr服务器,

9) Solr启动完成后,Overseer会得知shard中有第一个节点进来,更新shard状态信息,并将本机所在节点设置为shard1leader节点,并向整个集群发布最新的集群状态信息。

10)本机从Zookeeper中再次更新集群状态信息,第一台solr服务器启动完毕。

然后来看第二台solr服务器的启动过程:

1) 本机连接到集群所在的Zookeeper

2) 将自己这个节点注册到/node_states/目录下

3)  同时将自己注册到/live_nodes/目录下

4) 本机从Zookeeper中更新集群状态信息,维持与Zookeeper上的集群信息一致

5) 从集群中保存的配置文件加载Solr所需要的配置信息

6) 启动本地solr服务器,

7) solr启动完成后,将本节点注册为集群中的shard,并将本机设置为shard2Leader节点,

8) 本机从Zookeeper中再次更新集群状态信息,第二台solr服务器启动完毕。

示例2,包含2shard的集群,每个shard中有replica节点

如图所示,集群包含2shard,每个shard中有两个solr节点,一个是leader,一个是replica节点,

cp -r example exampleB
cp -r example2 example2B
cd exampleB
java -Djetty.port=8900 -DzkHost=localhost:9983 -jar start.jar
cd example2B
java -Djetty.port=7500 -DzkHost=localhost:9983 -jar start.jar

我们可以打开http://localhost:8983/solr/collection1/admin/zookeeper.jsp  看看包含4个节点的集群的状态,

 

  

 

这个集群现在就具备容错性了,你可以试着干掉一个Solr服务器,然后再发送查询请求。背后的实质是集群的ov erseer会监测各个shardleader节点,如果leader节点挂了,则会启动自动的容错机制,会从同一个shard中的其他replica节点集中重新选举出一个leader节点,甚至如果overseer节点自己也挂了,同样会自动在其他节点上启用新的overseer节点,这样就确保了集群的高可用性。

示例包含2shard的集群,带shard备份和zookeeper集群机制

 

上一个示例中存在的问题是:尽管solr服务器可以容忍挂掉,但集群中只有一个zookeeper服务器来维护集群的状态信息,单点的存在即是不稳定的根源。如果这个zookeeper服务器挂了,那么分布式查询还是可以工作的,因为每个solr服务器都会在内存中维护最近一次由zookeeper维护的集群状态信息,但新的节点无法加入集群,集群的状态变化也不可知了。因此,为了解决这个问题,需要对Zookeeper服务器也设置一个集群,让其也具备高可用性和容错性。

有两种方式可选,一种是提供一个外部独立的Zookeeper集群,另一种是每个solr服务器都启动一个内嵌的Zookeeper服务器,再将这些Zookeeper服务器组成一个集群。 我们这里用后一种做示例:

cd example
java -Dbootstrap_confdir=./solr/conf -Dcollection.configName=myconf -DzkRun -DzkHost=localhost:9983,localhost:8574,localhost:9900 -DnumShards=2 -jar start.jar
cd example2
java -Djetty.port=7574 -DzkRun -DzkHost=localhost:9983,localhost:8574,localhost:9900 -jar start.jar
cd exampleB
java -Djetty.port=8900 -DzkRun -DzkHost=localhost:9983,localhost:8574,localhost:9900 -jar start.jar
cd example2B
java -Djetty.port=7500 -DzkHost=localhost:9983,localhost:8574,localhost:9900 -jar start.jar

我们可以打开http://localhost:8983/solr/collection1/admin/zookeeper.jsp  看看包含4个节点的集群的状态,可以发现其实和上一个没有任何区别。

来自互联网

分享到:
评论

相关推荐

    深入剖析NGINGX

    深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入剖析NGINGX深入...

    《深入剖析 Tomcat》PDF版本下载.txt

    根据提供的文件信息,本文将对《深入剖析 Tomcat》这一资料进行详细的知识点解析。Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web应用程序的部署与运行环境中。本资料旨在帮助读者深入了解Tomcat的工作原理...

    Oracle11g体系结构深入剖析和运维管理(一)

    资源名称:Oracle 11g体系结构深入剖析和运维管理(一)资源目录:【】1_Oracle学习前奏【】2_Oracle软件安装准备工作【】3_Oracle软件安装和数据库的创建【】4_Oracle数据库及相关软件的启动和关闭【】5_计算机工作...

    《深入剖析TOMCAT.pdf》(中文版,带目录)

    带目录的《深入剖析TOMCAT》中文版,带目录,便于大家阅读

    内存管理深入剖析内存管理深入剖析内存管理深入剖析

    _内存管理深入剖析 第1章 内存初学者指南 计算机内存的类型: 长期或短期 计算机内存的发展 应用程序如何寻找内存 内存管理程序如何工作 典型问题 第2章 计算机如何看待内存 微处理器 INTEL微处理器系列的发展 内存...

    《计算的本质:深入剖析程序和计算机》_编程的本质_《计算的本质:深入剖析程序和计算机》_计算机_tunegua_

    《计算的本质:深入剖析程序和计算机》是一本深入探讨编程理论和计算机科学核心概念的书籍。作者通过使用 Ruby 语言的实例,使复杂的计算概念变得易于理解,旨在帮助读者掌握编程语言设计的基础知识。 首先,我们要...

    计算的本质:深入剖析程序和计算机(完整版 电子书 文字版)Tom Stuart

     《计算的本质:深入剖析程序和计算机》面向熟悉某种现代编程语言却非科班出身的程序员,是一本帮你真正理解计算机科学和计算原理的优秀参考书。申明:本资源来源于互联网,如有侵权,请联系本人或者CSDN进行删除,...

    全面深入剖析SaaS

    深入剖析SaaS之一: SaaS的前身ASP 1 深入剖析SaaS之二: SaaS介绍 9 深入剖析SaaS之三: SaaS的特性 18 深入剖析SaaS之四: SaaS的好处 22 SaaS在中国抓住“长尾”需特殊商业模式 30 SaaS在中国的产生及发展 32 IBM博士...

    tomcat深入剖析

    tomcat深入剖析tomcat深入剖析tomcat深入剖析tomcat深入剖析tomcat深入剖析tomcat深入剖析tomcat深入剖析

    深入剖析TOMCAT_高清中文_带完整章节目录多版本

    《深入剖析Tomcat》是一本专门针对Java领域的Web服务器Tomcat进行深度解析的权威书籍。这本书以高清中文的形式呈现,包含完整的章节目录,旨在帮助读者全面理解和掌握Tomcat的内部工作原理及其在实际开发中的应用。...

    linux深入剖析基于0.11

    linux深入剖析基于0.11linux深入剖析基于0.11linux深入剖析基于0.11

    深入剖析Tomcat-高清-书签

    深入剖析Tomcat 高清带书签 深入剖析Tomcat 高清带书签

    Windows深入剖析(初始化篇).

    Windows深入剖析(初始化篇).Windows深入剖析(初始化篇).

    深入剖析tomcat (完整目录)

    【深入剖析Tomcat——完整目录】 Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,是一个开源的、免费的Web应用服务器,主要用于运行Java Servlet和JavaServer Pages(JSP)。Tomcat以其轻量级、易用性...

    WindowsXP 深入剖析

    WindowsXP 深入剖析-王達時

    深入剖析Tomcat书本源码

    《深入剖析Tomcat》这本书是Java开发者们探索Web服务器内部工作原理的重要参考资料,它详细解析了Tomcat的源代码,帮助我们理解这个流行的开源Servlet容器的运作机制。Tomcat是Apache软件基金会的一个项目,它是Java...

    深入剖析Nginx

    《深入剖析Nginx》不是一本关于Nginx配置指令如何使用的介绍手册。《深入剖析Nginx》重点在于通过剖析Nginx的源代码,探究其功能结构及其内部实现原理。全书共14章和3个附录。首先介绍了开始剖析Nginx源代码前的准备...

    深入剖析Visual C++编程技术及应用实例

    《深入剖析Visual C++编程技术及应用实例》通过主流开发领域内的若干具有代表性的实例,向读者深入细致地讲解了利用Visual C++6.0进行Windows高级软件开发的相关技术。本书涉及的领域包括用户界面、文件系统、图形...

    深入剖析Tomcat(含源码示例)

    《深入剖析Tomcat》是一本针对Java开发者的专业书籍,它深入探讨了Tomcat服务器的内部工作原理,旨在帮助读者理解并优化应用程序的性能。这本书以源码分析为核心,提供了丰富的示例,使读者能够通过实践更好地理解和...

Global site tag (gtag.js) - Google Analytics