SolrCloud 4.7+Tomcat 安装配置实践
SolrCloud 4.3.1+Tomcat 7安装配置实践
我们使用Solr Replication可以实现Solr服务器的可用性,即使某一个索引副本由于磁盘介质故障或者误操作删除等,其他的多个复制副本仍然可以提供服务。如果只是单纯的基于Solr Replication技术,只能对一个索引进行管理维护,当索引数据达到一定规模,搜索的性能成了瓶颈,除了重新规划设计索引,实现逻辑划分以外,没有更好地方法实现查询服务器的可扩展性。
SolrCloud就是为了解决这个问题而提出的。SolrCloud通过ZooKeeper集群来进行协调,使一个索引(SolrCloud中叫做一个Collection)进行分片,各个分片可以分布在不同的物理节点上,而且,对于同一个Collection的多个分片(Shard)之间没有交集,亦即,多个物理分片组成一个完成的索引Collection。为了保证分片数据的可用性,SolrCloud自动支持Solr Replication,可以同时对分片进行复制,冗余存储。下面,我们基于Solr最新的4.7版本进行安装配置SolrCloud集群,通过实践来实现索引数据的分布存储和检索。
准备工作
· 服务器信息
六台服务器:
[plain] viewplaincopy
- 192.168.2.160 nistest.NFSMaster
- #master
- 192.168.2.161 nistest.master
- #backup
- 192.168.2.162 nistest.backup
- #slave
- 192.168.2.163 nistest.node1
- 192.168.2.164 nistest.node2
- 192.168.2.165 nistest.node3
- 192.168.2.166 nistest.node4
- ZooKeeper集群配置
安装ZooKeeper集群,在上面6分节点上分别安装,使用的版本是Zookeeper version: 3.4.2-1221870
。
首先,在master节点上配置zoo.cfg,内容如下所示:
#!/bin/bash
#define variates
ip_array=("nistest.master""nistest.backup" "nistest.node1" "nistest.node2""nistest.node3" "nistest.node4")
#ip_array=("192.168.2.161""192.168.2.162" "192.168.2.163" "192.168.2.164""192.168.2.165" "192.168.2.166")
#ip_array=("a" "b")
#ssh -t -p 22 hadoop@nistest.node1"/usr/local/hadoop/zookeeper/bin/zkServer.sh start"
user="hadoop"
remote_cmd="/usr/local/hadoop/zookeeper/bin/zkServer.shstart"
#execute ssh command
myid=1
for ip in ${ip_array[*]}
do
if [$ip ="nistest.master" ]; then
port="7777"
else
port="22"
fi
echo $myid
#((myid=$myid + 1))
#ssh -t -p $port $user@$ip $remote_cmd
ssh -t -p $port $user@$ip "echo $myid>/usr/local/hadoop/zookeeper/data/myid"
ssh -t -p $port $user@$ip $remote_cmd
((myid=$myid + 1))
Done
然后,创建对应的数据存储目录后,可以直接将该配置复制到其他两个节点上:
启动ZooKeeper集群,在每个节点上分别启动ZooKeeper服务:
可以查看ZooKeeper集群的状态,保证集群启动没有问题:
[plain] viewplaincopy
1.[hadoop@master zookeeper-3.4.5]$ bin/zkServer.sh status
2.JMX enabled by default
3.Using config: /home/hadoop/applications/zookeeper/zookeeper-3.4.5/bin/../conf/zoo.cfg
4.Mode: follower
5.
6.[hadoop@slave1 zookeeper-3.4.5]$ bin/zkServer.sh status
7.JMX enabled by default
8.Using config: /home/hadoop/applications/zookeeper/zookeeper-3.4.5/bin/../conf/zoo.cfg
9.Mode: follower
10.
11. [hadoop@slave4 zookeeper-3.4.5]$ bin/zkServer.sh status
12. JMX enabled by default
13. Using config: /home/hadoop/applications/zookeeper/zookeeper-3.4.5/bin/../conf/zoo.cfg
14. Mode: leader
可以看到,slave4节点是ZooKeeper集群服务Leader。
· SolrCloud相关目录
我们选择/usr/local/hadoop/solr/cloud目录存放Solr的库文件和配置文件,该目录下有lib和multicore两个子目录。
另外,还有一个存储索引的目录,设置为/usr/local/Hadoop/solr/cloud/data。
SolrCloud配置
首先在一个节点上对SOLR进行配置,我们选择master节点。
1、SOLR基本配置
将下载的SOLR的压缩包解压缩,将solr-4.7.0\example\webapps\solr.war解开,将solr-4.7.0\example\webapps\solr\WEB-INF\lib和solr-4.3.1\example\lib\ext中的jar文件拷贝到solr-4.7.0\example\webapps\solr\WEB-INF\lib中,并将解开的solr目录改名为solr-cloud,然后传到服务器的Tomcat下的webapps目录下。
将solr-4.7\example\webapps\solr\WEB-INF\lib和solr-4.7\example\lib\ext下面的jar文件都拷贝到指定目录/usr/local/Hadoop/solrcloud/lib/中:
目录/usr/local/hadoop/solrcloud/multicore的结构,如图所示:
下面,我们对上面conf目录下的配置文件进行说明:
· schema.xml文件
[html] viewplaincopy
1.<?xml version="1.0" ?>
2.
3.<schema name="example core two" version="1.1">
4. <types>
5. <fieldtype name="string" class="solr.StrField" omitNorms="true" />
6. <fieldType name="long" class="solr.TrieLongField" />
7. <fieldtype name="int" class="solr.IntField" />
8. <fieldtype name="float" class="solr.FloatField" />
9. <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0" />
10. </types>
11. <fields>
12. <field name="id" type="long" indexed="true" stored="true" multiValued="false" required="true" />
13. <field name="area" type="string" indexed="true" stored="false" multiValued="false" />
14. <field name="building_type" type="int" indexed="true" stored="false" multiValued="false" />
15. <field name="category" type="string" indexed="true" stored="false" multiValued="false" />
16. <field name="temperature" type="int" indexed="true" stored="false" multiValued="false" />
17. <field name="code" type="int" indexed="true" stored="false" multiValued="false" />
18. <field name="latitude" type="float" indexed="true" stored="false" multiValued="false" />
19. <field name="longitude" type="float" indexed="true" stored="false" multiValued="false" />
20. <field name="when" type="date" indexed="true" stored="false" multiValued="false" />
21. <field name="_version_" type="long" indexed="true" stored="true" />
22. </fields>
23. <uniqueKey>id</uniqueKey>
24. <defaultSearchField>area</defaultSearchField>
25. <solrQueryParser defaultOperator="OR" />
26. </schema>
· solrconfig.xml文件
[html] viewplaincopy
1.<?xml version="1.0" encoding="UTF-8" ?>
2.
3.<config>
4. <luceneMatchVersion>LUCENE_43</luceneMatchVersion>
5. <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}" />
6. <dataDir>${solr.shard.data.dir:}</dataDir>
7. <schemaFactory class="ClassicIndexSchemaFactory" />
8.
9. <updateHandler class="solr.DirectUpdateHandler2">
10. <updateLog>
11. <str name="dir">${solr.shard.data.dir:}</str>
12. </updateLog>
13. </updateHandler>
14.
15. <!-- realtime get handler, guaranteed to return the latest stored fields of any document, without the need to commit or open a new searcher. The current implementation relies on the updateLog feature being enabled. -->
16. <requestHandler name="/get" class="solr.RealTimeGetHandler">
17. <lst name="defaults">
18. <str name="omitHeader">true</str>
19. </lst>
20. </requestHandler>
21. <requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" />
22. <requestDispatcher handleSelect="true">
23. <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" formdataUploadLimitInKB="2048" />
24. </requestDispatcher>
25.
26. <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
27. <requestHandler name="/analysis/field" startup="lazy" class="solr.FieldAnalysisRequestHandler" />
28. <requestHandler name="/update" class="solr.UpdateRequestHandler" />
29. <requestHandler name="/update/csv" class="solr.CSVRequestHandler" startup="lazy">
30. <lst name="defaults">
31. <str name="separator">,</str>
32. <str name="header">true</str>
33. <str name="encapsulator">"</str>
34. </lst>
35. <updateLog>
36. <str name="dir">${solr.shard.data.dir:}</str>
37. </updateLog>
38. </requestHandler>
39. <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
40. <requestHandler name="/admin/ping" class="solr.PingRequestHandler">
41. <lst name="invariants">
42. <str name="q">solrpingquery</str>
43. </lst>
44. <lst name="defaults">
45. <str name="echoParams">all</str>
46. </lst>
47. </requestHandler>
48.
49. <updateRequestProcessorChain name="sample">
50. <processor class="solr.LogUpdateProcessorFactory" />
51. <processor class="solr.DistributedUpdateProcessorFactory" />
52. <processor class="solr.RunUpdateProcessorFactory" />
53. </updateRequestProcessorChain>
54.
55. <query>
56. <maxBooleanClauses>1024</maxBooleanClauses>
57. <filterCache class="solr.FastLRUCache" size="10240" initialSize="512" autowarmCount="0" />
58. <queryResultCache class="solr.LRUCache" size="10240" initialSize="512" autowarmCount="0" />
59. <documentCache class="solr.LRUCache" size="10240" initialSize="512" autowarmCount="0" />
60. <enableLazyFieldLoading>true</enableLazyFieldLoading>
61. <queryResultWindowSize>20</queryResultWindowSize>
62. <queryResultMaxDocsCached>200</queryResultMaxDocsCached>
63. <maxWarmingSearchers>2</maxWarmingSearchers>
64. </query>
65. <admin>
66. <defaultQuery>solr</defaultQuery>
67. </admin>
68. </config>
· solrcore.properties文件
[plain] viewplaincopy
1.solr.shard.data.dir=/home/hadoop/applications/storage/cloud/data
属性solr.shard.data.dir在solrconfig.xml文件中北引用过,指定索引数据的存放位置。
· solr.xml文件
该文件中指定了ZooKeeper的相关配置,已经Solr Core的配置内容:
[html] viewplaincopy
1.<?xml version="1.0" encoding="UTF-8" ?>
2.
3.<solr persistent="true">
4. <cores defaultCoreName="collection1" host="${host:}" adminPath="/admin/cores" zkClientTimeout="${zkClientTimeout:15000}" hostPort="8888" hostContext="${hostContext:solr-cloud}">
5. </cores>
6.</solr>
注意:这里,我们并没有配置任何的core元素,这个等到整个配置安装完成之后,通过SOLR提供的REST接口,来实现Collection以及Shard的创建,从而来更新这些配置文件。
2、ZooKeeper管理监控配置文件
其实这一步可以不用做,因为当你初次启动的时候Zookeeper会自动加载这些配置数据到其上面。(而且我操作一下方式反而一直通过不了)
SolrCloud是通过ZooKeeper集群来保证配置文件的变更及时同步到各个节点上,所以,需要将配置文件上传到ZooKeeper集群中:
[plain] viewplaincopy
1.[hadoop@master ~]$ java -classpath .:/usr/local/hadoop/solr/cloud/lib/* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost nistest.master:2181,nistest.backup:2181,nistest.node1:2181,nistest.node2:2181,nistest.node3:2181,nistest.node4:2181 -confdir /usr/local/hadoop/solr/cloud/multicore/collection1/conf -confname myconf
2.
3.[hadoop@master ~]$ java -classpath .:/usr/local/Hadoop/solr/cloud/lib/* org.apache.solr.cloud.ZkCLI -cmd linkconfig -collection collection1 -confname myconf -zkhost nistest.master:2181,nistest.backup:2181,nistest.node1:2181,nistest.node2:2181,nistest.node3:2181,nistest.node4:2181
上传完成以后,我们检查一下ZooKeeper上的存储情况:
[plain] viewplaincopy
1.[hadoop@master ~]$ cd /usr/local/Hadoop/zookeeper
2.[hadoop@master zookeeper-3.4.5]$ bin/zkCli.sh -server nistest.master:2181
3....
4.[zk: master:2188(CONNECTED) 0] ls /
5.[configs, collections, zookeeper]
6.[zk: master:2188(CONNECTED) 2] ls /configs
7.[myconf]
8.[zk: master:2188(CONNECTED) 3] ls /configs/myconf
9.[solrcore.properties, solrconfig.xml, schema.xml]
3、Tomcat配置与启动
在Tomcat的启动脚本bin/catalina.sh中,增加如下配置:
[plain] viewplaincopy
1.JAVA_OPTS="-server -Xmx4096m -Xms1024m -verbose:gc -Xloggc:solr_gc.log -Dsolr.solr.home=/home/hadoop/applications/solr/cloud/multicore -DzkHost=master:2188,slave1:2188,slave4:2188"
启动Tomcat服务器:
[plain] viewplaincopy
1.[hadoop@master ~]$ cd servers/apache-tomcat-7.0.42
2.[hadoop@master apache-tomcat-7.0.42]$ bin/catalina.sh start
我开的是DEBUG模式,便于调试。
这时候,SolrCloud集群中只有一个活跃的节点,而且默认生成了一个collection1实例,这个实例实际上虚拟的,因为通过web界面无法访问http://master:8888/solrcloud/,看不到任何有关SolrCloud的信息
4、同步数据和配置信息,启动其他节点
在另外两个节点上安装Tomcat和Solr服务器,只需要拷贝对应的目录即可
Scp –r /usr/local/Hadoop/solrcloud Hadoop@nistest.node1:/usr/local/hadoop/
使用类似方法可以将数据拷贝到其他的服务器
启动其他Solr服务器节点:最好是启动catalina.sh start
直接通过REST接口来创建Collection,如下所示:
curl 'http://nistest.master:8080/solrcloud/admin/collections?action=CREATE&name=mycollection&numShards=3&replicationFactor=1'
1.name 待创建Collection的名称
2.numShards 分片的数量
3.replicationFactor 复制副本的数量
执行上述操作如果没有异常,已经创建了一个Collection,名称为mycollection,而且每个节点上存在一个分片。
通过以上相同的配置来配置的jobsOtherweb显示结果如下: