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显示结果如下:


posted on 2014-11-14 15:02  大鹏展翅fjsh  阅读(383)  评论(0编辑  收藏  举报