SolrCloud+tomcat7+zookeeper集羣配

solrCloud的主要功能:

主要功能包括強大的全文搜索,點擊顯示,面搜索,動態聚類,數據庫集成,豐富的文件(如Word,PDF)處理,和空間搜索,並且他具備高度的可擴展性,提供容錯的分佈式搜索和索引。java

1)集中式的配置信息
    
         2)自動容錯
    
         3)近實時搜索
    
         4)查詢時自動負載均衡

圖1. Collection大體結構圖
web

![osjp-vertx-fig1-thumb-100159570-orig](http://7xvmgi.com1.z0.glb.clouddn.com/1.png)<br>
一、下載https://zookeeper.apache.org/ 
    二、下載http://lucene.apache.org/solr/
    三、下載http://tomcat.apache.org/

下面我就開始學習之旅:

首先複製三個tomcat例如:
tomcat-server_1  端口:8080  
tomcat-server_2  端口:8090  
tomcat-server_3  端口:8100

1、在分別複製solr-4.7.0下面的example/webapps的solr.war解壓複製到tomcat-server_一、tomcat-server_二、tomcat-server_3的webapp下面爲solr,分別建立三個文件夾分別爲solr_home_一、solr_home_二、solr_home_3做爲存放solr的數據。將solr-4.7.0下面example/solr/分別複製到solr_home_一、solr_home_二、solr_home_3下面。

圖2:
數據庫

![osjp-vertx-fig1-thumb-100159570-orig](http://7xvmgi.com1.z0.glb.clouddn.com/2.png)<br>

2、分別修改solr_home_一、solr_home_二、solr_home_3下面的solr.xml。apache

<solr>
            <solrcloud>
            <str name="host">${host:}</str>
            <int name="hostPort">${jetty.port:8080}</int>//端口分別對應tomcat的端口
            <str name="hostContext">${hostContext:solr}</str>
            <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
            <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
            </solrcloud>
          <shardHandlerFactory name="shardHandlerFactory"
            class="HttpShardHandlerFactory">
          <int name="socketTimeout">${socketTimeout:0}</int>
          <int name="connTimeout">${connTimeout:0}</int>
          </shardHandlerFactory>
    </solr>
    其餘solr.xml同理。

3、分別進入tomcat-server_一、tomcat-server_二、tomcat-server_3 下面的webapp下面的solr,而後去改WEB-INF下的web.xml,分別爲下面的清單:bootstrap

<env-entry>
               <env-entry-name>solr/home</env-entry-name>
               <env-entry-value>D:/solrCloud/solr_home_1</env-entry-value>//定義solr索引所存的地址
               <env-entry-type>java.lang.String</env-entry-type>
        </env-entry>
    
        <env-entry>
               <env-entry-name>solr/home</env-entry-name>
               <env-entry-value>D:/solrCloud/solr_home_2</env-entry-value>//定義solr索引所存的地址
               <env-entry-type>java.lang.String</env-entry-type>
        </env-entry>   

        <env-entry>
               <env-entry-name>solr/home</env-entry-name>
               <env-entry-value>D:/solrCloud/solr_home_3</env-entry-value>//定義solr索引所存的地址
               <env-entry-type>java.lang.String</env-entry-type>
        </env-entry>

4、分別在tomcat-server_一、tomcat-server_二、tomcat-server_3的bin下面的catalina.bat的添加tomcat

set java_opts=-Dsolr.home=d:/solrCloud/solr_home_1 -Dbootstrap_confdir=D:/solrCloud/solr_home_1/collection1/conf -Dcollection.configName=myconf -DnumShards=2 -DzkHost=127.0.0.1:2181
    set JAVA_OPTS=-Dsolr.home=d:/solrCloud/solr_home_2 -DzkHost=127.0.0.1:2181
    set JAVA_OPTS=-Dsolr.home=d:/solrCloud/solr_home_3 -DzkHost=127.0.0.1:2181

5、複製三個zoo例如:服務器

zk-server_1  端口:2181
        zk-server_2  端口:2182
        zk-server_3  端口:2183
        在zk-server_一、zk-server_二、zk-server_3下面分別創建兩個文件夾爲data和logs用來存儲數據和日誌。
        分別再data目錄下面建立myid,裏面分別寫一、二、3。
        配置D:\solrCloud\zk-server_1\conf\zoo.cfg以下:
        dataDir=D:/solrCloud/zk-server_1/data
        dataLogDir=D:/solrCloud/zk-server_1/logs
        clientPort=2181
        server.1=127.0.0.1:2888:3888
        server.2=127.0.0.1:2889:3889
        server.3=127.0.0.1:2890:3890
        其餘兩個配置如同上面配置。

圖3:
微信

![osjp-vertx-fig1-thumb-100159570-orig](http://7xvmgi.com1.z0.glb.clouddn.com/3.png)<br>

下面咱們啓動zk_server一、zk_server二、zk_server3.以下圖:

圖4:
app

![osjp-vertx-fig1-thumb-100159570-orig](http://7xvmgi.com1.z0.glb.clouddn.com/4.jpeg)<br>
啓動時,第一個報錯是由於找不到其餘兩個zk,纔會報錯。這都是沒關係的,三個啓動好了就不會報錯了。
<br>
下面咱們在啓動tomcat-server_一、tomcat-server_二、tomcat-server_3。
<br>

圖5:
負載均衡

![osjp-vertx-fig1-thumb-100159570-orig](http://7xvmgi.com1.z0.glb.clouddn.com/5.jpeg)

圖6:

![osjp-vertx-fig1-thumb-100159570-orig](http://7xvmgi.com1.z0.glb.clouddn.com/6.png)

建立

http://127.0.0.1:8080/solr/admin/collections?action=CREATE&name=collection1&numShards=3&replicationFactor=2&maxShardsPerNode=2&collection.configName=myconf

從新加載接口

http://127.0.0.1:8080/solr/admin/collections?action=RELOAD&name=collection1

刪除

http://127.0.0.1:8080s/solr/admin/collections?action=DELETE&name=collection1



清單1. SolrCloud.java

import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Map;
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.SolrServer;
    import org.apache.solr.client.solrj.SolrServerException;
    import org.apache.solr.client.solrj.impl.CloudSolrServer;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrDocument;
    import org.apache.solr.common.SolrDocumentList;
    import org.apache.solr.common.SolrInputDocument;
    public class SolrCloud {
            private static CloudSolrServer cloudSolrServer;
            private static synchronized CloudSolrServer getCloudSolrServer(final String zkHost) {
            if (cloudSolrServer == null) {
                try {
                        cloudSolrServer = new CloudSolrServer(zkHost);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }

        return cloudSolrServer;
    }
    //添加索引
    private void addIndex(SolrServer solrServer) {
        try {
            SolrInputDocument doc1 = new SolrInputDocument();
            doc1.addField("id", "421245251215121452521251");
            doc1.addField("title", "張三");
            SolrInputDocument doc2 = new SolrInputDocument();
            doc2.addField("id", "4224558524254245848524243");
            doc2.addField("title", "李四");

            SolrInputDocument doc3 = new SolrInputDocument();
            doc3.addField("id", "4543543458643541324153453");
            doc3.addField("title", "王五");

            Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
            docs.add(doc1);
            docs.add(doc2);
            docs.add(doc3);

            solrServer.add(docs);
            solrServer.commit();

        } catch (SolrServerException e) {
            System.out.println("Add docs Exception !!!");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!!");
            e.printStackTrace();
        }

    }
   // 搜索
    public void search(SolrServer solrServer, String String) {
        SolrQuery query = new SolrQuery();
        query.setQuery(String);
        try {
            QueryResponse response = solrServer.query(query);
            SolrDocumentList docs = response.getResults();
            for (SolrDocument doc : docs) {
                for (Map.Entry<String, Object> entry : doc) {
                    System.out.println(entry.getKey()+"="+entry.getValue());
                } 
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!");
            e.printStackTrace();
        }
    }
    //刪除
    public void deleteAllIndex(SolrServer solrServer) {
        try {
            solrServer.deleteByQuery("*:*");// delete everything!
            solrServer.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknowned Exception !!!!");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        final String zkHost = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
        final String defaultCollection = "collection1";
        final int zkClientTimeout = 20000;
        final int zkConnectTimeout = 1000;

        CloudSolrServer cloudSolrServer = getCloudSolrServer(zkHost);
        System.out.println("The Cloud SolrServer Instance has benn created!");
        cloudSolrServer.setDefaultCollection(defaultCollection);
        cloudSolrServer.setZkClientTimeout(zkClientTimeout);
        cloudSolrServer.setZkConnectTimeout(zkConnectTimeout);
        cloudSolrServer.connect();
        System.out.println("The cloud Server has been connected !!!!");
        SolrCloud test = new SolrCloud();
         test.addIndex(cloudSolrServer);
         test.search(cloudSolrServer, "id:*");
         test.deleteAllIndex(cloudSolrServer);
         test.search(cloudSolrServer, "id:*");
         System.out.println("hashCode"+test.hashCode());
         cloudSolrServer.shutdown();
    }
}

相關閱讀

使用Vert.x構建Web服務器和消息系統

RABBITMQ在分佈式系統的應用


做者信息
做者系力譜宿雲 LeapCloud 團隊_雲服務研發成員:JinYang Zhang
首發地址:https://blog.maxleap.cn/archives/977

歡迎關注微信訂閱號:從移動到雲端(MaxLeap - 讓移動開發更快速 )

歡迎加入咱們的力譜宿雲 LeapCloud 活動QQ羣:555973817,咱們將不按期作技術分享活動。如有轉載須要,請轉發時注意自帶做者信息一欄並本自媒體公號:力譜宿雲 LeapCloud,尊重原創做者的勞動成果~ 謝謝配合~

相關文章
相關標籤/搜索