Solr的安装、SolrCloud初识、Solr集群搭建

Solr的安装

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

对于淘淘商城来讲,由于网上商城的搜索频率特别高,我们很有必要把搜索单独做成一个服务,这样做的好处是可以针对该服务做扩展,做成服务集群等。其它模块都可以调用solr服务。

下面我们来搭建一下单机版的Solr服务器。

第一步:新建一台虚拟机
大家可以参考http://blog.csdn.net/u012453843/article/details/68947589这篇博客进行学习

第二步:配置静态IP以及要能上网
大家可以参考http://blog.csdn.net/u012453843/article/details/52839105这篇博客进行学习

第三步:使用XShell工具来操作我们的虚拟机
大家可以参考http://blog.csdn.net/u012453843/article/details/54293774和http://blog.csdn.net/u012453843/article/details/68951776这两篇博客学习如何使用XShell来进行上传下载操作。

第四步:安装vim命令
使用命令yum install vim-enhanced进行安装

第五步:安装JDK
由于Solr是由Java开发的,因此安装Solr需要安装JDK,大家可以参考http://blog.csdn.net/u012453843/article/details/52422736这篇博客进行安装(该篇博客使用的操作工具是SecureCRT,与XShell工具有异曲同工之用)。

第六步:安装Solr
首先到http://download.csdn.net/detail/u012453843/9822733这个地址下载solr-4.10.3.tgz.tgz。

下面,我们在虚拟机的/usr/local/目录下新建software目录,如下所示。

[root@solr-server ~]# mkdir /usr/local/software

我们把solr-4.10.3.tgz.tgz上传到/usr/local/software目录下,如下所示。
[root@solr-server software]# ll
总用量 325416
-rw-r–r--. 1 root root 183212596 4月 2 10:51 jdk-8u112-linux-x64.gz
-rw-r–r--. 1 root root 150010621 3月 15 01:20 solr-4.10.3.tgz.tgz
[root@solr-server software]#

下面解压solr安装包
[root@solr-server software]# tar -zxvf solr-4.10.3.tgz.tgz -C /usr/local/

解压后到/usr/local目录下,可以看到解压后的solr-4.10.3目录。

[root@solr-server software]# cd /usr/local/
[root@solr-server local]# ll
总用量 48
drwxr-xr-x. 2 root root 4096 9月 23 2011 bin
drwxr-xr-x. 2 root root 4096 9月 23 2011 etc
drwxr-xr-x. 2 root root 4096 9月 23 2011 games
drwxr-xr-x. 2 root root 4096 9月 23 2011 include
drwxr-xr-x. 2 root root 4096 9月 23 2011 lib
drwxr-xr-x. 2 root root 4096 9月 23 2011 lib64
drwxr-xr-x. 2 root root 4096 9月 23 2011 libexec
drwxr-xr-x. 2 root root 4096 9月 23 2011 sbin
drwxr-xr-x. 5 root root 4096 4月 23 16:36 share
drwxr-xr-x. 2 root root 4096 4月 23 18:48 software
drwxr-xr-x. 8 root root 4096 4月 23 18:59 solr-4.10.3
drwxr-xr-x. 2 root root 4096 9月 23 2011 src
[root@solr-server local]#

我们进入到solr-4.10.3目录下,可以看到solr的所有文件目录,如下所示。其中bin目录使用jetty容器可以启动solr服务,但是我们一般不用这个。contrib目录下存放的是扩展包,我们一般也不用。
[root@solr-server local]# cd solr-4.10.3/
[root@solr-server solr-4.10.3]# ll
总用量 996
drwxr-xr-x. 2 root root 4096 4月 23 18:59 bin
-rw-r–r--. 1 root root 406208 12月 10 2014 CHANGES.txt
drwxr-xr-x. 13 root root 4096 12月 10 2014 contrib
drwxr-xr-x. 4 root root 4096 4月 23 18:59 dist
drwxr-xr-x. 17 root root 4096 4月 23 19:00 docs
drwxr-xr-x. 15 root root 4096 4月 23 18:59 example
drwxr-xr-x. 2 root root 28672 4月 23 18:59 licenses
-rw-r–r--. 1 root root 12646 12月 1 2014 LICENSE.txt
-rw-r–r--. 1 root root 501873 12月 8 2014 LUCENE_CHANGES.txt
-rw-r–r--. 1 root root 24655 12月 1 2014 NOTICE.txt
-rw-r–r--. 1 root root 5344 12月 1 2014 README.txt
-rw-r–r--. 1 root root 850 12月 1 2014 SYSTEM_REQUIREMENTS.txt

在这里插入图片描述
在这里插入图片描述
[root@solr-server solr-4.10.3]#

我们看看dist目录下的内容,如下所示,可以看到solr-4.10.3.war,这个war包结合tomcat进行使用。solr-solrj-4.10.3.jar是我们的solr客户端。
-rw-r–r--. 1 root root 29741796 12月 10 2014 solr-4.10.3.war
-rw-r–r--. 1 root root 17631 12月 10 2014 solr-analysis-extras-4.10.3.jar
-rw-r–r--. 1 root root 30179 12月 10 2014 solr-cell-4.10.3.jar
-rw-r–r--. 1 root root 51646 12月 10 2014 solr-clustering-4.10.3.jar
-rw-r–r--. 1 root root 2852283 12月 10 2014 solr-core-4.10.3.jar
-rw-r–r--. 1 root root 219326 12月 10 2014 solr-dataimporthandler-4.10.3.jar
-rw-r–r--. 1 root root 37442 12月 10 2014 solr-dataimporthandler-extras-4.10.3.jar
drwxr-xr-x. 2 root root 4096 4月 23 18:59 solrj-lib
-rw-r–r--. 1 root root 767091 12月 10 2014 solr-langid-4.10.3.jar
-rw-r–r--. 1 root root 129327 12月 10 2014 solr-map-reduce-4.10.3.jar
-rw-r–r--. 1 root root 24630 12月 10 2014 solr-morphlines-cell-4.10.3.jar
-rw-r–r--. 1 root root 42228 12月 10 2014 solr-morphlines-core-4.10.3.jar
-rw-r–r--. 1 root root 451184 12月 10 2014 solr-solrj-4.10.3.jar
-rw-r–r--. 1 root root 199743 12月 10 2014 solr-test-framework-4.10.3.jar
-rw-r–r--. 1 root root 39744 12月 10 2014 solr-uima-4.10.3.jar
-rw-r–r--. 1 root root 20302 12月 10 2014 solr-velocity-4.10.3.jar
drwxr-xr-x. 4 root root 4096 4月 23 18:59 test-framework
在这里插入图片描述
[root@solr-server dist]#

我们再看下example目录,这个目录下有一个很重要的目录,那就是solr目录,这个目录下存放都是Solr很重要的文件。
[root@solr-server solr-4.10.3]# cd example/
[root@solr-server example]# ll
总用量 104
drwxr-xr-x. 2 root root 4096 4月 23 18:59 contexts
drwxr-xr-x. 2 root root 4096 4月 23 18:59 etc
drwxr-xr-x. 4 root root 4096 4月 23 18:59 example-DIH
drwxr-xr-x. 2 root root 4096 4月 23 18:59 exampledocs
drwxr-xr-x. 3 root root 4096 12月 10 2014 example-schemaless
drwxr-xr-x. 3 root root 4096 4月 23 18:59 lib
drwxr-xr-x. 2 root root 4096 12月 1 2014 logs
drwxr-xr-x. 5 root root 4096 4月 23 18:59 multicore
-rw-r–r--. 1 root root 2992 12月 1 2014 README.txt
drwxr-xr-x. 2 root root 4096 4月 23 18:59 resources
drwxr-xr-x. 4 root root 4096 12月 10 2014 scripts
drwxr-xr-x. 4 root root 4096 4月 23 18:59 solr
drwxr-xr-x. 2 root root 4096 12月 10 2014 solr-webapp
-rw-r–r--. 1 root root 46294 3月 12 2013 start.jar
drwxr-xr-x. 2 root root 4096 4月 23 18:59 webapps
[root@solr-server example]#
在这里插入图片描述
第七步:安装tomcat
大家可以到http://download.csdn.net/detail/u012453843/9794438这个地址下载apache-tomcat-7.0.47.tar.gz。

下载完后,上传到虚拟机的/usr/local/software目录下,如下所示。
[root@solr-server software]# ll
总用量 333460
-rw-r–r--. 1 root root 8234674 3月 15 01:22 apache-tomcat-7.0.47.tar.gz
-rw-r–r--. 1 root root 183212596 4月 2 10:51 jdk-8u112-linux-x64.gz
-rw-r–r--. 1 root root 150010621 3月 15 01:20 solr-4.10.3.tgz.tgz
[root@solr-server software]#

先解压apache到当前目录,解压的命令:tar -zxvf apache-tomcat-7.0.47.tar.gz,如下所示。
[root@solr-server software]# ll
总用量 333464
drwxr-xr-x. 9 root root 4096 4月 23 19:50 apache-tomcat-7.0.47
-rw-r–r--. 1 root root 8234674 3月 15 01:22 apache-tomcat-7.0.47.tar.gz
-rw-r–r--. 1 root root 183212596 4月 2 10:51 jdk-8u112-linux-x64.gz
-rw-r–r--. 1 root root 150010621 3月 15 01:20 solr-4.10.3.tgz.tgz
[root@solr-server software]#

我们在/usr/local目录下新建一个solr目录
[root@solr-server software]# mkdir /usr/local/solr

然后我们将解压好的的apache-tomcat-7.0.47复制一份到/usr/local/solr/目录下并重命名为tomccat,如下所示。
[root@solr-server software]# cp -r apache-tomcat-7.0.47 /usr/local/solr/tomcat
[root@solr-server software]# cd /usr/local/solr
[root@solr-server solr]# ll
总用量 4
drwxr-xr-x. 9 root root 4096 4月 23 19:55 tomcat
[root@solr-server solr]#

第八步:solr与tomcat结合
我们将solr的war包放到tomcat的webapps目录下并命名为solr.war,如下所示。

[root@solr-server local]# cp /usr/local/solr-4.10.3/dist/solr-4.10.3.war /usr/local/solr/tomcat/webapps/solr.war
[root@solr-server local]# cd /usr/local/solr/tomcat/webapps/
[root@solr-server webapps]# ll
总用量 29068
drwxr-xr-x. 13 root root 4096 4月 23 19:55 docs
drwxr-xr-x. 7 root root 4096 4月 23 19:55 examples
drwxr-xr-x. 5 root root 4096 4月 23 19:55 host-manager
drwxr-xr-x. 5 root root 4096 4月 23 19:55 manager
drwxr-xr-x. 3 root root 4096 4月 23 19:55 ROOT
-rw-r–r--. 1 root root 29741796 4月 23 19:59 solr.war
[root@solr-server webapps]#

下面对solr.war进行解压,解压的方式是启动tomcat,如下所示。可以是使用tailf logs/catalina.out命令查看启动日志。
[root@solr-server tomcat]# bin/startup.sh
Using CATALINA_BASE: /usr/local/solr/tomcat
Using CATALINA_HOME: /usr/local/solr/tomcat
Using CATALINA_TMPDIR: /usr/local/solr/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_112
Using CLASSPATH: /usr/local/solr/tomcat/bin/bootstrap.jar:/usr/local/solr/tomcat/bin/tomcat-juli.jar

启动tomcat之后,我们到webapps目录下查看,可以看到多了一个solr的目录,说明solr.war已经解压好了。
[root@solr-server tomcat]# cd /usr/local/solr/tomcat/webapps/
[root@solr-server webapps]# ll
总用量 29072
drwxr-xr-x. 13 root root 4096 4月 23 19:55 docs
drwxr-xr-x. 7 root root 4096 4月 23 19:55 examples
drwxr-xr-x. 5 root root 4096 4月 23 19:55 host-manager
drwxr-xr-x. 5 root root 4096 4月 23 19:55 manager
drwxr-xr-x. 3 root root 4096 4月 23 19:55 ROOT
drwxr-xr-x. 8 root root 4096 4月 23 20:01 solr
-rw-r–r--. 1 root root 29741796 4月 23 19:59 solr.war
[root@solr-server webapps]#

下面我们删掉solr.war,但是前提是先关闭掉tomcat,然后再删除(如果不关闭tomcat就删除solr.war的话,solr文件夹也会被删除),如下所示。
[root@solr-server tomcat]# bin/shutdown.sh
Using CATALINA_BASE: /usr/local/solr/tomcat
Using CATALINA_HOME: /usr/local/solr/tomcat
Using CATALINA_TMPDIR: /usr/local/solr/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_112
Using CLASSPATH: /usr/local/solr/tomcat/bin/bootstrap.jar:/usr/local/solr/tomcat/bin/tomcat-juli.jar
[root@solr-server tomcat]# cd webapps/
[root@solr-server webapps]# ls
docs examples host-manager manager ROOT solr solr.war
[root@solr-server webapps]# rm -rf solr.war
[root@solr-server webapps]# ls
docs examples host-manager manager ROOT solr
[root@solr-server webapps]#

下面我们将example/lib/ext目录下的所有jar包拷贝到/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/目录下。如下所示
cp /usr/local/solr-4.10.3/example/lib/ext/* /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

将example目录下的solr文件夹复制到/usr/local/solr/目录下并且重命名为solrhome,如下所示。
[root@solr-server solr-4.10.3]# cp -r example/solr /usr/local/solr/solrhome

下面我们需要修改/usr/local/solr/tomcat/webapps/solr/WEB-INF/目录下的web.xml文件
[root@solr-server solrhome]# cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/
[root@solr-server WEB-INF]# ll
总用量 16
drwxr-xr-x. 2 root root 4096 4月 23 20:09 lib
-rw-r–r--. 1 root root 1210 12月 1 2014 weblogic.xml
-rw-r–r--. 1 root root 7052 12月 1 2014 web.xml
[root@solr-server WEB-INF]#

我们把web.xml文件当中的下面这段配置的注释去掉,并修改的值为我们solrhome的目录,如下所示。

<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>/usr/local/solr/solrhome</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第九步:检测
经过上面的配置,单机版的solr我们便配置完了,下面我们启动tomcat并使用tailf logs/catalina.out查看启动日志,如下所示。

[root@solr-server tomcat]# bin/startup.sh
Using CATALINA_BASE: /usr/local/solr/tomcat
Using CATALINA_HOME: /usr/local/solr/tomcat
Using CATALINA_TMPDIR: /usr/local/solr/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_112
Using CLASSPATH: /usr/local/solr/tomcat/bin/bootstrap.jar:/usr/local/solr/tomcat/bin/tomcat-juli.jar
[root@solr-server tomcat]# tailf logs/catalina.out
四月 23, 2017 8:28:51 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.47
四月 23, 2017 8:28:51 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory /usr/local/solr/tomcat/webapps/examples
四月 23, 2017 8:28:52 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory /usr/local/solr/tomcat/webapps/docs
四月 23, 2017 8:28:52 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory /usr/local/solr/tomcat/webapps/ROOT
四月 23, 2017 8:28:52 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory /usr/local/solr/tomcat/webapps/solr
log4j:WARN No appenders could be found for logger (org.apache.solr.client.solrj.impl.HttpClientUtil).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
四月 23, 2017 8:29:01 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory /usr/local/solr/tomcat/webapps/manager
四月 23, 2017 8:29:01 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory /usr/local/solr/tomcat/webapps/host-manager
四月 23, 2017 8:29:01 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler [“http-bio-8080”]
四月 23, 2017 8:29:01 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler [“ajp-bio-8009”]
四月 23, 2017 8:29:01 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 10340 ms

下面我们到地址栏输入http://192.168.156.22:8080/solr/即可访问到solr的管理页面了,如下图所示。

SolrCloud初识

一、概述
Lucene是一个Java语言编写的利用倒排原理实现的文本检索类库;

Solr是以Lucene为基础实现的文本检索应用服务。Solr部署方式有单机方式、多机Master-Slaver方式、Cloud方式。

SolrCloud是基于Solr和Zookeeper的分布式搜索方案。当索引越来越大,一个单一的系统无法满足磁盘需求,查询速度缓慢,此时就需要分布式索引。在分布式索引中,原来的大索引,将会分成多个小索引,solr可以将这些小索引返回的结果合并,然后返回给客户端。

二、SolrCloud的基本概念
Cluster集群:一组Solr节点,逻辑上作为一个单元进行管理,整个集群使用同一套Schema和SolrConfig
Node节点:一个运行Solr的JVM实例
Collection:在SolrCloud集群中逻辑意义上的完整的索引,常常被划分为一个或多个Shard。这些Shard使用相同的config set,如果Shard数超过一个,那么索引方案就是分布式索引。
Core:也就是Solr Core,一个Solr中包含一个或者多个SolrCore,每个Solr Core可以独立提供索引和查询功能,Solr Core额提出是为了增加管理灵活性和共用资源。SolrCloud中使用的配置是在Zookeeper中的,而传统的Solr Core的配置文件是在磁盘上的配置目录中。
Config Set:Solr Core提供服务必须的一组配置文件,每个Config Set有一个名字。必须包含solrconfig.xml和schema.xml,初次之外,依据这两个文件的配置内容,可能还需要包含其他文件。Config Set存储在Zookeeper中,可以重新上传或者使用upconfig命令进行更新,可以用Solr的启动参数bootstrap_confdir进行初始化或者更新。
Shard分片:Collection的逻辑分片。每个Shard被分成一个或者多个replicas,通过选举确定那个是Leader。
Replica:Shard的一个拷贝。每个Replica存在于Solr的一个Core中。
Leader:赢得选举的Shard replicas,每个Shard有多个replicas,这几个Replicas需要选举确定一个Leader。选举可以发生在任何时间。当进行索引操作时,SolrCloud将索引操作请求传到此Shard对应的leader,leader再分发它们到全部Shard的replicas。
三、SolrCloud中完整索引(Collection)的逻辑图
在SolrCloud模式下,Collection是访问Cluster的入口。Collection是一个逻辑存在的东西,可以跨Node,在任意节点上都可以访问Collection;Shard也是逻辑存在的,因此Shard也是可以跨Node的;一个Shard下面可以包含0个或者多个replica,但1个Shard下面只能包含一个leader。
在这里插入图片描述

四、SolrCloud的工作模式
SolrCloud中包含有多个Solr Instance,而每个Solr Instance中包含有多个Solr Core,Solr Core对应着一个可访问的Solr索引资源Replica,当Solr Client通过Collection访问Solr集群的时候,便可以通过Shard分片找到对应的replica即SolrCore,从而就可以访问索引文档了。
在这里插入图片描述在SolrCloud模式下,同一个集群里所有Core的配置是统一的,Core有leader和replication两种角色,每个Core一定属于一个Shard,Core在Shard中扮演leader还是replication由Solr内部Zookeeper自动协调。

访问SolrCloud的过程:Solr Client向Zookeeper咨询Collection的地址,Zookeeper返回存活的节点地址供访问,插入数据的时候由SolrCloud内部协调数据分发(内部使用一致性哈希)。
在这里插入图片描述

五、SolrCloud创建索引和更新索引
<一>、不得不知道的索引存储细节
当Solr客户端发送add/update请求给CloudSolrServer,CloudSolrServer会连接至Zookeeper获取当前SolrCloud的集群状态,并会在/clusterstate.json 和/live_nodes中注册watcher,便于监视Zookeeper和SolrCloud,这样做的好处有以下两点:

1、CloudSolrServer获取到SolrCloud的状态后,它可直接将document发往SolrCloud的leader,从而降低网络转发消耗。

2、注册watcher有利于建索引时候的负载均衡,比如如果有个节点leader下线了,那么CloudSolrServer会立马得知,那它就会停止往已下线的leader发送document。

此外,CloudSolrServer 在发送document时候需要知道发往哪个shard?对于建好的SolrCloud集群,每一个shard都会有一个Hash区间,当Document进行update的时候,SolrCloud就会计算这个Document的Hash值,然后根据该值和shard的hash区间来判断这个document应该发往哪个shard,Solr使用documentroute组件来进行document的分发。目前Solr有两个DocRouter类的子类CompositeIdRouter(Solr默认采用的)类和ImplicitDocRouter类,当然我们也可以通过继承DocRouter来定制化我们的document route组件。

举例来说当Solr Shard建立时候,Solr会给每一个shard分配32bit的hash值的区间,比如SolrCloud有两个shard分别为A,B,那么A的hash值区间就为80000000-ffffffff,B的hash值区间为0-7fffffff。默认的CompositeIdRouter hash策略会根据document ID计算出唯一的Hash值,并判断该值在哪个shard的hash区间内。

SolrCloud对于Hash值的获取提出了以下两个要求:
1、hash计算速度必须快,因为hash计算是分布式建索引的第一步。
2、 hash值必须能均匀的分布于每一个shard,如果有一个shard的document数量大于另一个shard,那么在查询的时候前一个shard所花的时间就会大于后一个,SolrCloud的查询是先分后汇总的过程,也就是说最后每一个shard查询完毕才算完毕,所以SolrCloud的查询速度是由最慢的shard的查询速度决定的。
基于以上两点,SolrCloud采用了MurmurHash 算法以提高hash计算速度和hash值的均匀分布。

<二>、Solr创建索引可以分为5个步骤(如下图所示):
1、用户可以把新建文档提交给任意一个Replica(Solr Core)。
2、如果它不是leader,它会把请求转给和自己同Shard的Leader。
3、Leader把文档路由给本Shard的每个Replica。

III、如果文档基于路由规则(如取hash值)并不属于当前的Shard,leader会把它转交给对应Shard的Leader。

VI、对应Leader会把文档路由给本Shard的每个Replica。

需要注意的是,添加索引时,单个document的路由非常简单,但是SolrCloud支持批量添加索引,也就是说正常情况下可对N个document同时进行路由。这时SolrCloud会根据document路由的去向分开存放document,即对document进行分类,然后进行并发发送至相应的shard,这就需要较高的并发能力。
在这里插入图片描述
<三>、更新索引的关键点:
1、 Leader接受到update请求后,先将update信息存放到本地的update log,同时Leader还会给document分配新的version,对于已存在的document,如果新的版本高就会抛弃旧版本,最后发送至replica。
2、一旦document经过验证以及加入version后,就会并行的被转发至所有上线的replica。SolrCloud并不会关注那些已经下线的replica,因为当他们上线时候会有recovery进程对他们进行恢复。如果转发的replica处于recovering状态,那么这个replica就会把update放入updatetransaction 日志。
3、当leader接受到所有的replica的反馈成功后,它才会反馈客户端成功。只要shard中有一个replica是active的,Solr就会继续接受update请求。这一策略其实是牺牲了一致性换取了写入的有效性。这其中有一个重要参数:leaderVoteWait参数,它表示当只有一个replica时候,这个replica会进入recovering状态并持续一段时间等待leader的重新上线。如果在这段时间内leader没有上线,那么他就会转成leader,其中可能会有一些document丢失。当然可以使用majority quorum来避免这个情况,这跟Zookeeper的leader选举策略一样,比如当多数的replica下线了,那么客户端的write就会失败。
4、索引的commit有两种,一种是softcommit,即在内存中生成segment,document是可见的(可查询到)但是没写入磁盘,断电后数据会丢失。另一种是hardcommit,直接将数据写入磁盘且数据可见。

<四>、对Solr更新索引和创建索引的几点总结:
1、leader转发的规则
1)请求来自leader转发:那么就只需要写到本地ulog,不需要转发给leader,也不需要转发给其它replicas。如果replica处于非active状态,就会将update请求接受并写入ulog,但不会写入索引。如果发现重复的更新就会丢弃旧版本的更新。
2)请求不是来自leader,但自己就是leader,那么就需要将请求写到本地,顺便分发给其他的replicas。
3)请求不是来自leader,但自己又不是leader,也就是该更新请求是最原始的更新请求,那么需要将请求写到本地ulog,顺便转发给leader,再由leader分发。每commit一次,就会重新生成一个ulog更新日志,当服务器挂掉,内存数据丢失的时候,数据就可以从ulog中恢复。
2、建索引的时候最好使用CloudSolrServer,因为CloudSolrServer直接向leader发送update请求,从而避免网络开销。
3、批量添加索引的时候,建议在客户端提前做好document的路由,在SolrCloud内进行文档路由,开销较大。

七、SolrCloud索引的检索
在这里插入图片描述
在创建好索引的基础上,SolrCloud检索索引相对就比较简单了:
1、用户的一个查询,可以发送到含有该Collection的任意Solr的Server,Solr内部处理的逻辑会转到一个Replica。
2、此Replica会基于查询索引的方式,启动分布式查询,基于索引的Shard的个数,把查询转为多个子查询,并把每个子查询定位到对应Shard的任意一个Replica。
3、每个子查询返回查询结果。
4、最初的Replica合并子查询,并把最终结果返回给用户。

SolrCloud中提供NRT近实时搜索:
SolrCloud支持近实时搜索,所谓的近实时搜索即在较短的时间内使得新添加的document可见可查,这主要基于softcommit机制(注意:Lucene是没有softcommit的,只有hardcommit)。上面提到Solr建索引时的数据是在提交时写入磁盘的,这是硬提交,硬提交确保了即便是停电也不会丢失数据;为了提供更实时的检索能力,Solr提供了一种软提交方式。软提交(soft commit)指的是仅把数据提交到内存,index可见,此时没有写入到磁盘索引文件中。在设计中一个通常的做法是:每1-10分钟自动触发硬提交,每秒钟自动触发软提交,当进行softcommit时候,Solr会打开新的Searcher从而使得新的document可见,同时Solr还会进行预热缓存及查询以使得缓存的数据也是可见的,这就必须保证预热缓存以及预热查询的执行时间必须短于commit的频率,否则就会由于打开太多的searcher而造成commit失败。

最后说说在项目中近实时搜索的感受吧,近实时搜索是相对的,对于有客户需求,1分钟就是近实时了,而有些需求3分钟就是近实时了。对于Solr来说,softcommit越频繁实时性更高,而softcommit越频繁则Solr的负荷越大(commit越频繁越会生成小且多的segment,于是Solr merge出现的更频繁)。目前我们项目中的softcommit频率是3分钟,之前设置过1分钟而使得Solr在Index所占资源过多,从而大大影响了查询。所以近实时蛮困扰着我们的,因为客户会不停的要求你更加实时,目前项目中我们采用加入缓存机制来弥补这个实时性。

八、SolrShard Splitting的具体过程
一般情况下,增加Shard和Replica的数量能提升SolrCloud的查询性能和容灾能力,但是我们仍然得根据实际的document的数量,document的大小,以及建索引的并发,查询复杂度,以及索引的增长率来统筹考虑Shard和Replica的数量。Solr依赖Zookeeper实现集群的管理,在Zookeeper中有一个Znode 是/clusterstate.json ,它存储了当前时刻下整个集群的状态。同时在一个集群中有且只会存在一个overseer,如果当前的overseer fail了那么SolrCloud就会选出新的一个overseer,就跟shard leader选取类似。

在这里插入图片描述

Shard分割的具体过程(old shard split为newShard1和newShard2)可以描述为:
a、在一个Shard的文档到达阈值,或者接收到用户的API命令,Solr将启动Shard的分裂过程。
b、此时,原有的Shard仍然会提供服务,Solr将会提取原有Shard并按路由规则,转到新的Shard做索引。同时,新加入的文档:

1.2.用户可以把文档提交给任意一个Replica,并转交给Leader。

3.Leader把文档路由给原有Shard的每个Replica,各自做索引。

III.V. 同时,会把文档路由给新的Shard的Leader

IV.VI.新Shard的Leader会路由文档到自己的Replica,各自做索引,在原有文档重新索引完成,系统会把分发文档路由切到对应的新的Leader上,原有Shard关闭。Shard只是一个逻辑概念,所以Shard的Splitting只是将原有Shard的Replica均匀的分不到更多的Shard的更多的Solr节点上去。

六、Zookeeper:

<一>、SolrCloud中使用ZooKeeper主要实现以下三点功能:
在这里插入图片描述
1、集中配置存储以及管理。
2、集群状态改变时进行监控以及通知。
3、shard leader的选举。

<二>、 Znode与短链接
Zookeeper的组织结构类似于文件系统,每一层是一个Znode,每一个Znode存储了一些元数据例如创建时间,修改时间以及一些小量的数据。需要主要的是,Zookeeper并不支持存放大数据,它只支持小于1M大小的数据,因为性能原因,Zookeeper将数据存放在内存中。

Zookeeper另一个重要的概念是短链接,当Zookeeper客户端与Zookeeper建立一个短连接后会在Zookeeper新建一个Znode,客户端会一直与Zookeeper进行通信并保证这个Znode一直存在。如果当客户端与Zookeeper的短连接断开,这个Znode就会消失。在SolrCloud中,/live_nodes下存储了了所有客户端的短连接,表示有哪些Solr组成SolrCloud,具体来说就是当Solr跟Zookeeper保持短连接时,这些Solr主机就组成了SolrCloud,如果其中一个Solr的短连接断掉了,那么Live_nodes下就少了一个Znode,SolrCloud也就少了一个主机,于是Zookeeper就会告诉其他剩余的Solr有一个Solr挂掉了,那么在今后进行查询以及leader数据分发的时候就不用再经过刚才那个Solr了。Zookeeper是通过watch知道有Solr挂了的,而Zookeeper维护的集群状态数据是存放在solr/zoo_data目录下的。

<三>、SolrCloud配置Zookeeper集群的基本过程
事例1、单节点的Zookeeper,包含2个简单的Shard集群:把一个collection的索引数据分布到两个shard上去,并假定两个shard分别存储在两台Solr服务器上。
在这里插入图片描述
集群构建的基本流程:

先从第一台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、单节点的Zookeeper,包含2个shard的集群,每个shard中有replica节点。
在这里插入图片描述
如图所示,集群包含2个shard,每个shard中有两个solr节点,一个是leader,一个是replica节点, 但Zookeeper只有一个。

因为Replica节点,使得这个集群现在具备容错性了,背后的实质是集群的overseer会监测各个shard的leader节点,如果leader节点挂了,则会启动自动的容错机制,会从同一个shard中的其他replica节点集中重新选举出一个leader节点,甚至如果overseer节点自己也挂了,同样会自动在其他节点上启用新的overseer节点,这样就确保了集群的高可用性。

示例3、包含2个shard的集群,带shard备份和zookeeper集群机制
在这里插入图片描述
示例2中存在的问题是:尽管solr服务器具有容错机制,但集群中只有一个Zookeeper服务器来维护集群的状态信息,单点的存在即是不稳定的根源。如果这个Zookeeper服务器挂了,那么分布式查询还是可以工作的,因为每个solr服务器都会在内存中维护最近一次由Zookeeper维护的集群状态信息,但新的节点无法加入集群,集群的状态变化也不可知了。

因此,为了解决这个问题,需要对Zookeeper服务器也设置一个集群,让其也具备高可用性和容错性。有两种方式可选,一种是提供一个外部独立的Zookeeper集群,另一种是每个solr服务器都启动一个内嵌的Zookeeper服务器,再将这些Zookeeper服务器组成一个集群。

总结: 通过以上的介绍,可看出SolrCloud相比Solr而言,有了很多的新特性,保证了整个Solr应用的High Availability。
1、集中式的配置信息
使用ZK进行集中配置。启动时可以指定把Solr的相关配置文件上传Zookeeper,多机器共用。这些ZK中的配置不会再拿到本地缓存,Solr直接读取ZK中的配置信息。另外配置文件的变动,所有机器都可以感知到, Solr的一些任务也是通过ZK作为媒介发布的,目的是为了容错,这使得Solr接收到任务,但在执行任务时崩溃的机器,在重启后,或者集群选出候选者时,可以再次执行这个未完成的任务。
2、SolrCloud对索引分片,并对每个分片创建多个Replication。每个Replication都可以对外提供服务。一个Replication挂掉不会影响索引服务,更强大的是,SolrCloud还能自动的在其它机器上帮你把失败机器上的索引Replication重建并投入使用。
3、近实时搜索:立即推送式的replication(也支持慢推送),可以在秒内检索到新加入索引。
4、查询时自动负载均衡:SolrCloud索引的多个Replication可以分布在多台机器上,均衡查询压力,如果查询压力大,可以通过扩展机器,增加Replication来减缓。
5、自动分发的索引和索引分片:发送文档到任何节点,SolrCloud都会转发到正确节点。
6、事务日志:事务日志确保更新无丢失,即使文档没有索引到磁盘。

除此之外,SolrCloud中还提供了其它一些特色功能:
1、可将索引存储在HDFS上
2、通过MR批量创建索引
3、强大的RESTful API
优秀的管理界面:主要信息一目了然,可以清晰的以图形化方式看到SolrCloud的部署分布,当然还有不可或缺的Debug功能。

Solr集群搭建

关于SolrCloud的基本知识,大家可以参考http://www.cnblogs.com/saratearing/p/5690476.html这篇博客进行学习。

下面我们来搭建SolrCloud集群,先来看下我们要搭建的集群图,如下图所示,可以看到Solr集群由三台注册中心(Zookeeper集群)和四台部署有Solr的设备组成。我们采用七台虚拟机来搭建Solr集群。
在这里插入图片描述

下面一步一步来进行搭建。
第一步:新建三台虚拟机(如果有现成的设备,不需要新建)注意:大家最好不要用克隆的方式,因为据我的试验,用克隆的方式搭建的Solr集群在重启后原来的库会消失,而且会出现各种各样的问题。
大家可以参考http://blog.csdn.net/u012453843/article/details/68947589这篇博客进行搭建。

第二步:安装单机版Zookeeper
大家可以参考http://blog.csdn.net/u012453843/article/details/65937993这篇博客进行安装

第三步:搭建Zookeeper集群
首先,为zookeeper1配置一下IP和主机名的映射关系,如下所示。

[root@zookeeper1 ~]# vim /etc/hosts
 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.156.23 zookeeper1
192.168.156.24 zookeeper2
192.168.156.25 zookeeper3

接着修改zookeeper1的配置文件,先进入到conf目录下,找到我们搭建单机版zookeeper时配置的zoo.cfg文件,在文件的最后添加上三行配置,如下所示。我们以server.1=zookeeper1:2888:3888为例,server.1代表服务的编号,zookeeper1代表服务的地址,2888代表通信端口,3888代表选举端口。

[root@zookeeper1 conf]# pwd
/usr/local/zookeeper-3.4.5/conf
[root@zookeeper1 conf]# ls
configuration.xsl  log4j.properties  zoo.cfg
[root@zookeeper1 conf]# vim zoo.cfg 
 
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/usr/local/zookeeper-3.4.5/data
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888

我们到配置文件中dataDir指定的/usr/local/zookeeper-3.4.5/data目录下,如果看到该目录下已经有文件的话,我们一定要删除掉,否则zookeeper启动不了,如下所示,我们看到有一个文件夹version-2和一个zookeeper_server.pid(该文件会导致zookeeper启动不了),我们把它们都删除掉,只剩个空目录就行。

[root@zookeeper1 conf]# cd /usr/local/zookeeper-3.4.5/data/
[root@zookeeper1 data]# ll
总用量 8
drwxr-xr-x. 2 root root 4096 4月  25 07:50 version-2
-rw-r--r--. 1 root root    4 4月  25 07:50 zookeeper_server.pid

在空目录下使用命令vim myid新建一个myid文件并在里面输入1(这个数字1就代表我们上面配置文件中server.1的这个数字1),输入完1后保存退出(这时data目录下只有myid这么一个文件)。

[root@zookeeper1 data]# vim myid
 
1

这样我们便配置完了一台zookeeper,由于另外两台设备的相关配置一样(除myid文件之外),因此我们把zookeeper1上的相关配置复制到其它两台设备上。我们先把/etc/目录下的hosts文件复制到其它两台zookeeper上,如下所示。

[root@zookeeper1 conf]# scp /etc/hosts root@192.168.156.24:/etc/
The authenticity of host '192.168.156.24 (192.168.156.24)' can't be established.
RSA key fingerprint is 1d:5a:02:3c:a9:30:0a:72:fa:1d:07:13:ea:a1:03:0d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.156.24' (RSA) to the list of known hosts.
root@192.168.156.24's password: 
hosts                                                       100%  236     0.2KB/s   00:00    
[root@zookeeper1 conf]# 

[root@zookeeper1 conf]# scp /etc/hosts root@192.168.156.25:/etc/
The authenticity of host '192.168.156.25 (192.168.156.25)' can't be established.
RSA key fingerprint is 1d:5a:02:3c:a9:30:0a:72:fa:1d:07:13:ea:a1:03:0d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.156.25' (RSA) to the list of known hosts.
root@192.168.156.25's password: 
hosts                                                       100%  236     0.2KB/s   00:00    
[root@zookeeper1 conf]#

拷贝完之后,我们到zookeeper2和zookeeper3这两台设备上查看下原文件是否已经被覆盖,我们以zookeeper2为例,可以看到已经成功被覆盖了(另一台我就不粘贴了)。

[root@zookeeper2 ~]# more /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.156.23 zookeeper1
192.168.156.24 zookeeper2
192.168.156.25 zookeeper3
[root@zookeeper2 ~]# 

下面我们把/usr/local/zookeeper-3.4.5/conf/目录下的zoo.cfg文件拷贝到zookeeper2和zookeeper3上。命令如下。

[root@zookeeper1 conf]# scp zoo.cfg root@192.168.156.24:/usr/local/zookeeper-3.4.5/conf/
[root@zookeeper1 conf]# scp zoo.cfg root@192.168.156.25:/usr/local/zookeeper-3.4.5/conf/

下面我们在zookeeper2和zookeeper3的/usr/local/zookeeper-3.4.5/data目录下都新建一个myid文件,并且分别输入2和3并保存退出,如下所示。

[root@zookeeper2 data]# vim myid
 
2
[root@zookeeper3 data]# vim myid
 
3

下面我们需要修改下Window系统的hosts文件,位置如下图所示。
在这里插入图片描述

以管理员的身份打开HOSTS文件,并在最下面添加如下配置

192.168.156.23 zookeeper1
192.168.156.24 zookeeper2
192.168.156.25 zookeeper3

为了防止防火墙给集群搭建带来不必要的麻烦,建议关掉防火墙,关闭防火墙的命令是service iptables stop,禁止防火墙重启的命令是chkconfig iptables off。
由于我们修改了/etc/hosts文件,我们重启下三台Zookeeper设备。重启命令是reboot

重启之后,我们来依次启动三台zookeeper设备,看集群是否搭建成功。

先看下zookeeper1的情况,发现该节点zookeeper的角色是follower,如下所示。(注:如果启动报Error contacting service. It is probably not running.这样的错误,请删除/usr/local/zookeeper-3.4.5/data目录下的version-2和 zookeeper_server.pid文件,然后重新启动)

[root@zookeeper1 zookeeper-3.4.5]# bin/zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@zookeeper1 zookeeper-3.4.5]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
[root@zookeeper1 zookeeper-3.4.5]#

接着看下zookeeper2的情况,发现该节点的zookeeper角色是leader(领导者)

[root@zookeeper2 zookeeper-3.4.5]# bin/zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@zookeeper2 zookeeper-3.4.5]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
[root@zookeeper2 zookeeper-3.4.5]# 

最后看下zookeeper3的情况,发现该节点zookeeper的角色是follower,这说明我们的zookeeper集群搭建成功了!

[root@zookeeper3 zookeeper-3.4.5]# bin/zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@zookeeper3 zookeeper-3.4.5]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
[root@zookeeper3 zookeeper-3.4.5]# 

第四步:新建四台虚拟机并安装单机版的Solr
大家可以参考http://blog.csdn.net/u012453843/article/details/70482344这篇博客进行学习,由于Solr集群会用到中文分析器IKAnalyzer,因此我们需要为每台Solr配置IKAnalyzer,大家可以参考http://blog.csdn.net/u012453843/article/details/70991327这篇博客进行配置。

第五步:为了避免tomcat的默认端口8080与我们其它的tomcat工程冲突,我们把Solr所在的四台设备的tomcat的端口都改为8180
我们到tomcat的conf目录下(/usr/local/solr/tomcat/conf)修改server.xml文件,把下面这段配置的port的值由原来的8080修改为8180。如下所示。

<Connector port="8180" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    注意:把其它三台Solr虚拟机的tomcat端口也都修改为8180

第六步:为4台Solr虚拟机都配置下solrhome目录下的solr.xml文件

[root@solr1 ~]# cd /usr/local/solr/solrhome/
[root@solr1 solrhome]# ll
总用量 20
drwxr-xr-x. 2 root root 4096 4月  23 20:13 bin
drwxr-xr-x. 4 root root 4096 4月  23 20:29 collection1
-rw-r--r--. 1 root root 2473 4月  23 20:13 README.txt
-rw-r--r--. 1 root root 1715 4月  23 20:13 solr.xml
-rw-r--r--. 1 root root  501 4月  23 20:13 zoo.cfg
[root@solr1 solrhome]#

下面我们修改solr.xml,我们修改的只有里面的前两项,host和hostPort,host的值修改为我们solr1的IP地址,hostPort修改为我们刚才为tomcat的修改的端口8180,其它不用动。

[root@solr1 solrhome]# vim solr.xml 
 
<?xml version="1.0" encoding="UTF-8" ?>
 
 
<solr>
 
  <solrcloud>
    <str name="host">192.168.156.26</str>
    <int name="hostPort">8180</int>
    <str name="hostContext">${hostContext:solr}</str>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  </solrcloud>
 
  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:0}</int>
    <int name="connTimeout">${connTimeout:0}</int>
  </shardHandlerFactory>
 
</solr>

上面是solr1(192.168.156.26)上的修改,下面我们还需要对solr2(192.168.156.27)、solr3(192.168.156.28)、solr4(192.168.156.29)这三台设备的solr.xml文件进行相关配置,下面是solr2的配置。

<solr>
 
  <solrcloud>
    <str name="host">192.168.156.27</str>
    <int name="hostPort">8180</int>
    <str name="hostContext">${hostContext:solr}</str>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  </solrcloud>
 
  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:0}</int>
    <int name="connTimeout">${connTimeout:0}</int>
  </shardHandlerFactory>
 
</solr>

下面是solr3的配置

<solr>
 
  <solrcloud>
    <str name="host">192.168.156.28</str>
    <int name="hostPort">8180</int>
    <str name="hostContext">${hostContext:solr}</str>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  </solrcloud>
 
  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:0}</int>
    <int name="connTimeout">${connTimeout:0}</int>
  </shardHandlerFactory>
 
</solr>

下面是solr4的配置

<solr>
 
  <solrcloud>
    <str name="host">192.168.156.29</str>
    <int name="hostPort">8180</int>
    <str name="hostContext">${hostContext:solr}</str>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  </solrcloud>
 
  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:0}</int>
    <int name="connTimeout">${connTimeout:0}</int>
  </shardHandlerFactory>
 
</solr>

第七步:让zookeeper统一管理配置文件
我们先找到zkcli.sh文件所在的位置,在我的solr1中zkcli.sh文件的目录如下。

[root@solr1 conf]# cd /usr/local/solr-4.10.3/example/scripts/cloud-scripts/
[root@solr1 cloud-scripts]# ll
总用量 12
-rw-r--r--. 1 root root 317 12月  1 2014 log4j.properties
-rw-r--r--. 1 root root 707 12月  1 2014 zkcli.bat
-rwxr-xr-x. 1 root root 485 12月  1 2014 zkcli.sh
[root@solr1 cloud-scripts]# 

下面我们使用该zkcli.sh脚本文件来执行上传操作,我们要上传的文件目录是/usr/local/solr/solrhome/collection1/conf,该目录下的文件如下所示。注:不同的人安装的习惯不一样,conf这个目录所在的位置也不一样,大家根据实际情况来操作就可以了。

[root@solr1 cloud-scripts]# cd /usr/local/solr/solrhome/collection1/conf
[root@solr1 conf]# ll
总用量 292
-rw-r--r--. 1 root root  1068 4月  23 20:13 admin-extra.html
-rw-r--r--. 1 root root   928 4月  23 20:13 admin-extra.menu-bottom.html
-rw-r--r--. 1 root root   926 4月  23 20:13 admin-extra.menu-top.html
drwxr-xr-x. 3 root root  4096 4月  23 20:13 clustering
-rw-r--r--. 1 root root  3974 4月  23 20:13 currency.xml
-rw-r--r--. 1 root root  1348 4月  23 20:13 elevate.xml
drwxr-xr-x. 2 root root  4096 4月  23 20:13 lang
-rw-r--r--. 1 root root 78514 4月  23 20:13 mapping-FoldToASCII.txt
-rw-r--r--. 1 root root  2868 4月  23 20:13 mapping-ISOLatin1Accent.txt
-rw-r--r--. 1 root root   873 4月  23 20:13 protwords.txt
-rw-r--r--. 1 root root    33 4月  23 20:13 _rest_managed.json
-rw-r--r--. 1 root root   450 4月  23 20:13 _schema_analysis_stopwords_english.json
-rw-r--r--. 1 root root   172 4月  23 20:13 _schema_analysis_synonyms_english.json
-rw-r--r--. 1 root root 60689 4月  23 20:13 schema.xml
-rw-r--r--. 1 root root   921 4月  23 20:13 scripts.conf
-rw-r--r--. 1 root root 74827 4月  23 20:13 solrconfig.xml
-rw-r--r--. 1 root root    13 4月  23 20:13 spellings.txt
-rw-r--r--. 1 root root   781 4月  23 20:13 stopwords.txt
-rw-r--r--. 1 root root  1119 4月  23 20:13 synonyms.txt
-rw-r--r--. 1 root root  1416 4月  23 20:13 update-script.js
drwxr-xr-x. 2 root root  4096 4月  23 20:13 velocity
drwxr-xr-x. 2 root root  4096 4月  23 20:13 xslt
[root@solr1 conf]# 

在执行上传操作之前,我们需要先安装unzip命令(因为最小化安装的虚拟机当中默认是没有unzip命令的),如果不安装unzip的话,会报找不到unzip命令的错误!我们给四台solr设备都安装上该命令吧。

yum install zip unzip

下面我们执行上传操作,命令如下(前提条件是在/usr/local/solr-4.10.3/example/scripts/cloud-scripts/目录下):

./zkcli.sh -zkhost 192.168.156.23:2181,192.168.156.24:2181,192.168.156.25:2181 -cmd upconfig -confdir /usr/local/solr/solrhome/collection1/conf -confname myconf

如果想让命令执行的更灵活一点,那就使用绝对路径来操作,如下所示。

/usr/local/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh -zkhost 192.168.156.23:2181,192.168.156.24:2181,192.168.156.25:2181 -cmd upconfig -confdir /usr/local/solr/solrhome/collection1/conf -confname myconf

上传成功后,我们到任何一台zookeeper上检验一下配置是否已经被上传上来了,我们到zookeeper1的bin目录下,如下所示。

[root@zookeeper1 zookeeper-3.4.5]# cd bin
[root@zookeeper1 bin]# ls
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh  zookeeper.out

使用命令./zkCli.sh来登录服务端,如下所示。

[root@zookeeper1 bin]# ./zkCli.sh
Connecting to localhost:2181
2017-04-26 07:04:46,025 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GM
这里省略一部分内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。
 
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] 

如果我们想连接其它端口(比如2183)的zookeeper,可以使用命令:./zkCli.sh -server 192.168.156.23:2183来进行登录。

使用命令"ls /"来查看下根目录下是否有configs目录,如下所示,发现已经有了。

[zk: localhost:2181(CONNECTED) 0] ls /
[configs, zookeeper]
[zk: localhost:2181(CONNECTED) 1] 

再看configs目录下是否有myconf目录,如下所示,发现是有的。

[zk: localhost:2181(CONNECTED) 1] ls /configs
[myconf]
[zk: localhost:2181(CONNECTED) 2] 

我们还可以看看myconf目录下的所有文件,这些都是我们刚才上传的配置文件,如下所示。

[zk: localhost:2181(CONNECTED) 2] ls /configs/myconf
[currency.xml, mapping-FoldToASCII.txt, protwords.txt, scripts.conf, synonyms.txt, stopwords.txt, velocity, _schema_analysis_synonyms_english.json, admin-extra.html, update-script.js, _schema_analysis_stopwords_english.json, solrconfig.xml, admin-extra.menu-top.html, elevate.xml, schema.xml, clustering, mapping-ISOLatin1Accent.txt, _rest_managed.json, xslt, spellings.txt, lang, admin-extra.menu-bottom.html]
[zk: localhost:2181(CONNECTED) 3] 

第八步: 修改Solr所在的四台虚拟机的tomcat/bin目录下的catalina.sh 文件,关联solr和zookeeper
首先,我们到tomcat的bin目录下,如下所示,可以看到catalina.sh文件。

[root@solr1 bin]# pwd
/usr/local/solr/tomcat/bin
[root@solr1 bin]# ls
bootstrap.jar  catalina.sh         commons-daemon.jar            configtest.bat  cpappend.bat  digest.bat  setclasspath.bat  shutdown.bat  startup.bat  tomcat-juli.jar       tool-wrapper.bat  version.bat
catalina.bat   catalina-tasks.xml  commons-daemon-native.tar.gz  configtest.sh   daemon.sh     digest.sh   setclasspath.sh   shutdown.sh   startup.sh   tomcat-native.tar.gz  tool-wrapper.sh   version.sh

修改catalina.sh文件,添加JAVA_OPTS="-DzkHost=192.168.156.23:2181,192.168.156.24:2181,192.168.156.25:2181",如下所示。

[root@solr1 bin]# vim catalina.sh
 
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
这里省略好多好多行内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
 
# OS specific support.  $var _must_ be set to either true or false.
JAVA_OPTS="-DzkHost=192.168.156.23:2181,192.168.156.24:2181,192.168.156.25:2181"
cygwin=false
darwin=false

修改完solr1之后,我们再修改其它三台solr设备,添加的内容完全一样,我就不啰嗦了。
第九步:启动每个tomcat实例。要确保zookeeper集群是启动状态。可以使用tailf logs/catalina.out命令查看启动日志。
下面是solr1的tomcat启动操作,同理,我们再启动其它三台solr上的tomcat。

[root@solr1 tomcat]# bin/startup.sh 
Using CATALINA_BASE:   /usr/local/solr/tomcat
Using CATALINA_HOME:   /usr/local/solr/tomcat
Using CATALINA_TMPDIR: /usr/local/solr/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_112
Using CLASSPATH:       /usr/local/solr/tomcat/bin/bootstrap.jar:/usr/local/solr/tomcat/bin/tomcat-juli.jar

第十步:我们访问任何一台Solr的首页,点击"Cloud",可以看到如下图所示。当前还没有进行分片处理。
在这里插入图片描述
下面我们来进行分片处理,使用的命令是:http://192.168.156.26:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2,执行结果如下图所示。
在这里插入图片描述

我们再看看solr首页的云图,发现多了一个collection2的库。如下图所示。
在这里插入图片描述

我们把没有分片的collection1删除掉,命令是:http://192.168.156.26:8180/solr/admin/collections?action=DELETE&name=collection1,如下图所示。
在这里插入图片描述
我们再来查看solr首页云图,发现现在只剩下有分片的collection2了,我们的SolrCloud集群搭建成功了!!!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值