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

相關文章
相關標籤/搜索