1. 程式人生 > >solr-cloud介紹&基於Zookeeper部署搭建&使用

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應用的例子:

SolrCloud

  • 物理結構:
    • 指定就是三臺solr伺服器(直白一點就是三個部署了solr的tomcat)
      • 每個tomcat中都有兩個core(索引庫)
  • 邏輯結構
    • 我們把整個叢集看做了一個整體(一個大的索引庫), 在這個索引庫下有兩個分片(也就是把索引庫分成兩部分), 每一個分片都有三個節點(對應就是物理結果中各個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

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);
        }

    }