solrCloud+tomcat+zookeeper集群配置

http://www.tuicool.com/articles/NNjAFr javascript


概述:java

SolrCloud 是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper做为集群的配置信息中心。linux

它有几个特点功能:sql

1)集中式的配置信息apache

2)自动容错bootstrap

3)近实时搜索tomcat

4)查询时自动负载均衡ruby

安装zookeeper服务器

上面也说了 SolrCloud 是基于Solr和Zookeeper的分布式搜索方案,全部要部署solrCloud+tomcat+zookeeper的集群,必须先安装zookeeperapp

安装环境:

Liux: CentOS release 6.4

JDK:1.7.0_55

由于我研究的是solr最新的版本,因此研究的是solr4.8.0而后solr4.8.0必须跑在jdk1.7以上的版本

一、zookeeper是个什么玩意?

答:顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象)、Hive(蜜蜂)、pig(小猪)的管理员, Apache Hbase和 Apache Solr 的分布式集群都用到了zookeeper;Zookeeper:是一个分布式的、开源的程序协调服务,是hadoop项目下的一个子项目;

二、zookeeper伪集群安装

由于我演示的这套安装是单机版的安装,因此采用伪集群的方式进行安装,若是是真正的生成环境,将伪集群的ip改下就能够了,步骤是同样的,学会了伪集群安装,真正生产的多环境安装不会,那是不可能的一件事情。

第一步:下载最新的zooper软件:http://www.apache.org/dyn/closer.cgi/zookeeper/

第二步:为了测试真实我在我linux上面部署三个zookeeper服务

建立zookeeper的安装目录
[root@localhost solrCloud]# mkdir /usr/solrcould

将下载的zookeeper-3.3.6.tar.gz复制到该目录下,同时在/usr/solrcould目录下新建三个文件夹:以下所示:

[root@localhost solrcoulud]# lsservice1  service2  servive3  zookeeper-3.3.6.tar.gz

而后在每一个文件夹里面解压一个zookeeper的下载包,而且还建了几个文件夹,整体结构以下:

[root@localhost service1]# lsdata  datalog  logs  zookeeper-3.3.6

首先进入data目录,建立一个myid的文件,里面写入一个数字,好比我这个是server1,那么就写一个 1,server2对应myid文件就写入2,server3对应myid文件就写个3而后进入zookeeper/conf目录,若是是刚下过来,会有3个文件,configuration.xml, log4j.properties,zoo_sample.cfg,咱们首先要作的就是在这个目录下建立一个zoo.cfg的配置文件,固然你能够把zoo_sample.cfg文件改为zoo.cfg,配置的内容以下所示:

service1 的zoo.cfg:

# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=5# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=2# the directory where the snapshot is stored.dataDir=/usr/solrcould/service1/datadataLogDir=/usr/solrcould/service1/datalog# the port at which the clients will connectclientPort=2181server.1=192.168.238.133:2888:3888server.2=192.168.238.133:2889:3889server.3=192.168.238.133:2890:3890

service2 的zoo.cfg:

# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=5# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=2# the directory where the snapshot is stored.dataDir=/usr/solrcould/service2/datadataLogDir=/usr/solrcould/service2/datalog# the port at which the clients will connectclientPort=2182server.1=192.168.238.133:2888:3888server.2=192.168.238.133:2889:3889server.3=192.168.238.133:2890:3890

service3 的zoo.cfg:

# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=5# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=2# the directory where the snapshot is stored.dataDir=/usr/solrcould/service3/datadataLogDir=/usr/solrcould/service3/datalog# the port at which the clients will connectclientPort=2183server.1=192.168.238.133:2888:3888server.2=192.168.238.133:2889:3889server.3=192.168.238.133:2890:3890

 参数说明:

tickTime:zookeeper中使用的基本时间单位, 毫秒值.

initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其他的server为follower。 initLimit参数配置初始化链接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.

syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.

dataDir: 数据存放目录. 能够是任意目录.可是我喜欢这么干

dataLogDir: log目录, 一样能够是任意目录. 若是没有设置该参数, 将使用和dataDir相同的设置

clientPort: 监听client链接的端口号.

server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口. 因为配置的是伪集群模式, 因此各个server的B, C参数必须不一样.

 配置说明:

须要注意的是clientPort这个端口若是你是在1台机器上部署多个server,那么每台机器都要不一样的clientPort,好比我server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也须要区分下。

最后几行惟一须要注意的地方就是 server.X 这个数字就是对应 data/myid中的数字。你在3个server的myid文件中分别写入了1,2,3,那么每一个server中的zoo.cfg都配server.1,server.2,server.3就OK了。由于在同一台机器上,后面连着的2个端口3个server都不要同样,不然端口冲突,其中第一个端口用来集群成员的信息交换,第二个端口是在leader挂掉时专门用来进行选举leader所用。

到这里zookeeper的配置就这么配玩了,你没有看错,就是这么简单!

第四步:固然是启动zookeeper

进入zookeeper-3.3.2/bin 目录中,./zkServer.sh start启动一个server,这时会报大量错误?其实没什么关系,由于如今集群只起了1台server,zookeeper服务器端起来会根据zoo.cfg的服务器列表发起选举leader的请求,由于连不上其余机器而报错,那么当咱们起第二个zookeeper实例后,leader将会被选出,从而一致性服务开始可使用,这是由于3台机器只要有2台可用就能够选出leader而且对外提供服务(2n+1台机器,能够容n台机器挂掉)。

[root@bogon bin]# sh zkServer.sh start  #启动
JMX enabled by defaultUsing config: /usr/solrcould/service3/zookeeper-3.3.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED 
[root@bogon bin]# sh zkServer.sh status #查看当前状态,他会报异常,没关系,由于是集群,其余两台没有起来,没法进行相互链接,固然报错,启动另外两台就不会报错了!
JMX enabled by defaultUsing config: /usr/solrcould/service3/zookeeper-3.3.6/bin/../conf/zoo.cfg
Error contacting service. It is probably not running

进入不一样的zookeeper的bin,分别启动,经常使用命令以下

启动ZK服务:       sh zkServer.sh start
 查看ZK服务状态:   sh zkServer.sh status
 中止ZK服务:       sh zkServer.sh stop
 重启ZK服务:       sh zkServer.sh restart

三、补充单机配置,和实际集群配置

单机部署: 进入zookeeper/conf目录,若是是刚下过来,会有3个文件,configuration.xml, log4j.properties,zoo_sample.cfg,这3个文件咱们首先要作的就是在这个目录下建立一个zoo.cfg的配置文件,固然你能够把zoo_sample.cfg文件改为zoo.cfg,配置的内容以下所示:

tickTime=2000  dataDir=/Users/apple/zookeeper/data  dataLogDir=/Users/apple/zookeeper/logs  clientPort=4180

  进入zookeeper-3.3.2/bin 目录中,./zkServer.sh start启动,单机便完成安装

实际集群部署: 集群模式的配置和伪集群基本一致,因为集群模式下, 各server部署在不一样的机器上, 所以各server的conf/zoo.cfg文件能够彻底同样.

下面是一个示例:

tickTime=2000  initLimit=5  syncLimit=2  dataDir=/home/zookeeper/data  
dataLogDir=/home/zookeeper/datalog  
clientPort=4180server.43=10.1.39.43:2888:3888server.47=10.1.39.47:2888:3888  server.48=10.1.39.48:2888:3888须要注意的是, 各server的dataDir目录下的myid文件中的数字必须不一样.

solr集群部署 

个人理解,其实安装solrCloud很是的简单,就是先安装zookeeper而后安装solr 最后将zookeeper和tomcat进行关联就ok了,如此的简单。

第一步:准备软件

Jdk、tomcat这些安装在个人文档里面是省略的,若是这两个东西都不会安装,你来安装solr集群,那就是很是扯淡的一件事情

再次提醒,若是是solr4.8或者以上的版本,记得把jdk升级到1.7以上,不然tomcat起不来。

第二步:在tomcat部署solr,能够参考个人另一篇博客地址以下:

http://eksliang.iteye.com/blog/2096478,参考上面的企业级安装

你能够参考下个人目录结构

[root@bogon solrcould]# lsservice1  service2  service3  tomcat1  tomcat2  tomcat3  tomcat4

这一步就是简单的在4个tomcat上面部署solr,没有作其余任何操做,由于是在同一台机子上面的部署,请记得修改tomcat的端口号。

第三步:配置zookeeper和各个tomcat进行关联

修改solr的所在tomcat所在服务器,在${tomcat_home}/bin/目录下修改catalina.sh

在第一行添加:

这是个人实例:

tomcat1:配置以下:

JAVA_OPTS="$JAVA_OPTS -DzkHost=192.168.238.133:2181,192.168.238.133:2182,192.168.238.133:2183 -Dbootstrap_confdir=/usr/solrcould/tomcat1/display/solrhome/collection1/conf -Dcollection.configName=myconf  -DnumShards=3"

其余tomcat:配置以下:

JAVA_OPTS="$JAVA_OPTS -DzkHost=192.168.238.133:2181,192.168.238.133:2182,192.168.238.133:2183 -DnumShards=3"

参数说明:

-DzkRun  在Solr中启动一个内嵌的zooKeeper服务器,该服务会管理集群的相关配置。单机版(测试)使用,若是是集群,用下面的-DzkHost来替换,含义同样

例如:

JAVA_OPTS="$JAVA_OPTS -DzkRun  -Dbootstrap_conf=true -DnumShards=2"

-DzkHost 跟上面参数的含义同样,容许配置一个ip和端口来指定用那个zookeeper服务器进行协调

例如:

JAVA_OPTS = "$JAVA_OPTS 
-DzkHost=192.168.56.11:2181,192.168.56.12:2181,192.168.56.13:2181-Dbootstrap_conf=true-DnumShards=2"

-Dbootstrap_confdir :zooKeeper须要准备一份集群配置的副本,因此这个参数是告诉SolrCloud这些     配置是放在哪里。同时做为整个集群共用的配置文件

-Dcollection.configName 是在指定你的配置文件上传到zookeeper后的名字,建议和你所上传的核心名字一致,这样容易识别,固然你也能够在知足规范的状况下本身起名。

-bootstrap_conf=true将会上传solr/home里面的全部数据到zookeeper的home/data目录,也就是全部的core将被集群管理

-DnumShards=2 配置你要把你的数据分开到多少个shard中

-Djetty.port =8080 这个端口跟你所在端口保持一致,这个就是jetty的监听端口,实现集群之间进行通讯的,若是这个端口不这样配置,那么就是搜索不到数据

固然这个参数也能够再solr/home/solr.xml下面配置:以下所示

<solrcloud>  <str name="host">${host:}</str>  <int name="hostPort">${jetty.port:8080}</int>  <str name="hostContext">${hostContext:solr}</str>  <int name="zkClientTimeout">${zkClientTimeout:30000}</int>  <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  </solrcloud>

默认是8983,若是在catalina.sh中指定了,会覆盖上图solr.xml中配置的

注意 :

-DnumShards, -Dbootstrap_confdir和-Dcollection.configName参数只须要在第一次将Solr运行在SolrCloud模式的时候声明一次。它们能够把你的配置加载到     zooKeeper中;若是你在往后从新声明了这些参数从新运行了一次,将会从新加载你的配置,这样你在原来配置上所作的一些修改操做可能会被覆盖。因此官方推荐只在第一个tomcat里面加入这几个参数,其余集群的tomcat里面不加,启动的第一个Solr的端口号,它是你的SolrCloud集群的overseer节点

第四步:修改jetty的监听端口

修改solr.xml,该文件在你部署solr时本身定的工做目录,例如个人配置在以下地址:

<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>usr/solrcould/tomcat4/display/solrhome</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>

改动以下:

<int name="hostPort">${jetty.port:8983}</int>  
        改成跟你所在tomcat的端口改为同样<int name="hostPort">${jetty.port:8080}</int>

这个端口的做用: -Djetty.port =8080 这个端口跟你所在端口保持一致,这个就是jetty的监听端口,实现集群之间进行通讯的,若是这个端口不这样配置,那么就是搜索不到数据

而后依次启动tomcat

看到了没有,这就是启动了,一个有三个节点的集群

参考文献:http://my.oschina.net/zengjie/blog/197960#OSC_h2_1

相关文章
相关标签/搜索