<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    http://www.cnblogs.com/phinecos/archive/2012/02/15/2353007.html

      上一篇介紹了SolrCloud的基本概念,從這一篇開始我將深入到其實現代碼中進行剖析。

    SolrCloud最重要的一點就是引入了ZooKeeper來統一管理各種配置和狀態信息。zookeeper是一個開源分布式的服務,它提供了分布式協作,分布式同步,配置管理等功能. 其實現的功能與googlechubby基本一致.zookeeper的官方網站已經寫了一篇非常經典的概述性文章,請大家參閱:ZooKeeper: A Distributed Coordination Service for Distributed Applications.

            上一篇的示例中是在啟動每個solr服務器前,內嵌啟動了一個Zookeeper服務器,再將這幾臺Zookeeper服務器組成一個集群,確保Solr集群信息的高可用性和容錯性。

          構建一個可用的Zookeeper集群,這就是SolrCloud要做的第一件工作。下面來看下SolrCloud是如何實現這一功能的:

    1) 首先在web.xml中配置了一個filter

    <filter>
        <filter-name>SolrRequestFilter</filter-name>
        <filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class>
          </filter>

       web容器啟動時會去加載并初始化SolrDispatchFilter這個filter,它的init方法會被調用,這個方法中做的最主要的事情是初始化一個Solr核容器。

      CoreContainer.Initializer init = createInitializer();
        // web.xml configuration
        this.pathPrefix = config.getInitParameter( "path-prefix" );
    this.cores = init.initialize();

     2) 初始化Solr核容器時,首先找到solr的根目錄,這個目錄下最重要的是solr.xml這個配置文件,這個配置文件用于初始化容器中加載的各個solr核,如果沒有提供solr.xml,則會啟用默認的配置信息:

      private static final String DEF_SOLR_XML ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
              "<solr persistent=\"false\">\n" +
              "  <cores adminPath=\"/admin/cores\" defaultCoreName=\"" + DEFAULT_DEFAULT_CORE_NAME + "\">\n" +
              "    <core name=\""+ DEFAULT_DEFAULT_CORE_NAME + "\" shard=\"${shard:}\" instanceDir=\".\" />\n" +
              "  </cores>\n" +
              "</solr>";

      3) 初始化過程的其中一步就是初始化Zookeeper服務器,你可以選擇單機的Zookeeper服務器,也可以構建Zookeeper集群,下面以集群為例進行代碼分析。

    復制代碼
        if (zkRun != null) {
          zkServer = new SolrZkServer(zkRun, zookeeperHost, solrHome, hostPort);
          zkServer.parseConfig();
          zkServer.start();
          
          // set client from server config if not already set
          if (zookeeperHost == null) {
            zookeeperHost = zkServer.getClientString();
          }
    }
    復制代碼

             SolrZkServer類就是伴隨solr啟動的內嵌的Zookeeper服務器,首先來看parseConfig方法,它負責解析zoo.cfg文件,讀取Zookeeper啟動時所需要的配置信息,這些配置信息由SolrZkServerProps類表示,

    首先設置Zookeeper存儲數據的目錄

    復制代碼
        if (zkProps == null) {
          zkProps = new SolrZkServerProps();
          // set default data dir
          
    // TODO: use something based on IP+port???  support ensemble all from same solr home?
          zkProps.setDataDir(solrHome + '/' + "zoo_data");
          zkProps.zkRun = zkRun;
          zkProps.solrPort = solrPort;
    }
    復制代碼

    然后讀取zoo.cfg配置文件中的信息,為啟動zookeeper服務器提供完整的配置信息,

          props = SolrZkServerProps.getProperties(solrHome + '/' + "zoo.cfg");
          SolrZkServerProps.injectServers(props, zkRun, zkHost);
          zkProps.parseProperties(props);

        下面是一個示例配置文件:

    tickTime=2000
    dataDir=/var/zookeeper/
    clientPort=2181
    initLimit=5
    syncLimit=2
    server.1=zoo1:2888:3888
    server.2=zoo2:2888:3888
    server.3=zoo3:2888:3888

    注意,server.x這些行就指明了zookeeper集群所包含的機器名稱,每臺Zookeeper服務器會使用3個端口來進行工作,其中第一個端口(端口1)用來做運行期間server間的通信,第二個端口(端口2)用來做leader election,另外還有一個端口(端口0)負責接收客戶端請求。那么一臺機器怎樣確定自己是誰呢?這是通過dataDir目錄下的myid文本文件確定。myid文件只包含一個數字,內容就是所在ServerIDQuorumPeerConfig.myid

    1) 準備好集群所需要的配置信息后,就可以啟動Zookeeper集群了。啟動時是生成一個Zookeeper服務器線程,根據配置信息來決定是單機還是集群模式,如果是單機模式,則生成ZooKeeperServerMain對象并啟動,如果是集群模式,則使用QuorumPeerMain對象啟動。最后將服務器線程設置為Daemon模式,就完成了Zookeeper服務器的啟動工作了。

    復制代碼
        public void start() {
            zkThread = new Thread() {
                @Override
                public void run() {
                    try {
                        if (zkProps.getServers().size() > 1) {//zk集群
                            QuorumPeerMain zkServer = new QuorumPeerMain();
                            zkServer.runFromConfig(zkProps);
                            if (logger.isInfoEnabled()) {
                                logger.info("啟動zk服務器集群成功");
                            }
                        } else {//單機zk
                            ServerConfig sc = new ServerConfig();
                            sc.readFrom(zkProps);
                            ZooKeeperServerMain zkServer = new ZooKeeperServerMain();
                            zkServer.runFromConfig(sc);
                            if (logger.isInfoEnabled()) {
                                logger.info("啟動單機zk服務器成功");
                            }
                        }
                        logger.info("ZooKeeper Server exited.");
                    } catch (Throwable e) {
                        logger.error("ZooKeeper Server ERROR", e);
                        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);                    
                    }
                }
            };
            if (zkProps.getServers().size() > 1) {
                logger.info("STARTING EMBEDDED ENSEMBLE ZOOKEEPER SERVER at port " + zkProps.getClientPortAddress().getPort());
            } else {
                logger.info("STARTING EMBEDDED STANDALONE ZOOKEEPER SERVER at port " + zkProps.getClientPortAddress().getPort());            
            }
            
            zkThread.setDaemon(true);
            zkThread.start();
            try {
                Thread.sleep(500); // pause for ZooKeeper to start
            } catch (Exception e) {
                logger.error("STARTING ZOOKEEPER", e);
            }
        }
    復制代碼

    為了驗證集群是否啟動成功,可以使用Zookeeper提供的命令行工具進行驗證,進入bin目錄下,運行:

    zkCli.cmd –server zookeeper服務器地址1:端口

        這是連接到集群中1Zookeeper服務器,然后創建一個ZNode,往其中加入一些數據,你再連接到集群中其他的服務器上,查看數據是否一致,即可知道Zookeeper集群是否已經構建成功。

    posted on 2012-07-04 18:40 SIMONE 閱讀(3487) 評論(0)  編輯  收藏 所屬分類: solr
    主站蜘蛛池模板: 亚洲成a人片在线观看国产| 阿v视频免费在线观看| 亚洲午夜久久久影院| 免费理论片51人人看电影| 一区二区三区福利视频免费观看| 精品女同一区二区三区免费播放| 亚洲人成电影网站| 亚洲ⅴ国产v天堂a无码二区| 美腿丝袜亚洲综合| 亚洲AV之男人的天堂| 日韩成全视频观看免费观看高清| 成年黄网站色大免费全看| 无码国产精品一区二区免费3p| 三上悠亚在线观看免费| 一级特黄a免费大片| 美美女高清毛片视频黄的一免费| 亚洲日韩一区精品射精| ASS亚洲熟妇毛茸茸PICS| 亚洲成人在线免费观看| 亚洲美女大bbbbbbbbb| 99亚洲精品高清一二区| 亚洲精品免费在线观看| 亚洲福利视频导航| 亚洲av色福利天堂| 亚洲嫩模在线观看| 18亚洲男同志videos网站| 亚洲人成亚洲精品| 亚洲欧洲日韩综合| 亚洲av无码电影网| 亚洲精品综合在线影院| 亚洲丰满熟女一区二区哦| 亚洲av纯肉无码精品动漫| 精品亚洲福利一区二区| 亚洲成在人线在线播放无码| 国产精品免费精品自在线观看| 青青青国产手机频在线免费观看| 国产线视频精品免费观看视频| 亚欧国产一级在线免费| 中文字幕手机在线免费看电影| 中文在线日本免费永久18近| 免费无码一区二区三区蜜桃|