solr-cloud介紹&基於Zookeeper部署搭建&使用
1. solrCloud基本概念
1.1 什麼是solrCloud
SolrCloud(solr 雲)是Solr提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用SolrCloud,當索引量很大,搜尋請求併發很高,這時需要使用SolrCloud來滿足這些需求。
1.2 solrCloud的結構
SolrCloud為了降低單機的處理壓力,需要由多臺伺服器共同來完成索引和搜尋任務。實現的思路是將索引資料進行Shard(分片)拆分,每個分片由多臺的伺服器共同完成,當一個索引或搜尋請求過來時會分別從不同的Shard的伺服器中操作索引。
SolrCloud需要Solr基於Zookeeper部署,Zookeeper是一個叢集管理軟體,由於SolrCloud需要由多臺伺服器組成,由zookeeper來進行協調管理。
下圖是一個SolrCloud應用的例子:
- 物理結構:
- 指定就是三臺solr伺服器(直白一點就是三個部署了solr的tomcat)
- 每個tomcat中都有兩個core(索引庫)
- 指定就是三臺solr伺服器(直白一點就是三個部署了solr的tomcat)
- 邏輯結構
- 我們把整個叢集看做了一個整體(一個大的索引庫), 在這個索引庫下有兩個分片(也就是把索引庫分成兩部分), 每一個分片都有三個節點(對應就是物理結果中各個tomcat的索引庫),其中一個為主節點,兩個備份節點
整體部署的結構圖:
1.3 solr叢集中資料的讀取及分裂流程(瞭解)
- 寫資料的流程
- 讀資料
- 副本分裂
2. zookeeper
ZooKeeper是一個分散式的,開放原始碼(apache)的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase、dubbox、kafka的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。
- zookeeper在solrCloud中的作用
- 主要用來管理solr叢集中的相關配置資訊和叢集的執行狀態, 協助solr進行主節點的選舉
準備工作
三臺虛擬機器: 安裝好 jdk1.8 64位即可
vi /etc/hosts
新增如下內容:
192.168.72.141 node01
192.168.72.142 node02
192.168.72.143 node03
注意: 新增時, 前面ip地址一定是自己的三臺linux的ip地址 切記不要搞錯了
如果虛擬機器設定過SSH,用以前的就可以
3. zookeeper叢集搭建
準備工作:
三臺虛擬機器: 安裝好 jdk1.8 64位即可
修改三臺虛擬機器的hosts檔案:
vi /etc/hosts
新增如下內容:
192.168.72.141 node01
192.168.72.142 node02
192.168.72.143 node03
注意: 新增時, 前面ip地址一定是自己的三臺linux的ip地址 切記不要搞錯了
3.1 上傳zookeeper的壓縮包(上傳其中一臺即可)
cd /export/software/
rz //此時選擇zookeeper的壓縮包進行上傳
3.2 解壓zookeeper到指定的目錄
tar -zxf zookeeper-3.4.9.tar.gz -C /export/servers/
cd /export/servers/
3.3 修改zookeeper的配置檔案
cd /export/servers/zookeeper-3.4.9/conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改後, 在配置檔案的底部, 新增如下內容
server.1=node01:2887:3887
server.2=node02:2887:3887
server.3=node03:2887:3887
伺服器相互通訊的埠,投票選舉的埠
更改後配置檔案整體內容如下:(如果擔心修改錯誤, 可以直接將zoo.cfg中的內容全部刪除, 複製以下內容即可)
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/export/data/zk
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#zookeeper叢集配置
server.1=node01:2887:3887
server.2=node02:2887:3887
server.3=node03:2887:3887
**** 處理完成後儲存退出即可
3.4 將配置好的zookeeper傳送到其他兩臺主機上
cd /export/servers/
scp -r zookeeper-3.4.9/ [email protected]:$PWD //將zookeeper複製到node02的同級目錄下
scp -r zookeeper-3.4.9/ [email protected]:$PWD //將zookeeper複製到node03的同級目錄下
執行scp指令之前,要確定node02 和node03是否有/export/servers目錄
之前設定過ssh的話,在執行scp時不用輸密碼就可連線node02 node03
傳送完成後,在其他兩臺主機檢視, 是否已經成功接收到
cd /export/servers
ll
3.5 分別在三臺主機輸入如下命令
node1:執行的命令
mkdir -p /export/data/zk
echo "1" > /export/data/zk/myid
cat /export/data/zk/myid //此命令用於檢視此檔案有沒有正確寫入 1
node2:執行的命令
mkdir -p /export/data/zk
echo "2" > /export/data/zk/myid
cat /export/data/zk/myid //此命令用於檢視此檔案有沒有正確寫入 2
node3:執行的命令
mkdir -p /export/data/zk
echo "3" > /export/data/zk/myid
cat /export/data/zk/myid //此命令用於檢視此檔案有沒有正確寫入 3
3.6 分別啟動三臺zookeeper(建議啟動順序 node1>>node2>>node3 依次啟動)
cd /export/servers/zookeeper-3.4.9/bin/
./zkServer.sh start
- node1: follower
- node2: 為leader
- node3: follower
3.7 zookeeper的選舉機制(瞭解)
- 初始化叢集: 採取投票機制, 選舉過半即為leader
1. 當第一臺(id=1),啟動後, 由於目前自有自己,故會把票投給自己
2. 當第二臺(id=2),啟動後, 由於目前已經又二臺啟動, 這時候會將票投給id最大的機器, 此時三臺中已經有二臺啟動, 數量過半, 第二臺理所應當的成為了leader
3. 當第三臺(id=3),啟動後, 雖然id=3為最大, 但是由於leader已經產生, 故只能擔任follower
- 當下一次在重新啟動時, 又會恢復選舉,此時誰的資料多, 誰為leader, 如果資料都一樣, 那麼看id誰最大,同時一般選舉過半,就會產生leader
4. solrCloud搭建
4.1 將在window中部署的單機版solr上傳到node01中
cd /export/software/
rz //選擇資料中的solr.zip進行上傳(此zip就是solr當天部署後的內容,包含solr-home和tomcat)
4.2 將zip進行解壓到指定目錄中
yum -y install unzip
unzip solr.zip
mv solr /export/servers/
4.3 修改tomcat的Catalina.sh的配置檔案
cd /export/servers/solr/apache-tomcat-7.0.77/bin
vi catalina.sh //注意此時修改的.sh的檔案 為非.bat
新增如下內容:(此處後期還會進行修改, 目前只是為了測試單機版本能否在linux中執行)
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home"
***** 新增後儲存退出即可
4.4 啟動tomcat測試單機版本能否在linux中執行
注意: 由於是解壓的是zip檔案, tomcat中的.sh檔案都沒有任何的執行缺陷, 需要進行賦許可權:
chmod 777 /export/servers/solr/apache-tomcat-7.0.77/bin/*
啟動tomcat:
cd /export/servers/solr/apache-tomcat-7.0.77/bin/
./startup.sh
**** 看到此頁面,說明單機版本配置成功
成功後:將tomcat務必關機操作
./shutdown.sh
**** 務必執行以上命令, 關閉tomcat
4.5 將solr-home中的data目錄全部清空, 只保留一個索引庫即可
cd /export/servers/solr/solr-home/
rm -rf collection2/ //刪除多餘的索引庫, 只保留一個collection1即可
rm -rf collection1/data/
4.6 將solr的配置檔案交給zookeeper進行管理
1. 需要先上傳solr的安裝包
cd /export/software/
rz
2. 解壓solr的安裝包
unzip solr-4.10.2.zip
3. 將solr安裝包複製到/export/servers下
mv solr-4.10.2 /export/servers/
4. 開始執行上傳
cd /export/servers/solr-4.10.2/example/scripts/cloud-scripts/
//注意: 以下命令是一行
./zkcli.sh -zkhost node01:2181,node02:2181,node03:2181 -cmd upconfig -confdir /export/servers/solr/solr-home/collection1/conf/ -confname solrconf
以下命令主要用於檢視zookeeper中是否存在solr的配置檔案: 可以不執行跳過
cd /export/servers/zookeeper-3.4.9/bin
./zkCli.sh
ls /configs/solrconf
4.7 修改solr.xml配置檔案
solr.xml是solr叢集管理檔案
cd /export/servers/solr/solr-home/
vi solr.xml
4.8 修改tomcat的Catalina.sh配置檔案
cd /export/servers/solr/apache-tomcat-7.0.77/bin/
vi catalina.sh
*** 修改如下內容
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home //原來的內容
//以下為替換後的內容 注意: 這是一行內容, 複製時一起復制即可
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home -DzkHost=node01:2181,node02:2181,node03:2181"
4.9 將solr目錄傳送到其他兩臺linux上(node02,node03)
cd /export/servers/
scp -r solr [email protected]:$PWD
scp -r solr [email protected]:$PWD
在其他兩臺主機上檢視, 是否接收成功:
4.10 依次啟動三臺solr即可
cd /export/servers/solr/apache-tomcat-7.0.77/bin/
./startup.sh
5. solrCloud相關的管理命令
5.1 建立新叢集(建立一個索引庫)
http://192.168.72.141:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=3&maxShardsPerNode=8&property.schema=schema.xml&property.config=solrconfig.xml
介面引數說明:
action: 表示執行的操作 CREATE 建立
name: 新叢集的名稱
numShards: 分片數
replicationFactor: 每個分片的節點數
maxShardsPerNode: 設定每個分片的最大節點數, 預設為1
property.schema: 指定使用的schema檔案 (注意, 此檔案必須在zookeeper上存在)
property.config: 指定使用的solrConfig檔案 (注意, 此檔案必須在zookeeper上存在)
5.2 刪除core命令
http://192.168.72.141:8080/solr/admin/collections?action=DELETE&name=collection1
5.3 查詢所有的Core
http://192.168.72.141:8080/solr/admin/collections?action=LIST
5.4 顯示core的狀態
http://192.168.72.141:8080/solr/admin/collections?action=DELETE&name=collection1
5.5 分裂shard(擴充套件容量)
分裂: 就是將某個分片分成兩個分片
注意: 一旦分裂後, 雖然原來的分片還可以提供服務, 但是已經不再儲存資料, 會將資料儲存到新的分裂後的分片
http://192.168.72.141:8080/solr/admin/collections?action=SPLITSHARD&collection=collection1&shard=shard1
引數說明:
shard: 指定要分裂的分片
5.6 刪除某個分片
注意: 刪除的分片必須是已經被分裂的, 或者是已經無法提供服務的
http://192.168.72.141:8080/solr/admin/collections?action=DELETESHARD&shard=shard2&collection=collection2
6. 使用java連線叢集, 完成基本的索引庫操作
6.1 匯入相關的pom依賴
<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
6.2 編寫程式碼,完成CURD
//建立索引
@Test
public void createIndexToSolrCloud() throws IOException, SolrServerException {
//1. 建立連線solrCloud的服務物件
//String zkHost: 需要傳遞zookeeper叢集的地址
String zkHost="192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181";
CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
//1.1 設定連線那個solr的索引庫
cloudSolrServer.setDefaultCollection("collection2");
//1.2 可選的引數
//設定連線zookeeper的時間
cloudSolrServer.setZkClientTimeout(5000);
//設定獲取和solr的連線的時間
cloudSolrServer.setZkConnectTimeout(5000);
//3. 執行獲取連線
cloudSolrServer.connect();
//4. 新增索引操作
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id","1");
doc.addField("title","你好,solrCloud");
cloudSolrServer.add(doc);
//5. 執行提交
cloudSolrServer.commit();
}
//刪除索引
@Test
public void deleteIndexToSolrCloud() throws IOException, SolrServerException {
//1. 建立連線solrCloud的服務物件
//String zkHost: 需要傳遞zookeeper叢集的地址
String zkHost="192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181";
CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
//1.1 設定連線那個solr的索引庫
cloudSolrServer.setDefaultCollection("collection2");
//1.2 可選的引數
//設定連線zookeeper的時間
cloudSolrServer.setZkClientTimeout(5000);
//設定獲取和solr的連線的時間
cloudSolrServer.setZkConnectTimeout(5000);
//3. 執行獲取連線
cloudSolrServer.connect();
//4. 新增索引操作
cloudSolrServer.deleteById("1");
//5. 執行提交
cloudSolrServer.commit();
}
//查詢索引
@Test
public void queryIndexToSolrCloud() throws IOException, SolrServerException {
//1. 建立連線solrCloud的服務物件
//String zkHost: 需要傳遞zookeeper叢集的地址
String zkHost="192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181";
CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
//1.1 設定連線那個solr的索引庫
cloudSolrServer.setDefaultCollection("collection2");
//1.2 可選的引數
//設定連線zookeeper的時間
cloudSolrServer.setZkClientTimeout(5000);
//設定獲取和solr的連線的時間
cloudSolrServer.setZkConnectTimeout(5000);
//3. 執行獲取連線
cloudSolrServer.connect();
//4. 新增索引操作
SolrQuery query = new SolrQuery("*:*");
QueryResponse response = cloudSolrServer.query(query);
SolrDocumentList documentList = response.getResults();
for (SolrDocument doc : documentList) {
Object id = doc.get("id");
Object title = doc.get("title");
System.out.println(id+" "+title);
}
}