Solr4.8.0源码分析(25)之SolrCloud的Split流程
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中形成的:
// Check for the core admin page
if( path.equals( cores.getAdminPath() ) ) {
handler = cores.getMultiCoreHandler();
solrReq = SolrRequestParsers.DEFAULT.parse(null,path, req);
handleAdminRequest(req, response, handler, solrReq);
return;
}
boolean usingAliases = false;
List<String> collectionsList = null;
// Check for the core admin collections url
if( path.equals( "/admin/collections" ) ) {
handler = cores.getCollectionsHandler();
solrReq = SolrRequestParsers.DEFAULT.parse(null,path, req);
handleAdminRequest(req, response, handler, solrReq);
return;
}
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流程的更多相关文章
- Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)
Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...
- Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)
Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...
- Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三)
Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及P ...
- Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二)
Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二) 题记: 前文<Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)>中提 ...
- Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)
Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一) 题记: 我们在使用SolrCloud中会经常发现会有备份的shard出现状态Recoverying,这就表明Solr ...
- Solr4.8.0源码分析(14)之SolrCloud索引深入(1)
Solr4.8.0源码分析(14) 之 SolrCloud索引深入(1) 上一章节<Solr In Action 笔记(4) 之 SolrCloud分布式索引基础>简要学习了SolrClo ...
- Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2)
Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2) 上一节主要介绍了SolrCloud分布式索引的整体流程图以及索引链的实现,那么本节开始将分别介绍三个索引过程即LogUpdat ...
- Solr4.8.0源码分析(17)之SolrCloud索引深入(4)
Solr4.8.0源码分析(17)之SolrCloud索引深入(4) 前面几节以add为例已经介绍了solrcloud索引链建索引的三步过程,delete以及deletebyquery跟add过程大同 ...
- Solr4.8.0源码分析(16)之SolrCloud索引深入(3)
Solr4.8.0源码分析(16)之SolrCloud索引深入(3) 前面两节学习了SolrCloud索引过程以及索引链的前两步,LogUpdateProcessorFactory和Distribut ...
随机推荐
- Scrapy的shell命令(转)
scrapy python MrZONT 2015年08月29日发布 ...
- 初识phaser框架——开源的HTML5 2D游戏开发框架
背景: 在网上看到,65行实现flappy bird,感到很好奇.原来是使用开源的2D游戏框架 phaser开发的. 什么是phaser2D游戏开发框架呢? 借鉴与网上的资料: 1. Phase ...
- 数据库中存储日期的字段类型究竟应该用varchar还是datetime ?
背景: 前段时间在百度经验看到一篇文章<如何在电脑右下角显示你(爱人)的名字>,之前也听过这个小技巧,但没真正动手设置过.所以出于好奇就实践了一下. 设置完成后的效果例如以下.右下角的时间 ...
- [PWA] Enable Push Notification in your web app
1. Clone the project: git clone https://github.com/GoogleChrome/push-notifications.git 2. install th ...
- iOS View的Frame和bounds之区别,setbounds使用(深入探究)
前言: 在ios开发中经常遇到两个词Frame和bounds,本文主要阐述Frame和bound的区别,尤其是bound很绕,较难理解. 一.首先,看一下公认的资料: 先看到下面的代码你肯定就明白了一 ...
- Xcode6 viewDidLoad 中View的subviews 为空
Xcode 6 中勾选using size Classes 方法,在ViewDidLoad 方法中调用outlet 的一个myView.subviews 会为空,而myView 不会为空. stor ...
- CentOS修改主机名hostname
方法一:即时生效,重启后失效 hostname 新主机名 方法二:永久生效 1.修改/etc/hosts vim /etc/hosts 127.0.0.1 localhost 新主机名 2.修改/et ...
- ASP.NET 微信支付
一.在支付前期,我们需要获取用户的OpenId,此块内容只针对于JSAPI(微信中直接支付)才需要,如果生成二维码(NATIVE)扫描支付,请跳过此步骤 思路大致是:获取用户的code值 > 根 ...
- HTML5 文件域+FileReader 分段读取文件并上传到服务器(六)
说明:使用Ajax方式上传,文件不能过大,最好小于三四百兆,因为过多的连续Ajax请求会使后台崩溃,获取InputStream中数据会为空,尤其在Google浏览器测试过程中. 1.简单分段读取文件为 ...
- TreeView checkbox
C# TreeView checkbox 联动打勾 #region 将树的checkbox选中 private void setNodeTrue(Node selNode) { Node node = ...