Lucene系列-index弹性扩展

原创 2015年11月19日 11:46:46

Lucene系列-index扩展

Shard与Replica

  • Shard:index数据分片.当索引数据到达百亿级别的,单份数据索引读取和搜索都是非常耗时间的,即使在用earlytermination的情况下,latency也在100ms左右. 数据分片成shard,可以快速的提高搜索效率.
  • Replica:shard的备份,在搜索QPS较高的时候,Replica可以提供搜索的吞吐量. 一般包含一个primary shard和多个replica shards.

Index扩展

index扩展一般包含横向扩展和纵向扩展,将大数据切分成小数据块,或者将数据分片复制copy到一台机器.

横向扩展策略:
考虑线上机器运行,此时要保证搜索正常的work,并向外提供搜索服务.
1.首先应该停掉index write操作, 即利用一些消息队列存储操作阶段的线上来的增量消息.
2.循环依次复制所有的消息分片.
3.打开之前的index服务接口和新的replica.

纵向扩展策略:
当索引量比较大,disk读写速度变慢,搜索latency变高.我们需要增加分片,从而改变单个shard index的大小
纵向扩展分两种:
(1)增加新的shard,之后所有的新增索引建到新的shard上,之前的删除操作要遍历所有的shard.
(2)增加新的shard,把所有数据在平均分配一下.例如之前有2个shard,现在将2个shard的数据平均分配到3个shard上.新增的数据还是按路由规则(hash规则)写入到某一个特定的shard中.

以下策略是主要是针对无原始数据或者重建索引时间代价比较大的,这种情况下,即使在hadoop index 离线索引也不可抵消.我们实现了以下方案.具体实现:
以2个shard扩展成3个shard为例,如图:
这里写图片描述
我们定义document文档路由规则, hash函数: routeId = documentId % shardSize;
根据hash函数我们可以知道,shard1上的数据需要分裂数据到shard1’, shard2’, shard3’上.我们知道lucene底层数据的删除是先将要删除的doc设置标识位delete标识, 在index merge的时候进行删除.我们可以利用这个规律来进行. 假设shard1有三个文档.原始标识位是111,然后复制2份, 这时候就有三份shard1.通过设置标识位100,010,001,这样就shard1的数据根据我们之前定义的规则hash出来了.同理shard2也是这样.
如此进行之后,将分配到同一个node上的两个segment数据合并成统一的一份索引.
上面要注意的问题:
1.上线服务一致性问题,即在shard1,shard2分裂的过程中,这个时间段如果还继续向外提供服务,可能不稳定.因此如果有多个replica服务就可以停掉此服务.
2.线上数据的copy是比较费时间的,即相对于数据重建索引的代价而言,一般较小

Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB级、万亿条数据记录的检索工作,这里向大家分享下Lucene底层原理研究和一些优化经验。   从两个方面介绍:   1. Luce...

在ElasticSearch之下(深入理解Shard和Lucene Index)

摘要 从底层介绍ElasticSearch Shard的内部原理,以及回答为什么使用ElasticSearch有必要了解Lucene的内部工作方式?  。了解ElasticSearch API的代...

Lucene对index操作

package org.lucene.index;    import java.io.File;  import java.io.IOException;    import org.ap...

Apache Lucene - Index File Formats

Apache Lucene - Index File Formats IntroductionDefinitions Inverted IndexingTypes of FieldsS...

lucene通过修改boost值改善index索引

并不是所有的Document和Field是平等创建的。Document增量是个使得这种需求能够简单实现的一个特征。默认情况下,所有的Document都没有增量,他们都有相同的增量因数1.0。通过改变某...
  • yyunix
  • yyunix
  • 2011年10月18日 09:46
  • 855

学习笔记14 Lucene.NET中Field.Index 和 Field.Store的几种属性的用法

转:  Lucene.NET中Field.Index 和 Field.Store的几种属性的用法 分类: 搜索引擎2011-07-17 13:37 19人阅读 评论(0) 收藏 举...

如何理解Lucene的Index(索引)文档模型

Lucene主要有两种文档模型:Document和Field,一个Document可能包含若干个Field。 每一个Field有不同的策略: 1.被索引 or not,将该字段(Field...

Lucene 4.X 倒排索引原理与实现: (3) Term Dictionary和Index文件 (FST详细解析)

我们来看最复杂的部分,就是Term Dictionary和Term Index文件,Term Dictionary文件的后缀名为tim,Term Index文件的后缀名是tip,格式如图所示。 ...

从概念理解Lucene的Index(索引)文档模型

Lucene主要有两种文档模型:Document和Field,一个Document可能包含若干个Field。每一个Field有不同的策略:1.被索引 or not,将该字段(Field)经过分析(An...

Lucene 最新版代码使用实例之【搜索index】

根据之前创建的索引进行搜索。 /** * V Lucene 3.5 * 搜索索引 */ public static void readIndex(){ IndexSearcher...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lucene系列-index弹性扩展
举报原因:
原因补充:

(最多只允许输入30个字)