我的环境是linux发行版ubuntu13.04,jdk1.7,tomcat7,solr4.3.1。
先说说我遇到的问题:
在tomcat下配置单机solr4.3.1的时候发现solr启动后网页访问不了,查看tomcat控制台发现报了SEVERE: Error filterStart错误。然后发现solr项目web.xml里面多了log的filter,网上查询知
solr4.3的war包中不包含任何日志的jar包,你需要自己手动添加。将solr目录下example\lib\ext中的jar包copy到tomcat的lib中。这时候虽然添加jar包,但是没有对应的日志配置,需要将example\resources中的log4j.properties也放到tomcat/lib中。当然,你可以根据自己的需要更改配置。参考这里
jdk和tomcat,和zookeeper配置不多说了,我的zookeeper是单机版本,对外端口号是2181。
如果想快速看下solrcloud,可以直接采用wiki里面的示例,wiki采用的是jetty web容器,solrcloud WIKI
我是在单机下配置的,所以多个分片只采用了一个data文件,下面的配置和搭建单机solr一样,只是多了一个zookeepr地址的配置
1.创建solr数据目录,复制example下面的solr文件夹到/data下为solrcloud
<!-- lang: shell -->
$ mkdir /data
$ cp apache-solr-4.3.1/example/solr /data/solrcloud
2.部署solr到tomcat,也就是把dist目录下的solr.war放到tomcat webbapps下面
<!-- lang: shell -->
$ cp apache-solr-4.3.1/dist/solr-4.3.1.war ~/software/tomcat7/webapps/
3.启动tomcat,然后关掉tomcat,solr.war就会解压,然后修改解压后的solr-4.3.1文件名为solr
<!-- lang: shell -->
mv solr-4.3.1 solr
然后编辑solr项目的web.xml
<!-- lang: shell -->
$ vim ~/software/tomcat7/webapps/solr/WEB-INF/web.xml
给web.xml的filter标签前面加入下面的配置
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>/data/solrcloud</env-entry-value>
</env-entry>
其中solr/home是solr的数据目录,zkHost是zookeeper的访问地址。
现在单机solr完成,现在改成分布式的,只需要加几个参数。
在刚才配好的tomcat的bin/catalina.sh 里
<!-- lang: shell -->
# Uncomment the following line to make the umask available when using the
# org.apache.catalina.security.SecurityListener
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
的前面加上下面的参数
<!-- lang: shell -->
JVM_ARGS="-Xmx3G -Xms3G -Xmn1G -XX:MaxPermSize=256m -DzkHost=127.0.0.1:2181 -XX:PermSize=256m -Dbootstrap_conf=true -DnumShards=2 -Djetty.port=8080"
JAVA_OPTS="$JAVA_OPTS $JVM_ARGS"
由于分布式默认的端口号是8983,而我是单机下玩的,tomcat端口号是8080,所以这里必须强制指定端口号为8080,否则没办法搜数据,,如果你不是单机,就可以不用加-Djetty.port,默认就会为8983,这里的-DnumShards=2是指定我的集群分为两个shard,-DzkHost来指定zookeeper地址。如果你的zookeeper是集群,应该写成
-DzkHost=localhost:9983,localhost:8574,localhost:9900 大概这样的。bootstrap_conf=true将会上传你在web.xml里面solr/home里配置的数据目录下面solr.xml里面配置的所有的solrcore到zookeeper,也就是所有的core将被集群管理,如果只指定单个,配置应该像下面的这样
<!-- lang: shell -->
JVM_ARGS="-Xmx3G -Xms3G -Xmn1G -XX:MaxPermSize=256m -XX:PermSize=256m -Dbootstrap_confdir=/data/solrcloud/collection1/conf -Dcollection.configName=collection1 -DzkHost=127.0.0.1:2181 -DnumShards=2"
JAVA_OPTS="$JAVA_OPTS $JVM_ARGS"
其中-Dcollection.configName是在指定你的配置文件上传到zookeeper后的名字,建议和你所上传的核心名字一致,这样容易识别,当然你也可以在满足规范的情况下自己起名。
值得注意的是,每次重新启动的时候,如果-Dbootstrap_confdir配置一样,zookeeper上面的配置都会被覆盖。
现在启动tomcat,没报错的话访问 http://127.0.0.1:8080/solr/#/~cloud
将会看到有一个节点是亮的如果你的tomcat和我一样是8080,那么会发现他被连在了shard2上,我觉得很不爽,所以把tomcat端口改成了8983当然,catalina.sh里面的 -Djetty.port也改成了8983.
我是单机的,所以我把tomcat复制了一份,这次给的端口是8080,因为刚才说了,我已经把上一个的改成了8983.这个tomcat因为是复制的,所以已经包含了solr在里面,但是catalina.sh需要改一下,因为配置已经在前一个tomcat上传了,所以不能在上传了,所以只需要加入-DzkHost和-Djetty.port=8080(因为我这个tomcat指定的是8080,根据你的来确定)。
然后启动tomcat,再次访问http://127.0.0.1:8983/solr/#/~cloud(我的tomcat访问端口已经改成了8983,因为我觉得不爽已经改端口号了)
将会看到两个节点都亮了,如果指定的端口号不是8983,还可以看到后面会跟着你指定的端口号。
下面如果你把刚才那个tomat直接复制一份(说的是我第二次的那个8080的tomcat),单机需要再次改端口号,然后启动,再次访问http://127.0.0.1:8983/solr/#/~cloud
会发现刚才启动的变成了shard1的子节点了,因为我们已经指定了分片数为2,所以以后启动的集群节点都会成为原来shard的子节点。
如果再加一个tomcat会发现shard2也多了子节点。
整理一下,分布式搭建就是在第一个次启动的时候上传solr配置信息和分片数(numShards)到zookeeper,然后以后启动的solr只要指定到了zookeeper将会自动成为shard或者子节点。