转载请出自出处:http://eksliang.iteye.com/blog/2107002

http://eksliang.iteye.com/

概述:

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

它有几个特色功能:

1)集中式的配置信息

2)自动容错

3)近实时搜索

4)查询时自动负载均衡

安装zookeeper

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

安装环境:

Liux: CentOS release 6.4

JDK:1.7.0_55

因为我研究的是solr最新的版本,所以研究的是solr4.8.0然后solr4.8.0必须跑在jdk1.7以上的版本

1、zookeeper是个什么玩意?

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

2、zookeeper伪集群安装

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

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

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

  1. 创建zookeeper的安装目录
  2. [root@localhost solrCloud]# mkdir /usr/solrcould

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

  1. [root@localhost solrcoulud]# ls
  2. service1  service2  servive3  zookeeper-3.3.6.tar.gz

然后在每个文件夹里面解压一个zookeeper的下载包,并且还建了几个文件夹,总体结构如下:

  1. [root@localhost service1]# ls
  2. data  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:

  1. # The number of milliseconds of each tick
  2. tickTime=2000
  3. # The number of ticks that the initial
  4. # synchronization phase can take
  5. initLimit=5
  6. # The number of ticks that can pass between
  7. # sending a request and getting an acknowledgement
  8. syncLimit=2
  9. # the directory where the snapshot is stored.
  10. dataDir=/usr/solrcould/service1/data
  11. dataLogDir=/usr/solrcould/service1/datalog
  12. # the port at which the clients will connect
  13. clientPort=2181
  14. server.1=192.168.238.133:2888:3888
  15. server.2=192.168.238.133:2889:3889
  16. server.3=192.168.238.133:2890:3890

service2 的zoo.cfg:

  1. # The number of milliseconds of each tick
  2. tickTime=2000
  3. # The number of ticks that the initial
  4. # synchronization phase can take
  5. initLimit=5
  6. # The number of ticks that can pass between
  7. # sending a request and getting an acknowledgement
  8. syncLimit=2
  9. # the directory where the snapshot is stored.
  10. dataDir=/usr/solrcould/service2/data
  11. dataLogDir=/usr/solrcould/service2/datalog
  12. # the port at which the clients will connect
  13. clientPort=2182
  14. server.1=192.168.238.133:2888:3888
  15. server.2=192.168.238.133:2889:3889
  16. server.3=192.168.238.133:2890:3890

service3 的zoo.cfg:

  1. # The number of milliseconds of each tick
  2. tickTime=2000
  3. # The number of ticks that the initial
  4. # synchronization phase can take
  5. initLimit=5
  6. # The number of ticks that can pass between
  7. # sending a request and getting an acknowledgement
  8. syncLimit=2
  9. # the directory where the snapshot is stored.
  10. dataDir=/usr/solrcould/service3/data
  11. dataLogDir=/usr/solrcould/service3/datalog
  12. # the port at which the clients will connect
  13. clientPort=2183
  14. server.1=192.168.238.133:2888:3888
  15. server.2=192.168.238.133:2889:3889
  16. server.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台机器挂掉)。

  1. [root@bogon bin]# sh zkServer.sh start  #启动
  2. JMX enabled by default
  3. Using config: /usr/solrcould/service3/zookeeper-3.3.6/bin/../conf/zoo.cfg
  4. Starting zookeeper ... STARTED
  5. [root@bogon bin]# sh zkServer.sh status #查看当前状态,他会报异常,不要紧,因为是集群,其他两台没有起来,无法进行相互连接,当然报错,启动另外两台就不会报错了!
  6. JMX enabled by default
  7. Using config: /usr/solrcould/service3/zookeeper-3.3.6/bin/../conf/zoo.cfg
  8. Error contacting service. It is probably not running

进入不同的zookeeper的bin,分别启动,常用命令如下

  1. 启动ZK服务:       sh zkServer.sh start
  2. 查看ZK服务状态:   sh zkServer.sh status
  3. 停止ZK服务:       sh zkServer.sh stop
  4. 重启ZK服务:       sh zkServer.sh restart

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

单机部署:进入zookeeper/conf目录,如果是刚下过来,会有3个文件,configuration.xml, log4j.properties,zoo_sample.cfg,这3个文件我们首先要做的就是在这个目录下创建一个zoo.cfg的配置文件,当然你可以把zoo_sample.cfg文件改成zoo.cfg,配置的内容如下所示:

  1. tickTime=2000
  2. dataDir=/Users/apple/zookeeper/data
  3. dataLogDir=/Users/apple/zookeeper/logs
  4. clientPort=4180

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

实际集群部署:集群模式的配置和伪集群基本一致,由于集群模式下, 各server部署在不同的机器上, 因此各server的conf/zoo.cfg文件可以完全一样.

下面是一个示例:

  1. tickTime=2000
  2. initLimit=5
  3. syncLimit=2
  4. dataDir=/home/zookeeper/data
  5. dataLogDir=/home/zookeeper/datalog
  6. clientPort=4180
  7. server.43=10.1.39.43:2888:3888
  8. server.47=10.1.39.47:2888:3888
  9. server.48=10.1.39.48:2888:3888
  10. 需要注意的是, 各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,参考上面的企业级安装

你可以参考下我的目录结构

  1. [root@bogon solrcould]# ls
  2. service1  service2  service3  tomcat1  tomcat2  tomcat3  tomcat4

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

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

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

在第一行添加:

这是我的实例:

tomcat1:配置如下:

  1. 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:配置如下:

  1. 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来替换,含义一样

例如:

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

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

例如:

  1. JAVA_OPTS = "$JAVA_OPTS
  2. -DzkHost=192.168.56.11:2181,192.168.56.12:2181,192.168.56.13:2181
  3. -Dbootstrap_conf=true
  4. -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下面配置:如下所示

  1. <solrcloud>
  2. <str name="host">${host:}</str>
  3. <int name="hostPort">${jetty.port:8080}</int>
  4. <str name="hostContext">${hostContext:solr}</str>
  5. <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
  6. <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  7. </solrcloud>

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

注意

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

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

修改solr.xml,该文件在你部署solr时自己定的工作目录,例如我的配置在如下地址:

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

改动如下:

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

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

然后依次启动tomcat

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

参考文献:

--官网实例

http://wiki.apache.org/solr/SolrCloud/

--官网的文档翻译

http://my.oschina.net/zengjie/blog/197960#OSC_h2_1

http://www.cnblogs.com/phinecos/archive/2012/02/10/2345634.html

http://phinecos.cnblogs.com/

--Zookeeper参考

http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.html

solrCloud+tomcat+zookeeper集群配置的更多相关文章

  1. zookeeper集群配置与启动——实战

    1,准备: A:三台linxu服务器: 10.112.29.177 10.112.29.172 10.112.29.174 命令 hostname 得到每台机器的 hostname vm-10-112 ...

  2. Nginx+Tomcat+MemCached 集群配置手册

    系统实施文档 Nginx+Tomcat+MemCached 集群配置手册 目    录 第1章   概述 1.1   目标 互联网的快速发展带来了互联网系统的高负载和高可用性, 这要求我们在设计系统架 ...

  3. kafka集群与zookeeper集群 配置过程

    Kafka的集群配置一般有三种方法,即 (1)Single node – single broker集群: (2)Single node – multiple broker集群:    (3)Mult ...

  4. java:zookeeper集群配置,dubbo

    1.zookeeper集群配置: 2.dubbo:(配置见视频)

  5. Solr6.2.0 + zookeeper 集群配置

    zookeeper1 : 192.168.1.103zookeeper2 : 192.168.1.104zookeeper3 : 192.168.1.105solr1 : 192.168.1.106s ...

  6. zookeeper集群配置与启动

    摘要:Zookeeper是一个很好的集群管理工具,被大量用于分布式计算.如Hadoop以及Storm系统中.这里简单记录下Zookeeper集群环境的搭建过程.本文以Ubuntu 12.04 LTS作 ...

  7. zookeeper[5] zookeeper集群配置及伪集群配置

    参考:http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html 集群配置: 1.配置文件conf/zoo.cfg,除了单机模式的配置之外, ...

  8. zookeeper集群配置

    zookeeper集群网上demo一大堆,补充一下一些不明白的地方 1 复制2份zookeeper,savle作为备份节点 2.配置zoo.cfg # The number of millisecon ...

  9. Apache+Tomcat服务器集群配置

    在实际应用中,如果网站的访问量很大,为了提高访问速度,可以与多个Tomcat服务器与Apache服务器集成,让他们共同运行servlet/jsp 组件的任务,多个Tomcat服务器构成了一个集群(Cl ...

随机推荐

  1. Mac下安装nginx

    试图折腾了一下手动安装,太多依赖,繁琐的要死.只好装了一个homebrew , 具体安装homebrew的教程网上查吧,就是一句话(ruby -e "$(curl -fsSL https:/ ...

  2. jQuery的编码标准和最佳实践

    不知道在哪里看到了这篇关于jQuery编码的文章,挺实用的,恰好最近在研究jQuery的基础知识,今天打开收藏夹来翻译一下,原文的英语不难,但是内容很实用,可能有大神已经翻译过了,大家看精华就行了. ...

  3. deep learning 练习 多变量线性回归

    多变量线性回归(Multivariate Linear Regression) 作业来自链接:http://openclassroom.stanford.edu/MainFolder/Document ...

  4. java获取配置文件里面的内容

    InputStream in = ReadProperties.class.getClassLoader() .getResourceAsStream("test.properties&qu ...

  5. 尝试打开或创建物理文件 REATE FILE 遇到操作系统错误 5(拒绝访问)

    尝试打开或创建物理文件 'E:\Library.mdf' 时,CREATE FILE 遇到操作系统错误 5(拒绝访问.). 最佳回答: 这是因为SQL Server的启动帐户(一般是system或某个 ...

  6. [SGU495] Kids and Prizes (概率dp)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 题目大意:有N个盒子,里面都放着礼物,M个人依次去选择盒子,每人仅能选一次,如 ...

  7. PHP常用库函数

    1.时间和日期 如何获取时间戳 time()--从1970年开始计算的毫秒数 echo time(); 日期 echo date('Y-m-d H:i:s'); 获取默认是时区 echo date_d ...

  8. 对于C(n,k)取模

    2016.1.26 法一:直接根据定义式,求乘法逆元即可 法二:借助关于n!mod p,那么根据C(n,k)的定义式并结合乘法逆元即可求解. 法三:借助卢卡斯定理求解 特别注意:在C(n,k)模p等于 ...

  9. 72. Generate Parentheses && Valid Parentheses

    Generate Parentheses Given a string containing just the characters '(', ')', '{', '}', '[' and ']', ...

  10. 尚学堂Spring视频教程(五):Spring AOP

    在第一节中,我们自己模拟了一个Spring,实现一个保存用户的操作,假如现在有一个需求,在保存的时候记录日志,该怎么做呢? 暂且将记录日志操作就简单的变为在保存用户前输出一句话“save start. ...