Solr6与Zookeeper在Tomcat环境做SolrCloud集群
摘要: SolrCloud 是基于Solr和Zookeeper的分布式搜索方案,在搭建完一个Solr实例后,可以很容易地使用Zookeeper来做一个集群。我演示的安装步骤基于一台机器,所以采用伪集群的方式进行安装,如果是真正的生成环境,将伪集群的ip改下就可以了,步骤是一样的。准备工作JDK1.8以上Solr6的安装包(solr-6.0.0.zip 约140M)Tomcat8(至少tomca
摘要: SolrCloud 是基于Solr和Zookeeper的分布式搜索方案,在搭建完一个Solr实例后,可以很容易地使用Zookeeper来做一个集群。我演示的安装步骤基于一台机器,所以采用伪集群的方式进行安装,如果是真正的生成环境,将伪集群的ip改下就可以了,步骤是一样的。
准备工作
- JDK1.8以上
- Solr6的安装包(solr-6.0.0.zip 约140M)
- Tomcat8(至少tomcat-8.0以上,apache-tomcat-8.5.5-windows-x86.zip 约10M)
- Zookeeper(zookeeper-3.4.9.tar.gz 约22M)
Solr6部署在Tomcat8环境
你可以在这里找到如何将Solr6部署在Tomcat8环境下。想要在Jetty环境下部署Solr6的话,步骤基本相同。
Solr6集群部署
如果已经成功部署了一个Solr,那么接下来的工作也不会太难。下面的集群部署基于已经成功部署过单个Solr.
首先,需要将server复制三份,我刚开始用的是
apache-tomcat-8.5.5
,复制后分别加上一个标示,假设我取8081,8082,8083.同样,把solr_home也复制三份,加上标示。
配置各自的solr_home:分别将./apache-tomcat-8.5.5 - 808X/webapps/solr/WEB-INF的web.xml文件中
env-entry-value
改为对应的solr_home808X路径。这次需要改3个地方。
改端口号:由于我是在一台机器上启动4台Tomcat,所以需要不同的端口号。分别将./apache-tomcat-8.5.5 - 808X/conf的server.xml文件中
Connector
改为不重复的端口,假设我取8081,8082,8083。这次需要改3个地方。
要保证此次试验能够成功,还需要将server.xml
中的所有端口号都更改掉,8005改为8105,8443改为8143,8009改为8109。如果不改的话,第一个Tomcat启动以后,其他Tomcat启动时,会报错,这里的每一个端口在同一台机器上都不能重复。配置Zookeeper:将Zookeeper解压后,在在其根目录新建一个存放数据的文件夹
data
.这次需要改1个地方。
配置Zookeeper:将.\zookeeper-3.4.9\conf下的
zoo_sample.cfg
改名为zoo.cfg
,修改其中的dataDir为刚刚新建的data文件夹,注意这里的路径是正斜杠,和windows默认的不一样。这次需要改1个地方。
配置zookeeper和各个tomcat进行关联:首先确定leader节点,需要在server目录下(我的是
apache-tomcat-8.5.5
)的bin/catalina.bat中添加一行
set JAVA_OPTS=-Dbootstrap_confdir=E:\Tools\solr_home\core0\conf -Dcollection.configName=clusterconf -DzkRun -DzkHost=localhost:2181 -DnumShards=2
。这次需要改1个地方。
指定其他三个为follower节点,在各自的server目录下的bin/catalina.bat中添加一行
set JAVA_OPTS=-DzkRun -DzkHost=localhost:2181 -DnumShards=2
。这次需要改3个地方。
- -Dbootstrap_confdir ZooKeeper需要准备一份集群配置的副本,这个参数是告诉SolrCloud这些配置是放在哪里,同时作为整个集群共用的配置文件。
- -Dcollection.configName 指定你的配置文件上传到zookeeper后的名字,建议和你所上传的核心名字一致,这样容易识别。
- -DzkRun 在Solr中启动一个内嵌的zooKeeper服务器,该服务会管理集群的相关配置。
- -DzkHost 跟上面参数的含义一样,允许配置一个ip和端口来指定用哪个Zookeeper服务器进行协调。
- -DnumShards=2 配置需要把你的数据分开到多少个shard中
- -Dbootstrap_conf=true 将会上传solr/home里面的所有数据到zookeeper的home/data目录,也就是所有的core将被集群管理,本次我未使用这个参数。
更改solr启动端口,对应你的tomcat端口:在每一个solr_home下,都有对应的
solr.xml
,修改其中的端口号为之前Tomcat启动的端口。这次需要改4个地方。
注意:这个端口如果不对应在Tomcat中设置的端口,那么在集群中显示的是这里指定的端口号。比如,我将8083端口的solr_home8083/solr.xml改成下面这样,在Cloud
页面中,显示的就是我在solr.xml中设定的值。
启动Zookeeper:双击
./zookeeper-3.4.9/bin/zkServer.cmd
依次启动Tomcat服务:双击
\apache-tomcat-8.5.5\bin\startup.bat
启动第一台server后,访问http://localhost:8080/solr/index.html
启动第其余三台server后,访问http://localhost:8080/solr/index.html
竟然只有一台server正常工作,检查日志,发现有异常出现:
java.lang.IllegalStateException: This CoreContainer has been closed
java.util.concurrent.ExecutionException: org.apache.solr.common.SolrException: Unable to create core [core0]
,分析是因为tomcat的端口问题,于是将server.xml
中所有的端口都改为在集群中不重复数字,问题解决。
下图是我的.\apache-tomcat-8.5.5 - 8083\conf\server.xml的配置情况:
关闭8082端口,或8083端口,Zookeeper控制台显示,有一台服务离线,但是集群能正常工作
- 尝试关闭8080端口(集群中的Leader),可以看到在8082的控制台打印了很多日志关于选举的信息,最终,8082端口成为了新的Leader,集群正常工作。然后再启动8080端口的Solr,它会被加入集群中,但是成为了replication,Leader是8082端口的Solr实例。
尝试关闭Zookeeper,之后所有的Solr实例会不断的抛异常,并尝试去连接Zookeeper,并且集群不能工作,所有Solr节点无法访问,请求不可达。说明,Zookeeper是整个集群的关键,为了保障高可用性,还需要搭建一个Zookeeper的集群,以便单个Zookeeper节点故障时,系统能正常运行。
发现很多人留言或者私信我,出现了异常
org.apache.solr.common.SolrException: Zookeeper is not configured for this Solr Core. Please try connecting to an alternate zookeeper address.
,我今天尝试了很多次都不能重现这个异常,翻看了solr的源码,在ZookeeperInfoHandler.java
中看到了这个异常信息,猜测可能是在配置地址
信息的时候,出了小差错。抱歉无法给出具体的解决方案。
更多推荐
所有评论(0)