標籤:style blog http io ar color os sp for
Solr4.8.0源碼分析(25)之SolrCloud的Split流程(一)
題記:昨天有位網友問我SolrCloud的split的機制是如何的,這個還真不知道,所以今天抽空去看了Split的原理,大致也瞭解split的原理了,所以也就有了這篇文章。本系列有兩篇文章,第一篇為core split,第二篇為collection split。
1. 簡介
這裡首先需要介紹一個比較容易混淆的概念,其實Solr的HTTP API 和 SolrCloud的HTTP API是不一樣,如果接受到的是Solr的HTTP API,比如"http://localhost:8983/solr/admin/cores?action=SPLIT&core=core0&targetCore=core1&targetCore=core2",該方法對應的是CoreAdminHandler 。而"http://localhost:8983/solr/admin/collections?action=SPLITSHARD&collection=core0&shard=shard1",該方法對應的是CollectionsHandler.所以發送不同的HTTP 命令效果是不一樣的。兩個命令的代碼分支是在以下SolrDispatchFilter中形成的:
1 // Check for the core admin page 2 if( path.equals( cores.getAdminPath() ) ) { 3 handler = cores.getMultiCoreHandler(); 4 solrReq = SolrRequestParsers.DEFAULT.parse(null,path, req); 5 handleAdminRequest(req, response, handler, solrReq); 6 return; 7 } 8 boolean usingAliases = false; 9 List<String> collectionsList = null;10 // Check for the core admin collections url11 if( path.equals( "/admin/collections" ) ) {12 handler = cores.getCollectionsHandler();13 solrReq = SolrRequestParsers.DEFAULT.parse(null,path, req);14 handleAdminRequest(req, response, handler, solrReq);15 return;16 }2. Core的Split
講過了core api 和collection的api,那麼我們開始來講core的split。core的split命令在第一小節中已經講到,如下所示:"cores?action=SPLIT&core=core0&targetCore=core1&targetCore=core2" ,以上命令的意思是將core0切分成core1和core2(core0還是繼續保留並對外提供服務的)。除了上述命令,還有以下幾個配置參數:
接下來我們來瞭解下Core的Split的源碼,流程圖如下:
由於代碼較多,這裡就不貼出來了,可以查看SolrIndexSplitter.java和CoreAdminHandle.java,DirectUpdateHandle2.java對照著比較下,剩下的要補充幾點:
1. Core Split是底層的實現介面,它在進行Split的時候不會去對原core的資料進行任何操作,所以即使過程中出現任何問題都不會影響原資料,且在split過程中原core一直在服務的。
2. Core Split可以實現一個core split為多個core,它即支援單機模式下的split也支援叢集模式下對一個shard進行split,Collection的split底層就是調用該介面的。
3. 流程圖中我分成了三列,分別對應三個步驟:
- 解析split請求(最左),主要是確立好hash區間。
- 對Segment中的docs進行切分(中間),切分好的資料是存放在FixedBitSet裡面,FixedBitSet是Solr存放的doc id的集合,通過特定的格式進行儲存,這在後文中將會具體介紹。
- 將切分好的資料addindex到新的core或者path下,addIndex本質上是進行merge。但是在進行addIndex時候需要注意,addindex傳入多少個segment它就會將這些Segment合并成一個Segment,所以如果一下子傳入大量的Segment,最後會合并成一個很大的segment,這過程中符合很大。而Split中是每一次傳入一個Segment,這樣的結果就是出現很多個較小的Segment。
- 最後Split是按新的core或者path依次來的,split完成之後並不會立馬就可見,需要人為的進行一下reload操作。
總結:
本文介紹了Core Split的流程以及原理,為Collection Split的介紹做了個奠基。
Solr4.8.0源碼分析(25)之SolrCloud的Split流程