一、什么是SolrCloud
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。
特点:
- 集中式的配置信息
自动容错
近实时搜索
查询时自动负载均衡
二、Solr集群的系统架构
物理结构:
三个Solr实例( 每个实例包括两个Core),组成一个SolrCloud
逻辑结构:
Collection在SolrCloud集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多个Shard(分片),它们使用相同的配置信息
比如:针对商品信息搜索可以创建一个collection,扩容增加Shard即可
collection=shard1+shard2+....+shardX
Core:
- 每个Core是Solr中一个独立运行单位,提供 索引和搜索服务。一个shard需要由一个Core或多个Core组成。由于collection由多个shard组成所以collection一般由多个core组成
Shard:
Collection的逻辑分片。每个Shard被化成一个或者多个replication,通过选举确定哪个是Leader
上图的两个Shard的数据不同,但是每个Shard分了三个结点,三个结点的数据是相同的,这三个结点有一个主服务器结点,两个从服务器结点【分散存储】,可以解决高并发和负载均衡
需要实现的solr集群架构:
- Zookeeper作为集群的管理工具
- 集群管理:容错、负载均衡
- 配置文件的集中管理
- 集群的入口
需要实现zookeeper 高可用。需要搭建集群。建议是奇数节点。需要三个zookeeper服务器。
搭建solr集群至少需要7台服务器。
这里因环境限制,演示的是搭建伪分布式(在一台虚拟机上,建议内存至少1G):
需要三个zookeeper节点
需要四个tomcat节点。
本文使用tomcat进行部署,而不使用solr自带的jetty
三、首先搭建ZooKeeper集群
安装JDK教程:https://blog.csdn.net/Future_LL/article/details/84667634
上传并解压所需要的压缩包,压缩格式:tar -zxvf 需要压缩的包名
把ZooKeeper复制三份
在每个zookeeper目录下创建一个data目录
在data目录下创建一个myid文件,文件名就叫做“myid”。内容就是每个实例的id。例如1、2、3
- 举例:查看zookeeper01下的data是否有文件myid,并且内容为1
把conf目录下的zoo_sample.cfg文件改名为zoo.cfg
修改zoo.cfg配置文件,这里以zookeeper01举例,zookeeper02,、zookeeper03自己配置
启动每个zookeeper实例
- 使用批处理启动ZooKeeper
cd /usr/local/solr-cloud/zookeeper01/bin/ ./zkServer.sh start cd /usr/local/solr-cloud/zookeeper02/bin/ ./zkServer.sh start cd /usr/local/solr-cloud/zookeeper03/bin/ ./zkServer.sh start
- 更改批处理文件的权限
- 运行批处理文件
- 分别查看每个实例的状态
如果你显示的是这样子的一个领导两个部下(leader和follower不一定是谁,随机的),那么就代表zookeeper集群已经搭建完成
四、搭建Solr集群
我们这里先搭建只用一个服务器的Solr:https://blog.csdn.net/Future_LL/article/details/84676913
创建四个tomcat实例。每个tomcat运行在不同的端口。tomcat01改为8180、tomcat02改为8280、tomcat03改为8380、tomcat04改为8480
- 这里以tomcat01举例:
把单机版的solr实例复制到集群中的tomcat中
为每个solr实例创建一个对应的solrhome。使用单机版的solrhome复制四份
查看solr-cloud是否有上图所创建的文件
配置solrCloud相关的配置。每个solrhome下都有一个solr.xml,把其中的ip及端口号配置好
以solrhome01为例,修改solr.xml
其他得solrhome0X根据上图进行修改配置文件
需要修改solr服务的web.xml文件,把solrhome关联起来,这里以tomcat01为例
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/usr/local/solr-cloud/solrhome01</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
其余的tomcat02,03,04同上
修改tomcat/bin目录下的catalina.sh 文件,关联solr和zookeeper,这里以tomcat01为例
通过Tomcat给Solr传递一个参数,告诉Solr ZooKeeper在哪
JAVA_OPTS="-DzkHost=192.168.229.128:2181,192.168.229.128:2182,192.168.229.128:2183"
其余的tomcat02,03,04同上
让zookeeper统一管理配置文件。需要把/conf目录上传到zookeeper
现在我们每一个solr都有了自己的solrhome,现在我们要让每一个solr实例的配置文件都一样,这个配置文件需要集中管理,这个时候我们使用zookeeper来统一管理配置文件。所以要将配置文件上传到zookeeper中。那么上传哪些配置文件呢
这里注意下managed-schema文件,网上有很多低版本solr,会提到一个collection1/conf下的schema.xml,但是并没有找到。好像是从5.0版本开始不使用schema.xml的,这俩其实内容都一样,搞不懂为啥要换个名字,而且内容格式是xml,但是文件名却没有.xml的后辍,这里直接上传整个conf目录就行
在下图的目录有一个脚本文件,执行这个脚本就可以将配置文件上传到zookeeper了
注意:执行上传前,需要启动ZooKeeper集群
执行上传脚本
查看是否上传成功
启动每个tomcat实例。要包装zookeeper集群是启动状态
使用批处理启动Tomcat
/usr/local/solr-cloud/tomcat01/bin/startup.sh /usr/local/solr-cloud/tomcat02/bin/startup.sh /usr/local/solr-cloud/tomcat03/bin/startup.sh /usr/local/solr-cloud/tomcat04/bin/startup.sh
- 修改批处理文件的权限
运行脚本启动Tomcat
访问集群 localhost:8180/solr/index.html
创建新的Collection进行分片处理
-
- 这样一个最简单的Solr集群就单间成功了