linux solrcloud zookeeper分布式集群部署
????????
SolrCloud 通過 ZooKeeper 集群來進行協調,使一個索引進行分片,各個分片可以分布在不同的物理節點上,多個物理分片組成一個完成的索引 Collection。SolrCloud 自動支持 Solr Replication,可以同時對分片進行復制,冗余存儲。下面,我們基于 Solr 最新的 4.4.0 版本進行安裝配置 SolrCloud 集群。
1. 安裝環境
我使用的安裝程序各版本如下:
- Solr: Apache Solr-4.4.0 
- Tomcat: Apache Tomcat 6.0.36 
- ZooKeeper: Apache ZooKeeper 3.4.5 
各個目錄說明:
- 所有的程序安裝在 /opt 目錄下,你可以依照你的實際情況下修改安裝目錄。 
- ZooKeeper的數據目錄在: /data/zookeeper/data 
- solrhome設置在: /usr/local/solrhome 
2. 規劃SolrCloud
- 單一SolrCloud數據集合: primary 
- ZooKeeper集群: 3臺 
- SolrCloud實例: 3節點 
- 索引分片: 3 
- 復制因子: 2 
手動將3個索引分片(Shard)的復本(Replica)分布在3個 SolrCloud 節點上
三個節點:
- 192.168.56.121 
- 192.168.56.122 
- 192.168.56.123 
3. 安裝ZooKeeper集群
由于需要用到 ZooKeeper,故我們先安裝好 ZooKeeper 集群。
安裝 ZooKeeper 集群之前,請確保每臺機器上配置 /etc/hosts文件,使每個節點都能通過機器名訪問。
首先,在第一個節點上將 zookeeper-3.4.5.tar.gz 解壓到 /opt 目錄:
$?tar?zxvf?zookeeper-3.4.5.tar.gz?-C?/opt/創建 ZooKeeper 配置文件 zookeeper-3.4.5/conf/zoo.cfg,內容如下:
tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeper/dataclientPort=2181server.1=192.168.56.121:2888:3888server.2=192.168.56.122:2888:3888server.3=192.168.56.123:2888:3888ZooKeeper 的數據目錄指定在 /data/zookeeper/data ,你也可以使用其他目錄,通過下面命令進行創建該目錄:
$?mkdir?/data/zookeeper/data?-p然后,初始化 myid ,三個節點編號依次為 1,2,3 ,在其余節點上分別執行命令(注意修改編號)。
$?echo?"1"?>/data/zookeeper/data/myid然后,在第二個和第三個節點上依次重復上面的操作。這樣第一個節點中 myid 內容為1,第二個節點為2,第三個節點為3。
最后,啟動 ZooKeeper 集群,在每個節點上分別啟動 ZooKeeper 服務:
$?cd?/opt$?sh?zookeeper-3.4.5/bin/zkServer.sh?start可以查看 ZooKeeper 集群的狀態,保證集群啟動沒有問題:
[root@192.168.56.121?opt]#?sh?zookeeper-3.4.5/bin/zkServer.sh?status JMX?enabled?by?default Using?config:?/opt/zookeeper-3.4.5/bin/../conf/zoo.cfg Mode:?follower4. 安裝Solr
你可以參考《Apache Solr介紹及安裝》
簡單來說,執行以下命令:
$?unzip?apache-tomcat-6.0.36.zip??-d?/opt$?unzip?solr-4.4.0.zip??-d?/opt$?cd?/opt$?chmod?+x?apache-tomcat-6.0.36/bin/*.sh$?cp?solr-4.4.0/example/webapps/solr.war?apache-tomcat-6.0.36/webapps/$?cp?solr-4.4.0/example/lib/ext/*?apache-tomcat-6.0.36/webapps/solr/WEB-INF/lib/$?cp?solr-4.4.0/example/resources/log4j.properties?apache-tomcat-6.0.36/lib/在其他節點上重復以上操作完成所有節點的 solr 的安裝。
5. 設置 SolrCloud 配置文件
1、 創建一個 SolrCloud 目錄,并將 solr 的 lib 文件拷貝到這個目錄:
$?mkdir?-p?/usr/local/solrcloud/solr-lib/$?cp?apache-tomcat-6.0.36/webapps/solr/WEB-INF/lib/*?/usr/local/solrcloud/solr-lib/2、 通過 bootstrap 設置 solrhome :
這里設置 solrhome 為 /usr/local/solrhome,創建該目錄:
mkdir?-p?/usr/local/solrhome然后,運行下面命令將 solrhome 下面的配置上傳到 zookeeper:
$?java?-classpath?.:/usr/local/solrcloud/solr-lib/*?org.apache.solr.cloud.ZkCLI?-zkhost?192.168.56.121:2181,192.168.56.122:2181,192.168.56.123:2181?-cmd?bootstrap?-solrhomeSolrCloud 集群的所有的配置存儲在 ZooKeeper。 一旦 SolrCloud 節點啟動時配置了 -Dbootstrap_confdir 參數, 該節點的配置信息將發送到 ZooKeeper 上存儲。基它節點啟動時會應用 ZooKeeper 上的配置信息,這樣當我們改動配置時就不用一個個機子去更改了。
3、SolrCloud 是通過 ZooKeeper 集群來保證配置文件的變更及時同步到各個節點上,所以,需要將我們自己的配置文件(在 /usr/local/solrcloud/conf/primary/conf 目錄下)上傳到 ZooKeeper 集群中,配置名稱設為 primaryconf:
$?java?-classpath?.:/usr/local/solrcloud/solr-lib/*?org.apache.solr.cloud.ZkCLI?-zkhost?192.168.56.121:2181,192.168.56.122:2181,192.168.56.123:2181?-cmd?upconfig?-confdir?/usr/local/solrcloud/conf/primary/conf?-confname?primaryconf說明:
- zkhost 指定 ZooKeeper 地址,逗號分割 
- /usr/local/solrcloud/conf/ 目錄下存在名稱為 primary 的目錄,該目錄下的配置是后面需要用到的。 
- primaryconf 為在 ZooKeeper 上的配置文件名稱。 
/usr/local/solrcloud/conf 結構如下:
$?tree?/usr/local/solrcloud/conf /usr/local/solrcloud/conf ├──?primary │???└──?conf │???????├──?schema.xml │???????└──?solrconfig.xml └──?solr.xml2?directories,?3?filesschema.xml 內容如下:
<?xml?version="1.0"?encoding="UTF-8"??><schema?name="example"?version="1.5"><fields><field?name="namespace"?type="string"?indexed="true"?stored="true"?/><field?name="id"?type="string"?indexed="true"?stored="true"?/><field?name="productId"?type="long"?indexed="true"?stored="true"?/><field?name="category"?type="long"?indexed="true"?stored="true"?multiValued="true"?/><field?name="explicitCategory"?type="long"?indexed="true"?stored="true"?multiValued="true"?/><field?name="searchable"?type="text_general"?indexed="true"?stored="false"?/><field?name="_version_"?type="long"?indexed="true"?stored="true"?multiValued="false"/><dynamicField?name="*_searchable"?type="text_general"?indexed="true"?stored="true"?/><dynamicField?name="*_i"?type="int"?indexed="true"?stored="true"?/><dynamicField?name="*_is"?type="int"?indexed="true"?stored="true"?multiValued="true"?/><dynamicField?name="*_s"?type="string"?indexed="true"?stored="true"?/><dynamicField?name="*_ss"?type="string"?indexed="true"?stored="true"?multiValued="true"?/><dynamicField?name="*_l"?type="long"?indexed="true"?stored="true"?/><dynamicField?name="*_ls"?type="long"?indexed="true"?stored="true"?multiValued="true"?/><dynamicField?name="*_t"?type="text_general"?indexed="true"?stored="true"?/><dynamicField?name="*_txt"?type="text_general"?indexed="true"?stored="true"?multiValued="true"?/><dynamicField?name="*_b"?type="boolean"?indexed="true"?stored="true"?/><dynamicField?name="*_bs"?type="boolean"?indexed="true"?stored="true"?multiValued="true"?/><dynamicField?name="*_d"?type="double"?indexed="true"?stored="true"?/><dynamicField?name="*_ds"?type="double"?indexed="true"?stored="true"?multiValued="true"?/><dynamicField?name="*_p"?type="double"?indexed="true"?stored="true"?/><dynamicField?name="*_dt"?type="date"?indexed="true"?stored="true"?/><dynamicField?name="*_dts"?type="date"?indexed="true"?stored="true"?multiValued="true"?/><!--?some?trie-coded?dynamic?fields?for?faster?range?queries?--><dynamicField?name="*_ti"?type="tint"?indexed="true"?stored="true"?/><dynamicField?name="*_tl"?type="tlong"?indexed="true"?stored="true"?/><dynamicField?name="*_td"?type="tdouble"?indexed="true"?stored="true"?/><dynamicField?name="*_tdt"?type="tdate"?indexed="true"?stored="true"?/></fields><uniqueKey>id</uniqueKey><types><fieldType?name="string"?class="solr.StrField"?sortMissingLast="true"?/><fieldType?name="boolean"?class="solr.BoolField"?sortMissingLast="true"?/><fieldType?name="int"?class="solr.TrieIntField"?precisionStep="0"?positionIncrementGap="0"?/><fieldType?name="long"?class="solr.TrieLongField"?precisionStep="0"?positionIncrementGap="0"?/><fieldType?name="double"?class="solr.TrieDoubleField"?precisionStep="0"?positionIncrementGap="0"?/><fieldType?name="tint"?class="solr.TrieIntField"?precisionStep="8"?positionIncrementGap="0"?/><fieldType?name="tlong"?class="solr.TrieLongField"?precisionStep="8"?positionIncrementGap="0"?/><fieldType?name="tdouble"?class="solr.TrieDoubleField"?precisionStep="8"?positionIncrementGap="0"?/><fieldType?name="date"?class="solr.TrieDateField"?precisionStep="0"?positionIncrementGap="0"?/><!--?A?Trie?based?date?field?for?faster?date?range?queries?and?date?faceting.?--><fieldType?name="tdate"?class="solr.TrieDateField"?precisionStep="6"?positionIncrementGap="0"?/><fieldType?name="text_general"?class="solr.TextField"?positionIncrementGap="100"><analyzer?type="index"><tokenizer?class="solr.StandardTokenizerFactory"?/><filter?class="solr.LowerCaseFilterFactory"?/></analyzer><analyzer?type="query"><tokenizer?class="solr.StandardTokenizerFactory"?/><filter?class="solr.LowerCaseFilterFactory"?/></analyzer></fieldType></types></schema>solrconfig.xml 內容如下:
<?xml?version="1.0"?encoding="UTF-8"??><config><luceneMatchVersion>4.4</luceneMatchVersion><directoryFactory?name="DirectoryFactory"?class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/><schemaFactory?class="ClassicIndexSchemaFactory"/><updateHandler?class="solr.DirectUpdateHandler2"><updateLog><str?name="dir">${solr.data.dir:}</str></updateLog></updateHandler><requestHandler?name="/get"?class="solr.RealTimeGetHandler"><lst?name="defaults"><str?name="omitHeader">true</str></lst></requestHandler><requestHandler?name="/replication"?class="solr.ReplicationHandler"?startup="lazy"?/><requestDispatcher?handleSelect="true"?><requestParsers?enableRemoteStreaming="false"?multipartUploadLimitInKB="2048"?formdataUploadLimitInKB="2048"?/><httpCaching?never304="true"?/></requestDispatcher><requestHandler?name="standard"?class="solr.StandardRequestHandler"?default="true"?/><requestHandler?name="/analysis/field"?startup="lazy"?class="solr.FieldAnalysisRequestHandler"?/><requestHandler?name="/update"?class="solr.UpdateRequestHandler"??/><requestHandler?name="/update/json"?class="solr.JsonUpdateRequestHandler"?startup="lazy"?/><requestHandler?name="/admin/"?class="org.apache.solr.handler.admin.AdminHandlers"?/><requestHandler?name="/admin/ping"?class="solr.PingRequestHandler"><lst?name="invariants"><str?name="q">solrpingquery</str></lst><lst?name="defaults"><str?name="echoParams">all</str><str?name="df">id</str></lst></requestHandler><queryResponseWriter?name="json"?class="solr.JSONResponseWriter"><str?name="content-type">text/plain;?charset=UTF-8</str></queryResponseWriter><updateRequestProcessorChain?name="sample"><processor?class="solr.LogUpdateProcessorFactory"?/><processor?class="solr.DistributedUpdateProcessorFactory"/><processor?class="solr.RunUpdateProcessorFactory"?/></updateRequestProcessorChain><!--?config?for?the?admin?interface?--><admin><defaultQuery>solr</defaultQuery><pingQuery>q=solr&version=2.0&start=0&rows=0</pingQuery><healthcheck?type="file">server-enabled</healthcheck></admin></config>4、創建 collection 并和配置文件關聯:
$?java?-classpath?.:/usr/local/solrcloud/solr-lib/*?org.apache.solr.cloud.ZkCLI?-zkhost?192.168.56.121:2181,192.168.56.122:2181,192.168.56.123:2181?-cmd?linkconfig?-collection?primary?-confname?primaryconf說明:
- 創建的 collection 叫做 primary,并指定和 primaryconf 連接 
5、查看 ZooKeeper 上狀態
在任意一個節點的 /opt 目錄下執行如下命令:
$??zookeeper-3.4.5/bin/zkCli.sh?[zk:?localhost:2181(CONNECTED)?0]?ls?/[configs,zookeeper,clusterstate.json,aliases.json,live_nodes,overseer,collections,overseer_elect][zk:?localhost:2181(CONNECTED)?1]?ls?/configs[primaryconf,][zk:?localhost:2181(CONNECTED)?1]?ls?/collections[primary]查看 /configs 和 /collections 目錄均有值,說明配置文件已經上傳到 ZooKeeper 上了,接下來啟動 solr。
6. Tomcat 配置與啟動
1、修改每個節點上的 tomcat 配置文件,在環境變量中添加 zkHost 變量
編輯 apache-tomcat-6.0.36/bin/catalina.sh ,添加如下代碼:
JAVA_OPTS='-Djetty.port=8080?-Dsolr.solr.home=/usr/local/solrhome?-DzkHost=192.168.56.122:2181,192.168.56.122:2181,192.168.56.123:2181'在 /usr/local/solrhome/ 目錄創建 solr.xml :
<?xml?version="1.0"?encoding="UTF-8"??><solr?persistent="true"?sharedLib="lib"><cores?adminPath="/admin/cores"?zkClientTimeout="${zkClientTimeout:15000}"?hostPort="${jetty.port:8080}"?hostContext="${hostContext:solr}"></cores></solr>說明:
- -Djetty.port:配置 solr 使用的端口,默認為 8983,這里我們使用的是 tomcat,端口為 8080 
- -Dsolr.solr.home:配置 solr/home 
- -zkHost: 配置 zookeeper 集群地址,多個地址逗號分隔 
最后,在 /opt 目錄下啟動 tomcat:
$?sh?apache-tomcat-6.0.36/bin/startup.sh通過 http://192.168.56.121:8080/solr/ 進行訪問,界面如圖提示 There are no SolrCores running. ,這是因為配置文件尚未配置 solrcore。
7. 創建 Collection、Shard 和 Replication
手動創建 Collection 及初始 Shard
直接通過 REST 接口來創建 Collection,你也可以通過瀏覽器訪問下面地址,如下所示:
$?curl?'http://192.168.56.121:8080/solr/admin/collections?action=CREATE&name=primary&numShards=3&replicationFactor=1'如果成功,會輸出如下響應內容:
<response><lst?name="responseHeader"><int?name="status">0</int><int?name="QTime">2649</int></lst><lst?name="success"><lst><lst?name="responseHeader"><int?name="status">0</int><int?name="QTime">2521</int></lst><str?name="core">primary_shard2_replica1</str><str?name="saved">/usr/local/solrhome/solr.xml</str></lst><lst><lst?name="responseHeader"><int?name="status">0</int><int?name="QTime">2561</int></lst><str?name="core">primary_shard3_replica1</str><str?name="saved">/usr/local/solrhome/solr.xml</str></lst><lst><lst?name="responseHeader"><int?name="status">0</int><int?name="QTime">2607</int></lst><str?name="core">primary_shard1_replica1</str><str?name="saved">/usr/local/solrhome/solr.xml</str></lst></lst></response>上面鏈接中的幾個參數的含義,說明如下:
- name: ? ? ? ? ? ? ? 待創建Collection的名稱 
- numShards: ? ? ? ? ?分片的數量 
- replicationFactor: ? 復制副本的數量 
可以通過 Web 管理頁面,訪問 http://192.168.56.121:8080/solr/#/~cloud,查看 SolrCloud 集群的分片信息,如圖所示:
實際上,我們從192.168.56.121節點可以看到,SOLR 的配置文件內容,已經發生了變化,如下所示:
<?xml?version="1.0"?encoding="UTF-8"??><solr?persistent="true"?sharedLib="lib"><cores?adminPath="/admin/cores"?zkClientTimeout="20000"?hostPort="${jetty.port:8080}"?hostContext="${hostContext:solr}"><core?shard="shard2"?instanceDir="primary_shard2_replica1/"?name="primary_shard2_replica1"?collection="primary"/></cores></solr>同時,你還可以看另外兩個節點上的 solr.xml 文件的變化。
手動創建 Replication
下面對已經創建的初始分片進行復制。 shard1 已經在 192.168.56.123 上,我們復制分片到 192.168.56.121 和 192.168.56.122 上,執行如下命令:
$?curl?'http://192.168.56.121:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard1_replica_2&shard=shard1'$?curl?'http://192.168.56.122:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard1_replica_3&shard=shard1'最后的結果是,192.168.56.123 上的 shard1,在 192.168.56.121 節點上有1個副本,名稱為 primary_shard1_replica_2 ,在 192.168.56.122 節點上有一個副本,名稱為 primary_shard1_replica_3 。也可以通過查看 192.168.56.121 和 192.168.56.122 上的目錄變化,如下所示:
$??ll?/usr/local/solrhome/ total?16 drwxr-xr-x?3?root?root?4096?Mar?10?17:11?primary_shard1_replica2 drwxr-xr-x?3?root?root?4096?Mar?10?17:02?primary_shard2_replica1 -rw-r--r--?1?root?root??444?Mar?10?17:16?solr.xml你還可以對 shard2 和 shard3 添加副本。shard2 已經在 192.168.56.121 上,我們復制分片到 192.168.56.122 和 192.168.56.123 上,執行如下命令:
$?curl?'http://192.168.56.122:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard2_replica_2&shard=shard2'$?curl?'http://192.168.56.123:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard2_replica_3&shard=shard2'shard3 已經在 192.168.56.122 上,我們復制分片到 192.168.56.121 和 192.168.56.123 上,執行如下命令:
$?curl?'http://192.168.56.121:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard3_replica_2&shard=shard3'$?curl?'http://192.168.56.123:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard3_replica_3&shard=shard3'我們再次從 192.168.56.121 節點可以看到,SOLR 的配置文件內容,又發生了變化,如下所示:
<?xml?version="1.0"?encoding="UTF-8"??><solr?persistent="true"?sharedLib="lib"><cores?adminPath="/admin/cores"?zkClientTimeout="20000"?hostPort="${jetty.port:8080}"?hostContext="${hostContext:solr}"><core?shard="shard1"?instanceDir="primary_shard1_replica2/"?name="primary_shard1_replica_2"?collection="primary"/><core?shard="shard2"?instanceDir="primary_shard2_replica1/"?name="primary_shard2_replica_1"?collection="primary"/><core?shard="shard3"?instanceDir="primary_shard2_replica2/"?name="primary_shard2_replica_2"?collection="primary"/></cores></solr>到此為止,我們已經基于3個節點,配置完成了 SolrCloud 集群。最后效果如下:
8. 其他說明
8.1 SolrCloud 的一些必要配置
schema.xml
必須定義 _version_ 字段:
<field?name="_version_"?type="long"?indexed="true"?stored="true"?multiValued="false"/>solrconfig.xml
updateHandler 節點下需要定義 updateLog:
????<!--?Enables?a?transaction?log,?currently?used?for?real-time?get."dir"?-?the?target?directory?for?transaction?logs,?defaults?to?thesolr?data?directory.??--><updateLog><str?name="dir">${solr.data.dir:}</str><!--?if?you?want?to?take?control?of?the?synchronization?you?may?specify?the?syncLevel?as?one?of?thefollowing?where?''flush''?is?the?default.?fsync?will?reduce?throughput.<str?name="syncLevel">flush|fsync|none</str>--></updateLog>需要定義一個 replication handler,名稱為 /replication :
<requestHandler?name="/replication"?class="solr.ReplicationHandler"?startup="lazy"?/>需要定義一個 realtime get handler,名稱為/get:
<requestHandler?name="/get"?class="solr.RealTimeGetHandler"><lst?name="defaults"><str?name="omitHeader">true</str></lst></requestHandler>需要定義 admin handlers:
<requestHandler?name="/admin/"?class="solr.admin.AdminHandlers"?/>需要定義 updateRequestProcessorChain:
?<updateRequestProcessorChain?name="sample"><processor?class="solr.LogUpdateProcessorFactory"?/><processor?class="solr.DistributedUpdateProcessorFactory"/><processor?class="solr.RunUpdateProcessorFactory"?/></updateRequestProcessorChain>solr.xml
cores 節點需要定義 adminPath 屬性:
<cores?adminPath="/admin/cores"?>8.2 SolrCloud 分布式檢索時忽略宕機的 Shard
<lst?name=”error”><str?name=”msg”>no?servers?hosting?shard:</str><int?name=”code”>503</int></lst>加入下面參數,只從存活的 shards 獲取數據:
shards.tolerant=true如:http://192.168.56.121:8080/solr/primary_shard2_replica1/select?q=*%3A*&wt=xml&indent=true&shards.tolerant=true
沒有打此參數,如果集群內有掛掉的 shard,將顯示:
no?servers?hosting?shard8.3 自動創建 Collection 及初始 Shard
自動創建 Collection 及初始 Shard,不需要通過 zookeeper 手動上傳配置文件并關聯 collection。
1、在第一個節點修改 tomcat 啟動參數
JAVA_OPTS='-Djetty.port=8080?-Dsolr.solr.home=/usr/local/solrhome?-DzkHost=192.168.56.122:2181,192.168.56.122:2181,192.168.56.123:2181?-DnumShards=3?-Dbootstrap_confdir=/usr/local/solrhome/primary/conf?-Dcollection.configName=primaryconf?'然后啟動 tomcat。這個步驟上傳了集群的相關配置信息(/usr/local/solrhome/primary/conf)到 ZooKeeper 中去,所以啟動下一個節點時不用再指定配置文件了。
2、在第二個和第三個節點修改 tomcat 啟動參數
JAVA_OPTS='-Djetty.port=8080?-Dsolr.solr.home=/usr/local/solrhome?-DzkHost=192.168.56.122:2181,192.168.56.122:2181,192.168.56.123:2181?-DnumShards=3'然后啟動 tomcat。
這樣就會創建3個 shard 分別分布在三個節點上,如果你在增加一個節點,這節點會附加到一個 shard 上成為一個 replica,而不會創建新的 shard。
9. 總結
本文記錄了如何 zookeeper、SolrCloud 的安裝和配置過程,solrcore 是通過 restapi 進行手動創建,然后又對自動創建 Collection 及初始 Shard 進行了說明。
10. 參考文章
- [1] SolrCloud 4.3.1+Tomcat 7安裝配置實踐 
- [2] SolrCloud Wiki 
- [3] SolrCloud使用教程、原理介紹 
原創文章,轉載請注明: 轉載自JavaChen Blog,作者:JavaChen
本文鏈接地址:http://blog.javachen.com/2014/03/10/how-to-install-solrcloud.html
本文基于署名2.5中國大陸許可協議發布,歡迎轉載、演繹或用于商業目的,但是必須保留本文署名和文章鏈接。 ? ? ? ? ? ? ? ? ? ? ? ?如您有任何疑問或者授權方面的協商,請郵件聯系我。
轉載于:https://blog.51cto.com/dadloveu/1874900
總結
以上是生活随笔為你收集整理的linux solrcloud zookeeper分布式集群部署的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: mysql-3 检索数据(1)
- 下一篇: apache poi 解析excel
