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