一、基础
1.什么是SolrCloud
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。
它有几个特色功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡
2.什么是Zookeeper
Zookeeper:是一个分布式的、开源的程序协调服务,是hadoop项目下的一个子项目。
-
配置管理
在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。但是当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多,有很多服务器都需要这个配置,而且还可能是动态的话使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。比如我们可以把配置放在数据库里,然后所有需要配置的服务都去这个数据库读取配置。但是,因为很多服务的正常运行都非常依赖这个配置,所以需要这个集中提供配置服务的服务具备很高的可靠性。一般我们可以用一个集群来提供这个配置服务,但是用集群提升可靠性,那如何保证配置在集群中的一致性呢? 这个时候就需要使用一种实现了一致性协议的服务了。Zookeeper就是这种服务,它使用Zab这种一致性协议来提供一致性。现在有很多开源项目使用Zookeeper来维护配置,比如在HBase中,客户端就是连接一个Zookeeper,获得必要的HBase集群的配置信息,然后才可以进一步操作。还有在开源的消息队列Kafka中,也使用Zookeeper来维护broker的信息。在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理。 -
名字服务
名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是不能是别域名的。怎么办呢?如果我们每台机器里都备有一份域名到IP地址的映射,这个倒是能解决一部分问题,但是如果域名对应的IP发生变化了又该怎么办呢?于是我们有了DNS这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。 -
分布式锁
其实在第一篇文章中已经介绍了Zookeeper是一个分布式协调服务。这样我们就可以利用Zookeeper来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader选举)。比如HBase的Master就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的使用。 -
集群管理
在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。
3.SolrCloud结构
SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。
SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。
![](https://i-blog.csdnimg.cn/blog_migrate/f28556db1a7af85dd6bfa10c45d46572.png)
注解如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/e36431a8a1a3851035bc3344049a77dc.png)
-
物理结构
三个Solr实例( 每个实例包括两个Core),组成一个SolrCloud。 -
逻辑结构
索引集合包括两个Shard(shard1和shard2),shard1和shard2分别由三个Core组成,其中一个Leader两个Replication,Leader是由zookeeper选举产生,zookeeper控制每个shard上三个Core的索引数据一致,解决高可用问题。
用户发起索引请求分别从shard1和shard2上获取,解决高并发问题。 -
collection
Collection在SolrCloud集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多个Shard(分片),它们使用相同的配置信息。
比如:针对商品信息搜索可以创建一个collection。
collection=shard1+shard2+…+shardX -
Core
每个Core是Solr中一个独立运行单位,提供 索引和搜索服务。一个shard需要由一个Core或多个Core组成。由于collection由多个shard组成所以collection一般由多个core组成。 -
Master或Slave
Master是master-slave结构中的主结点(通常说主服务器),Slave是master-slave结构中的从结点(通常说从服务器或备服务器)。同一个Shard下master和slave存储的数据是一致的,这是为了达到高可用目的。 -
Shard
Collection的逻辑分片。每个Shard被化成一个或者多个replication,通过选举确定哪个是Leader。
二、准备
我们要搭建的集群如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/2086fdb803d95d99f49e6f43ca0b6b0d.png)
由图中所示,我们主要搭建三台zookeeper实例,四个tomcat实例,我们在一台虚拟机上进行搭建。
1.上传安装包
首先安装上传程序:yum install lrzsz
输入rz
命令将Solr、zookeeper、tomcat上传至Linux。
![](https://i-blog.csdnimg.cn/blog_migrate/8a26675070d16777ea0ba5f922cb9b7c.png)
输入命令 tar -zxf 文件名
将三个文件解压,重命名如图。
2.环境
由于zookeeper为JAVA开发,因此需要安装JDK。可以通过JAVA -version
查看JDK版本。
![](https://i-blog.csdnimg.cn/blog_migrate/34aa7bfb4a5dd443b9a57900b9aa8117.png)
三、Zookeeper安装
1.配置
在/usr/local/下创建文件夹solrcloud,并将解压后的文件拷贝三份至该文件夹下,分别命名为z1、z2、z3。
![](https://i-blog.csdnimg.cn/blog_migrate/291e87934e70a3d1dcedd8f4f282c303.png)
在每个文件夹下创建一个data目录,在data下创建一个myid的文件,文件的内容为zookeeper的编号1、2、3。
![](https://i-blog.csdnimg.cn/blog_migrate/94507272b487f7a7ac695e798927706c.png)
接着修改配置文件。进入目录z1/conf,将文件zoo_sample.cfg复制一份并重命名为zoo.cfg。
![](https://i-blog.csdnimg.cn/blog_migrate/817e131b36ec22393b6bb3143dbd6dfb.png)
将图中的目录修改为刚才我们创建的文件的目录,并配置每个实例的选举端口和投票端口,注意三个服务端口不能配成一样,需要区分。
![](https://i-blog.csdnimg.cn/blog_migrate/ba025097a8cd6bb1a919c4ebd2f0647b.png)
z1配置:
![](https://i-blog.csdnimg.cn/blog_migrate/a4c2a7dc313047c80423e22df365818b.png)
z2配置:
![](https://i-blog.csdnimg.cn/blog_migrate/fe315aa9c712a340a4b7d23aa9d2c00e.png)
z3配置:
![](https://i-blog.csdnimg.cn/blog_migrate/0a2ed59a9fcb6c4a2ef78db06c967101.png)
2.启动zookeeper
进入z1/bin目录
启动zookeeper:./zkServer.sh start
关闭zookeeper:./zkServer.sh stop
查看状态: ./zkServer.sh status
我们创建shell脚本进行统一启动:touch startzoo.sh
修改脚本的执行权限:chmod +x startzoo.sh
![](https://i-blog.csdnimg.cn/blog_migrate/13340002dd34ae2c2b7f6120d8042ac0.png)
写入脚本:
cd z1/bin/
./zkServer.sh start
cd ../../
cd z2/bin/
./zkServer.sh start
cd ../../
cd z3/bin/
./zkServer.sh start
cd ../../
保存即可。接着运行 ./startzoo.sh
![](https://i-blog.csdnimg.cn/blog_migrate/41051278bd1c01d064b5bc894c7d59dd.png)
查看所有zookeeper运行状态。
![](https://i-blog.csdnimg.cn/blog_migrate/02aaea3a8ec10be2370e3cfcbc44a24f.png)
可以看到,三个zookeeper实例都已经启动,并且,z2经过选举处于leader状态,其余两个处于follower状态。
至此zookeeper集群安装完成
四、solr集群安装
1、solr实例搭建
创建四个tomcat:
![](https://i-blog.csdnimg.cn/blog_migrate/917b37bc638d425bcbc1a698cdb12f65.png)
修改四个实例的端口分别为8080-8083。
此处只演示修改tomcat2:
进入目录 cd tomcat/conf/
打开文件 vim server.xml
进行修改
![](https://i-blog.csdnimg.cn/blog_migrate/bdc2ff8f704a1829631d2c4f27e2c4bd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/17f940f31a2d070057e3577747abf8d0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/967f239baa7fefd95ba883ed5f915fc8.png)
solr实例的创建见另一篇博客:
https://blog.csdn.net/qq_22118991/article/details/100143608
完成四个solr实例的安装。
2、solr集群搭建
1.将solrhome中的配置文件上传至zookeeper集群
使用zookeeper客户端进行上传,客户端命令位置在:
/root/solr/example/scripts/cloud-scripts
![](https://i-blog.csdnimg.cn/blog_migrate/7a428befa59df9df462e06d21d13f375.png)
使用命令
./zkcli.sh -zkhost 192.168.119.131:2181,192.168.119.131:2182,192.168.119.131:2183 -cmd upconfig -confdir /usr/local/solrcloud/tomcat1/solrhome/collection1/conf -confname myconf
进行上传。
查看是否上传成功./zkCli.sh
,ls/
,如图所示,即为上传成功。
![](https://i-blog.csdnimg.cn/blog_migrate/2b243748b7c449170aa6d04123b9a497.png)
2.修改solrcloud
进入目录:
/usr/local/solrcloud/tomcat1/solrhome
![](https://i-blog.csdnimg.cn/blog_migrate/d9cbad476e1fb285738a2a5e6c62e1f4.png)
修改四个实例中solr.xml中的host
![](https://i-blog.csdnimg.cn/blog_migrate/e3af42ec18351a3657ad00d69dcfe88c.png)
指定当前实例运行的ip地址以及端口号
3.将solr与zookeeper进行关联
修改每一台solr的tomcat 的 bin目录下catalina.sh文件中加入DzkHost指定zookeeper服务器地址:
JAVA_OPTS="-DzkHost=192.168.119.131:2181,192.168.119.131:2182,192.168.119.131:2183"
![](https://i-blog.csdnimg.cn/blog_migrate/bcab0213cf5745e5ac1d2b1338dcc3ce.png)
在下图处指定服务器地址:
![](https://i-blog.csdnimg.cn/blog_migrate/1eabc5f8ba7151123906000fac217c83.png)
修改结束重新启动tomcat。
![](https://i-blog.csdnimg.cn/blog_migrate/4b77e94a32049a36a9eb47f4b6541090.png)
五、solr集群配置
上面的collection只有一片,接下来我们创建两片的collection,且每一片由一主一备构成。在浏览器中输入一下命令:
http://192.168.119.131:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
执行结果如下,表示执行成功。
![](https://i-blog.csdnimg.cn/blog_migrate/c6cfd6489b1e52146899a63ce35258d7.png)
再次进入集群,可以看到solr集群中存在两个collection:
![](https://i-blog.csdnimg.cn/blog_migrate/d2ba93ffad613d8ec9ad96ed7735dc81.png)
接下来我们删除原本存在的collection1:
![](https://i-blog.csdnimg.cn/blog_migrate/0acd16d5bb9ba0fd2edbceca6a93b3ac.png)