什麼是 ZooKeeper ?
ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,它是叢集的管理者,監視著叢集中各個節點的狀態根據節點提交的反饋進行下一步合理操作。
ZooKeeper 功能
-
叢集管理 主從的管理、負載均衡、高可用的管理。叢集的入口。Zookeeper必須是叢集才能保證高可用。Zookeeper有選舉和投票的機制。叢集中至少應該有三個節點。
-
配置檔案集中管理 搭建solr叢集時,需要把Solr的配置檔案上傳zookeeper,讓zookeeper統一管理。每個節點都到zookeeper上取配置檔案。
叢集配置
- zookeeper 3 臺
- solr 4 臺
叢集搭建
搭建 zookeeper 叢集
-
下載 ZooKeeper
-
上傳 ZooKeeper 到伺服器(sftp 或 lrzsz 工具)
-
將 ZooKeeper 解壓
-
把 zookeeper 向 /usr/local/solr-cloud 下複製三份,分別命名為 zookeeper01、zookeeper02、zookeeper03。
-
配置 zookeeper。
-
在 zookeeper01 目錄下建立一個 data 資料夾
-
在 data 目錄下建立一個 myid 檔案
-
myid 的內容 為 1。(02 對應 “2”,03 對應 “3”)。
-
zookeeper02、03 以此類推。
-
進入 conf ,將 zoo_sample.cfg 更名為 zoo.cfg。
-
修改 zoo.cfg
- 將 dataDir= 指定為剛建立的資料夾。
- clientPort 指定為不衝突的埠號(01:2181,02:2182,03:2183)
- 新增如下內容:
server.1=192.168.126.128: 2881:3881 server.2=192.168.126.128: 2882:3882 server.3=192.168.126.128: 2883:3883 複製程式碼
-
-
啟動 zookeeper 使用 zookeeper 目錄中 bin 目錄下的 zkServer.sh,分別啟動三個 zookeeper。 啟動: ./zkServer.sh start 停止:./zkServer.sh stop 檢視狀態 ./zkServer.sh status
搭建 solr 叢集
-
安裝4個 tomcat,編輯 server.xml,修改埠 8081-8084。
-
向 tomcat 部署 solr。(細節可參考之前的部落格)
-
為每一個 solr 例項建立 solrhome。
-
編輯 web.xml ,將每個 solr 例項和對應的 solrhome 關聯
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solr-cloud/solrhome1</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
複製程式碼
- 編輯每個 solrhome 下 solr.xml,指定對應 host 和 port
<solrcloud>
<str name="host">${host:192.168.126.128}</str>
<int name="hostPort">${jetty.port:8081}</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
複製程式碼
- 上傳配置檔案到 zookeeper. 需要使用/root/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh命令上傳配置檔案。(其他 solrhome 的配置檔案也可以。)
./zkcli.sh -zkhost 192.168.126.128:2181,192.168.126.128:2182,192.168.126.128:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome1/collection1/conf -confname myconf
複製程式碼
- 檢視是否上傳成功 使用 zookeeper bin 目錄下的 zkCli.sh 命令。
./zkCli.sh #即可連線上 zookeeper 叢集
複製程式碼
然後就可以檢視叢集上檔案
- 告訴 solr 例項 zookeeper 的位置。需要編輯 tomcat catalina.sh,新增:
JAVA_OPTS="-DzkHost=192.168.126.128:2181,192.168.126.128:2182,192.168.126.128:2183"
複製程式碼
每個節點都要新增。
-
分別啟動每個 solr 例項
-
叢集分片 將叢集分為兩片,每片兩個副本。在瀏覽器位址列訪問:
http://192.168.126.128:8081/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
複製程式碼
得到如下結果,則分片成功。
重新整理 solr cloud 頁面。
- 刪除不用的 collection1.
http://192.168.126.128:8081/solr/admin/collections?action=DELETE&name=collection1
複製程式碼
使用 Solrj 連線叢集
@Test
public void testSolrClout() throws Exception {
//建立一個SolrServer物件
CloudSolrServer solrServer = new CloudSolrServer("192.168.126.128:2181,192.168.126.128:2182,192.168.126.128:2183");
//設定預設的collection
solrServer.setDefaultCollection("collection2");
//建立一個文件物件
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "test01");
document.addField("item_title", "title1");
//新增文件
solrServer.add(document);
//提交
solrServer.commit();
}
複製程式碼
Spring 中切換到叢集
<bean id ="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg name="zkHost" value="192.168.126.128:2181,192.168.126.128:2182,192.168.126.128:2183"/>
<property name="defaultCollection" value="collection2"/>
</bean>
複製程式碼