Solr4.8.0源碼分析(25)之SolrCloud的Split流程

來源:互聯網
上載者:User

標籤: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還是繼續保留並對外提供服務的)。除了上述命令,還有以下幾個配置參數:

  • path,path是指core0索引最後切分好後存放的路徑,它支援多個,比如cores?action=SPLIT&core=core0&path=path1&path=path2。
  • targetCore,就是將core0索引切分好後放入targetCore中(targetCore必須已經建立),它同樣支援多個,請注意path和targetCore兩個參數必須至少存在一個。
  • split.key, 根據該key進行切分,預設為unique_id.

  • ranges, 雜湊區間,預設按切分個數進行均分。
  • 由此可見Core的Split api是較底層的借口,它可以實現將一個core分成任意數量的索引(或者core)。

      接下來我們來瞭解下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流程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.