深入剖析SolrCloud(二)

2021-09-01 04:10:23 字數 2610 閱讀 4257

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

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

solrrequestfilter

org.apache.solr.servlet.solrdispatchfilter

在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" +

"\n" +

" \n" +

" \n" +

" \n" +

"";

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

if (zkrun != null) 

}

solrzkserver類就是伴隨solr啟動的內嵌的zookeeper伺服器,首先來看parseconfig方法,它負責解析zoo.cfg檔案,讀取zookeeper啟動時所需要的配置資訊,這些配置資訊由solrzkserverprops類表示,

首先設定zookeeper儲存資料的目錄

if (zkprops == null)
然後讀取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檔案只包含乙個數字,內容就是所在server的id:quorumpeerconfig.myid。

1) 準備好集群所需要的配置資訊後,就可以啟動zookeeper集群了。啟動時是生成乙個zookeeper伺服器執行緒,根據配置資訊來決定是單機還是集群模式,如果是單機模式,則生成zookeeperservermain物件並啟動,如果是集群模式,則使用quorumpeermain物件啟動。最後將伺服器執行緒設定為daemon模式,就完成了zookeeper伺服器的啟動工作了。

public void start() 

} else

}logger.info("zookeeper server exited.");

} catch (throwable e) }};

if (zkprops.getservers().size() > 1) else

zkthread.setdaemon(true);

zkthread.start();

try catch (exception e)

}

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

zkcli.cmd –server zookeeper伺服器位址1:埠
這是連線到集群中1臺zookeeper伺服器,然後建立乙個znode,往其中加入一些資料,你再連線到集群中其他的伺服器上,檢視資料是否一致,即可知道zookeeper集群是否已經構建成功。

出處:    

PGA深入剖析

pga pga系統全域性區 program global area 程序全域性區 process global area pga是乙個記憶體區域,該區域包含了一些與某個特定伺服器程序相關的資料和控制資訊,每個程序都有自己的私有pga區,所以這塊區域只能被其所屬程序進入,而不能被其他程序訪問,所以在p...

epoll LT ET 深入剖析

epoll lt et 深入剖析 epoll事件有兩種模型 level triggered lt 水平觸發 socket接收緩衝區不為空 有資料可讀 讀事件一直觸發 socket傳送緩衝區不滿 可以繼續寫入資料 寫事件一直觸發 符合思維習慣,epoll wait返回的事件就是socket的狀態 ed...

深入剖析printf

printf主要是給控制台列印字串或者數字等。1 printf的引數列表printf const char format,2 printf首先呼叫va start.然後呼叫 output l,最後呼叫 ftbuf 3 output l會解析字串並呼叫va arg,獲取省略號的值,呼叫write st...