利用外部的tomcat+外部的zookeeper搭建solrcloud集群服务环境
Tomcat服务器部署集群solr示例(Tomcat集群-Windows下,solrcloud+tomcat+zookeeper)
需要的软件:
solr-4.9.1下载地址:http://lucene.apache.org/solr/mirrors-solr-latest-redir.html
apache-tomcat-7.0.68
zookeeper-3.4.8.tar.gz
最终配置的目录结构:
E:\solrcloud\tomcatcloud\
apache-tomcat-7.0.68_1
apache-tomcat-7.0.68_2
apache-tomcat-7.0.68_3
solr_home_1
solr_home_2
solr_home_3
zk_server_1
zk_Server_2
zk_Server_3
下面是各文件夹下的详细配置:
1)Tomcat配置:
同一机器部署多个Tomcat,注意将环境变量和server.xml中端口号(三个端口号都要变成不一样)区分开
若用MyEclipse来启动Tomcat的话,那么配置Tomcat的版本必须不一样才能同时配置上去,比如,同时配置四个Tomcat6是不可能的,但是Tomcat4,5,6,7是可以同时配置的!
a) 建Tomcat目录:
将apache-tomcat-7.0.68-windows-x64.zip解压后,取apache-tomcat-7.0.68放入solrcloud目录下三份,分别改名为:apache-tomcat-7.0.68_1,apache-tomcat-7.0.68_2,apache-tomcat-7.0.68_3
b) 配置Tomcat环境变量:
CATALINA_BASE1:E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_1
CATALINA_BASE2:E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_2
CATALINA_BASE3:E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_3
CATALINA_HOME1:E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_1
CATALINA_HOME2:E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_2
CATALINA_HOME3:E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_3
CLASSPATH:%CATALINA_HOME1%\lib\servlet-api.jar;%CATALINA_HOME2%\lib\servlet-api.jar;%CATALINA_HOME3%\lib\servlet-api.jar;
Path:%CATALINA_HOME1%\bin;%CATALINA_HOME2%\bin;%CATALINA_HOME3%\bin;
2)配置solr的home:
将解压后的solr的..\example\solr全部内容拷贝到solrcloud目录下三份,分别改名为:solr_home_1,solr_home_2,solr_home_3
3)Tomcat中加入solr的home:
E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_1\bin\catalina.bat中15行后加入(每个Tomcat配置一遍,修改相应的编号)
set JAVA_OPTS=-Dsolr.solr.home=E:/solrcloud/tomcatcloud/solr_home_1
if "%OS%"=="Windows-NT" setlocal
E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_2\bin\catalina.bat中加入:
set JAVA_OPTS=-Dsolr.solr.home=E:/solrcloud/tomcatcloud/solr_home_2
if "%OS%"=="Windows-NT" setlocal
E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_3\bin\catalina.bat中加入:
set JAVA_OPTS=-Dsolr.solr.home=E:/solrcloud/tomcatcloud/solr_home_3
if "%OS%"=="Windows-NT" setlocal
4)修改TOmcat配置文件中对应环境变量的值:
E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_1\bin\catalina.bat startup.bat两个文件中将CATALINA_HOME和CATALINA_BASE分别替换为对应的环境变量名(全文替换):
CATALINA_HOME1和CATALINA_BASE1
CATALINA_HOME2和CATALINA_BASE2
CATALINA_HOME3和CATALINA_BASE3
5)修改Tomcat的端口号,避免多个tomcat端口冲突,需要修改的是apache-tomcat-7.0.68\conf\server.xml中三个端口号:8005、8080、8009,修改为不一样即可,我修改为:
E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_1\conf\server.xml:8015、8090、8019
E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_2\conf\server.xml:8025、8100、8029
E:\solrcloud\tomcatcloud\apache-tomcat-7.0.68_3\conf\server.xml:8035、8110、8039
6)Tomcat中加入solr:
找到..\solr-4.9.1\example\webapps\solr.war,加入到每个tomcat的webapps中
启动每个tomcat,启动后tomcat的webapps中会生成一个solr项目目录,此时tomcat正常启动,但是浏览器是无法看到solr页面,还要进行以下两个步骤:
a)将..\solr-4.9.1\example\lib\ext中所有包拷贝到tomcat中solr项目的lib下
b)将..\solr-4.9.1\example\resources\log4j.properties文件拷贝到tomcat中solr项目的WEB-INF的classes下
再次重启每个tomcat,访问http://localhost:8090/solr(每个tomcat换成自己的端口号),启动成功。
7)Can't find (or read# directory to add to classloader: ../contrib/extraction/lib #resolved as: E:\solrcloud\solr_home_1\collection1
将solrconfig.xml文件中包路径配置为绝对路径,然后将solr解压目录下的contrib和disk全部拷贝到相应目录下,保证能找到包,不再报此错误。
8)配置zookeeper
a) 在E:\solrcloud\tomcatcloud文件夹下新建server1、server2、server3文件夹,在每个文件夹下加入三个子文件夹:data、dataLog、logs、zookeeper解压后放入
b) data文件夹中新建文件myid(无后缀),server1中myid文件输入内容1(另两个同理)
c) E:\solrcloud\tomcatcloud\server3\zookeeper-3.4.8\conf目录下zoo_sample.cfg文件名改为zoo.cfg(其他两个同理),修改zoo.cfg文件内容(注:clientPort不能相同):
tickTime=2000
initLimit=10
syncLimit=5
dataDir=E:/solrcloud/tomcatcloud/zk_server_1/data
dataLogDir=E:/solrcloud/tomcatcloud/zk_server_1/dataLog
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
server.X 这个数字就是对应 data/myid中的数字
配置完成后,在cmd命令行启动zookeeper,进入zookeeper的bin目录,执行zkServer.cmd(windows环境执行文件),当第一个启动时,会爆错误:connected 拒绝访问,不用处理,当zookeeper全部开启后,成功。
9)如何验证zookeeper伪集群(本地单机三点zookeeper服务)配置成功:
zookeeper测试类:
在cmd启动:>cd java测试类所在目录(将java类中引用到的zookeeper-3.4.8.jar,slf4j-api-1.61.jar也放在该目录下)
>javac -cp zookeeper-3.4.8.jar ZKClient.java
正常运行,在java类所在目录下生成对应的class文件,无报错,但不知怎么体现zookeeper配置正确?
在zookeeper\bin的zkServer.cmd加入:
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
set ZOOCFG=..\conf\zoo3.cfg,将zoo.cfg改为zoo3.cfg(其他各自对应)
10)修改Tomcat_server_x的catalina.bat信息,将zookeeper加入tomcat
将server1(zookeeper服务器)作为主服务器,tomcat1的配置如下:
set JAVA_OPTS=-Dsolr.solr.home=E:/solrcloud/tomcatcloud/solr_home_1
-Dbootstrap_confdir=E:/solrcloud/tomcatcloud/solr_home_1/collection1/conf -Dcollection.configName=myconf
-DnumShards=2 -DzkHost=127.0.0.1:2181
-D是命令行下指定系统属性的固定前缀
Dsolr.solr.home变量是solr的主目录,里边存放索引文件
.Dbootstrap_confdir变量指向solr的所有配置文件(注注注:会上传到zookeeper下,供所有的solr节点共用,因此,其它solr节点的启动时,startenv.sh里就不再需要加Dbootstrap_confdir参数).
-Dcollection.configName 这个参数确定了保存在ZooKeeper中的索引配置的名字。在这里我们使用了“myconf”作为一个例子,你可以使用任意你想要使用的名字来替换。
Tomcat2的配置如下:
set JAVA_OPTS=-Dsolr.solr.home=E:/solrcloud/somcatcloud/solr_home_2 -DzkHost=127.0.0.1:2181
Tomcat3的配置如下:
set JAVA_OPTS=-Dsolr.solr.home=E:/solrcloud/somcatcloud/solr_home_3 -DzkHost=127.0.0.1:2181
11)修改solr_home_x的solr.xml信息,将tomcat端口号与solr关联
因为tomcat中将tomcat1设为主,所以solr_home_1中solr.xml设置如下:
<solr persistent="false">
<cores adminPath="/admin/cores" defaultCoreName="collection1" host="${host:}" hostPort="8090">
<core name="collection1" instanceDir="collection1" />
</cores>
</solr>
hostPort是每个tomcat的server.xml中对应的启动端口号(solr_home_2和solr_home_3同上,注意区分端口号)
启动所有server和tomcat,
启动所有服务后访问伪集群地址为:http://localhost:8090/solr/#/~cloud
以下解决启动报错问题:
Tomcat_1会报错误:Zookeeper is not configured for this Solr Core. Please try connecting to an alternate zookeeper address."(正常配置下主机器(tomcat_1)中运行页面,就是这种提示),
而tomcat_2和tomcat_3中错误为:
HTTP Status 500 - {msg=SolrCore 'collection1' is not available due to init failure: Could not find configName for collection collection1 found
验证:zookeeper集群配置成功,排除zookeeper集群配置问题
解决:将solr_home_2和solr_home_3中solr.xml文件中创建core的语句删掉,
<core name="collection1" instanceDir="collection1" />
创建core时需要注意的地方说明:core在创建的时候会比较麻烦,可以在最初只放一个collection1(在solr的解压包中的exampl/solr中获得),启动之后,在collection1相同目录下手动新建其他core的文件夹,然后将collection1中的conf和data文件夹拷贝到相应新建core的文件夹下,然后保留conf文件夹下的配置文件,删除data文件夹下的文件(这个文件夹拷贝过来的是collection1的索引,删除,在tomcat启动后,会自动为每个core创建索引)
再次启动,运行
http://localhost:8090/solr/#/~cloud(Tomcat_1),
http://localhost:8100/solr/#/~cloud(tomcat_2),
http://localhost:8110/solr/#/~cloud(tomcat_3)
运行结果:tomcat_1,出现的结果还是Zookeeper is not configured for this Solr Core. Please try connecting to an alternate zookeeper address.
而tomcat_2和tomcat_3会出现预期的结果:
Collection1->shard1->172.20.163.38:8100
172.20.163.38:8110
注意:直接将solr_home_2和solr_home_3的collection1删掉,然后启动所有服务,tomcat1显示如上,但是tomcat2和tomcat3没有显示任何信息,并不是错误,因为没有创建core,所以没有信息显示