深入剖析SolrCloud(一)

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:
  SolrCloud是基于Solr和Zookeeper的分布式搜索方案,是正在开发中的Solr4.0的核心组件之一,它的主要思想是使用Zookeeper作为集群的配置信息中心。它有几个特色功能:1)集中式的配置信息 2)自动容错 3)近实时搜索 4)查询时自动负载均衡 

 

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

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

首先去https://builds.apache.org/job/Solr-trunk/lastSuccessfulBuild/artifact/artifacts/下载Solr4.0的源码和二进制包,注意Solr4.0现在还在开发中,因此这里是Nightly Build版本。

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



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

为了弄2个solr服务器,我们拷贝一份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状态信息,并将本机所在节点设置为shard1的leader节点,并向整个集群发布最新的集群状态信息。

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

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

1) 本机连接到集群所在的Zookeeper,
2) 将自己这个节点注册到/node_states/目录下
3)  同时将自己注册到/live_nodes/目录下
4) 本机从Zookeeper中更新集群状态信息,维持与Zookeeper上的集群信息一致
5) 从集群中保存的配置文件加载Solr所需要的配置信息
6) 启动本地solr服务器,
7) solr启动完成后,将本节点注册为集群中的shard,并将本机设置为shard2的Leader节点,
8) 本机从Zookeeper中再次更新集群状态信息,第二台solr服务器启动完毕。
示例2,包含2个shard的集群,每个shard中有replica节点


如图所示,集群包含2个shard,每个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会监测各个shard的leader节点,如果leader节点挂了,则会启动自动的容错机制,会从同一个shard中的其他replica节点集中重新选举出一个leader节点,甚至如果overseer节点自己也挂了,同样会自动在其他节点上启用新的overseer节点,这样就确保了集群的高可用性。
示例3 包含2个shard的集群,带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个节点的集群的状态,可以发现其实和上一个没有任何区别。
后续的文章将从实现层面对SolrCloud这个分布式搜索解决方案进行进一步的深入剖析。



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2012/02/10/2345634.html,如需转载请自行联系原作者
目录
相关文章
|
供应链 中间件
哥斯拉内存马/Suo5内存代理插件
哥斯拉内存马/Suo5内存代理插件
1375 0
|
XML 前端开发 Java
SpringBoot整合Flowable【08】- 前后端如何交互
本文详细介绍了如何通过 Flowable 的 BpmnModel API 以编程方式动态构建 BPMN 流程模型,而无需依赖 XML 文件。文章从实际业务场景出发,探讨了前端传递参数实现流程创建的可行性,并通过代码示例展示了整个实现过程。 主要内容包括:定义流程实体与节点结构、创建控制器处理请求、服务层实现流程模型转换及部署、递归构建任务节点和子节点、创建任务监听器和表单属性等关键方法。最后通过 curl 命令测试接口,验证流程部署成功。 虽然此方法灵活强大,但复杂流程的构建需编写大量代码。建议封装常用元素(如开始/结束事件、网关等),提升开发效率和代码可维护性。
336 0
SpringBoot整合Flowable【08】- 前后端如何交互
|
9月前
|
机器学习/深度学习 人工智能 计算机视觉
ConsisID:北大联合鹏城实验室等机构推出的文本到视频生成模型
ConsisID是由北京大学和鹏城实验室等机构联合推出的文本到视频生成模型,专注于保持视频中人物身份的一致性。该模型采用频率分解技术和免调优的Diffusion Transformer架构,能够在多个评估维度上超越现有技术,推动身份一致性视频生成技术的发展。
253 73
ConsisID:北大联合鹏城实验室等机构推出的文本到视频生成模型
|
9月前
|
SQL DataWorks 数据可视化
DataWorks产品体验与评测
在当今数字化时代,数据处理的重要性不言而喻。DataWorks作为一款数据开发治理平台,在数据处理领域占据着重要的地位。通过对DataWorks产品的体验使用,我们可以深入了解其功能、优势以及存在的问题,并且与其他数据处理工具进行对比,从而为企业、工作或学习中的数据处理提供有价值的参考。
343 6
DataWorks产品体验与评测
|
开发工具 git
【git】解决Gitea推送创建失败
【git】解决Gitea推送创建失败
685 0
|
9月前
|
数据可视化 Python
使用Python进行数据可视化的初学者指南
在数据的海洋里,我们如何能够不迷失方向?通过数据可视化的力量,我们可以将复杂的数据集转化为易于理解的图形和图表。本文旨在为初学者提供一份简明的入门手册,介绍如何使用Python中的Matplotlib库来揭示数据背后的故事。我们将从基础的图表开始,逐步深入到更高级的可视化技术,确保每个步骤都清晰易懂,让初学者也能轻松上手。让我们开始绘制属于你自己的数据图谱吧!
|
9月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
622 5
|
存储 编解码 JavaScript
深度解析Qt背景设计:从基础到高级,从Widget到Quick(二)
深度解析Qt背景设计:从基础到高级,从Widget到Quick
675 0
|
网络协议 关系型数据库 MySQL
解决本地计算机上的MySQL80服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止
解决本地计算机上的MySQL80服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止
6575 1
解决本地计算机上的MySQL80服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止