ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,它是集羣的管理者,監視着集羣中各個節點的狀態根據節點提交的反饋進行下一步合理操做。java
集羣管理 主從的管理、負載均衡、高可用的管理。集羣的入口。Zookeeper必須是集羣才能保證高可用。Zookeeper有選舉和投票的機制。集羣中至少應該有三個節點。web
配置文件集中管理 搭建solr集羣時,須要把Solr的配置文件上傳zookeeper,讓zookeeper統一管理。每一個節點都到zookeeper上取配置文件。shell
下載 ZooKeeperapache
上傳 ZooKeeper 到服務器(sftp 或 lrzsz 工具)瀏覽器
將 ZooKeeper 解壓tomcat
把 zookeeper 向 /usr/local/solr-cloud 下複製三份,分別命名爲 zookeeper0一、zookeeper0二、zookeeper03。bash
配置 zookeeper。服務器
在 zookeeper01 目錄下建立一個 data 文件夾負載均衡
在 data 目錄下建立一個 myid 文件分佈式
myid 的內容 爲 1。(02 對應 「2」,03 對應 「3」)。
zookeeper0二、03 以此類推。
進入 conf ,將 zoo_sample.cfg 改名爲 zoo.cfg。
修改 zoo.cfg
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
安裝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>
複製代碼
<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>
複製代碼
./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
複製代碼
./zkCli.sh #便可鏈接上 zookeeper 集羣
複製代碼
而後就能夠查看集羣上文件
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 頁面。
http://192.168.126.128:8081/solr/admin/collections?action=DELETE&name=collection1
複製代碼
@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();
}
複製代碼
<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>
複製代碼