搭建SOLRCLOUD集群
1.下载地址
http://lucene.apache.org/solr/
参考WIKI文档: http://wiki.apache.org/solr/SolrCloud
(1)加压缩包并,将solr-4.9.0\example 文件件复制一份,cp -r example example2
(2)启动一个节点
cd examplejava -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -DzkRun -DnumShards=2 -jar start.jar
(3)启动另一个节点并加入Zookeeper集群-DzkRun参数是启动一个嵌入式的Zookeeper服务器,它会作为solr服务器的一部分-Dbootstrap_confdir参数是上传本地的配置文件上传到zookeeper中去,作为整个集群共用的配置文件-DnumShards指定了集群的逻辑分组数目
cd example2
java -Djetty.port=7574 -DzkHost=localhost:9983 -jar start.jar
-DzkHost=localhost:9983就是指明了Zookeeper集群所在位置然后我们可以打开http://localhost:8983/solr/collection1/admin/zookeeper.jsp 或者http://localhost:8983/solr/#/cloud看看目前集群的状态
(4)索引一些文档,
cd exampledocsjava -Durl=http://localhost:8983/solr/collection1/update -jar post.jar ipod_video.xmljava -Durl=http://localhost:8983/solr/collection1/update -jar post.jar monitor.xmljava -Durl=http://localhost:8983/solr/collection1/update -jar post.jar mem.xml
(5)这个集群现在就具备容错性了,你可以试着干掉一个Solr服务器,然后再发送查询请求。
现在这个demo就比较完善了,下图就是全部配置完成后的状态但是尽管solr服务器可以容忍挂掉,但集群中只有一个zookeeper服务器来维护集群的状态信息,单点的存在即是不稳定的根源。如果这个zookeeper服务器挂了,那么分布式查询还是可以工作的,因为每个solr服务器都会在内存中维护最近一次由zookeeper维护的集群状态信息,但新的节点无法加入集群,集群的状态变化也不可知了。因此,为了解决这个问题,需要对Zookeeper服务器也设置一个集群,让其也具备高可用性和容错性。有两种方式可选,一种是提供一个外部独立的Zookeeper集群,另一种是每个solr服务器都启动一个内嵌的Zookeeper服务器,再将这些Zookeeper服务器组成一个集群。我们这里用后一种做示例:增加两个节点cp -r example exampleBcp -r example2 example2Bcd exampleBjava -Djetty.port=8900 -DzkHost=localhost:9983 -jar start.jarcd example2Bjava -Djetty.port=7500 -DzkHost=localhost:9983 -jar start.jar
3.部署单个solr
(1)把solr包下面example/solr目录下面所有的文件都拷贝到 solr_home 目录下面
[root@HTML5 solrhome]# cp -r solr-4.9.0/example/solr/* ./
把solr包下面的 dist/solr-4.7.2.war 拷到 /data/solr_home目录下面
[root@HTML5 solrhome]# cp solr-4.9.0/dist/solr-4.9.0.war ./
[root@HTML5 solrhome]# mv solr-4.9.0.war solr.war
(2)在Tomcat的 conf/Catalina/localhost 目录下面增加一个文件 solr.xml,内容如下:
<?xml version="1.0" encoding="UTF8" ?>
<Context docBase="/usr/local/solrhome/solr.war" debug="0" crossContext="false" ><Environment name="solr/home"type="java.lang.String"value="/usr/local/solrhome"override="true" /></Context>
(3)启动tomcat,
webapps
下边多了解压出来的solr文件夹
进入
solr/WEB-INF/
下修改
web.xml
<!--
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/put/your/solr/home/here</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
-->
改为 :
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
(4)复制example/lib/ext下所有jar包到tomcat 的lib下
[root@HTML5 lib]# cp /usr/local/solrhome/solr-4.9.0/example/lib/ext/* ./
复制example/resources/log4j.properties 到solr/WEB-INF/classes
(5)启动tomcat,访问http://192.168.66.99:8080/solr/ 无法打开,检查异常:
严重: Exception starting filter SolrRequestFilter
java.lang.UnsupportedClassVersionError: org/apache/solr/servlet/SolrDispatchFilter : Unsupported major.minor version 51.0 (unable to load class org.apache.solr.servlet.SolrDispatchFilter)
原来是
solr4.9版本是使用JDK1.7编译的,
要求运行环境JDK也是1.7以上,
修改完成后启动,报错如下:
[localhost-startStop-1] ERROR org.apache.solr.core.SolrCore – null:org.apa
che.solr.common.SolrException: Found multiple cores with the name [collection1],with instancedirs [/usr/local/solrhome/solr-4.9.0/example/example-schemaless/solr/collection1/] and [/usr/local/solrhome/solr-4.9.0/example/solr/collection1/]
原来我解压solr后的文件夹放到了solhome下,后来又复制了example/solr/下的文件到solhome,
solr启动时会到 solrhome下检查所有文件夹,并加载core配置,结果solrhome下有两个collection1 core所以 Found multiple cores with the name [collection1],删除solr-4.9.0文件夹即可,再次重启成功运行!至此单个solr启动完成
4.solrcloud集群配置(在一台虚拟机上测试,生产环境同理)
(1)复制3个tomcat,分别配置环境变量及端口,分别为 tomcat-1 端口:8080 tomcat-2 端口:9080 tomcat-3端口:7080
(2)复制solrhome 分别为solrhome-1 solrhome-2 solrhome-3
并分别修改下面solr.xml,如下:(生产环境中,多台服务器不需要该步骤,直接复制即可)
<solr>
<solrcloud><str name="host">192.168.66.99</str> // admin界面地址<int name="hostPort">7080</int> // admin界面地址端口<str name="hostContext">/solr</str> // admin界面地址工程名(即tomcat下solr解压出的工程名)<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>
(3)
进入各个tomcat/webapps/
solr/WEB-INF/ 目录
下修改
web.xml,修改solrhome路径,参照上一节
(4)
进入各个tomcat/conf/Catalina/localhost 目录下修改solr.xml,
修改solrhome路径
,参照上一节
(5)
进入各个tomcat/bin下修改catalina.sh 加入以下参数:
JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/usr/local/solr/solrhome-3 -DzkHost=127.0
.0.1:1181,127.0.0.1:2181,127.0.0.1:3181"
(6)上传配置文件到zookeeper集群中:
java -classpath .:/usr/local/solr/solrhome-1/lib/* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 127.0.0.1:1181,127.0.0.1:2181,127.0.0.1:3181 -confdir /usr/local/solr/solrhome-1/conf -confname solr-conf
其中参数/usr/local/solr/solrhome-1/lib/可以自己创建,内容如下:
复制 tomcat/webapps/ solr/WEB-INF/lib下所有jar包复制 example/lib/ext 下所有 jar 包复制 example/resources/log4j.properties
zkhost 指明zookeeper集群地址
confdir 指明配置文件目录
confname 配置文件名称
(7)将zookeeper中的配置文件与collection 联系起来(本步骤不清楚是否必须,待测试)
java -classpath .:/usr/local/solr/solrhome-1/lib/* org.apache.solr.cloud.ZkCLI -cmd linkconfig -collection core1 -confname solr-conf -zkhost 127.0.0.1:1181,127.0.0.1:2181,127.0.0.1:3181
(8)启动各个tomcat应用,集群配置完成! 使用任意一台应用都可以访问到控制台.