关于solr build search分离的讨论以及re-indexing的实现

标签: solr build search | 发表时间:2014-11-06 21:19 | 作者:quentinXXZ
出处:http://www.iteye.com

本文链接:  http://quentinXXZ.iteye.com/blog/2153210

场景需求与分析

我们的做法,一般将索引构建大致分为两类操作,一为全量索引构建,二为增量索引构建。使用solr建索引,一般会在初始状态的时候,进行一次全量构建,根据当前数据源的整体数据生成一套完整索引,可提供服务,但为了保证索引数据的完整且最新,还需要增量索引,使得数据源的改变(包括记录的增加,修改,与删除)体现在这套索引之上。

在solr单core或者单collection的情况下,类似DataImportHandler之类的工具,都能提供这样全量与增量的索引方式。然而,对一套索引仅使用单core或者单collection的情况下,这种方式存在一种问题:索引上的错误累积。如果增量出错,或者增量的几条修改丢失,这样的错误就会一直在索引上累积。除非你删除这套索引,重新做全量,即re-indexing。这样势必就需要开发人员的人工参与与机器的停止维护。而我们有这种定期re-indexing的需求。

 

Solr Build search 分离问题

要保证搜索引擎正常服务,同时又能做re-indexing。这就涉及到了build与search分离的情况。例如在cloud模式下,我们希望的理想状态是,每个分片shard的副本集中的leader在做全量的时候,只作索引的写,而不提供读服务,在完成索引全量写之后,同步给其它的replica。这样确定index构建速度,同时不给leader太大压力。但是solr的做法不是这样的,在leader做写入时候,同时在提供search服务。可见solr并没有做到明显build search分离。这也是solr本身的一个问题。所以对re-indexing问题 的解决,本质上就是对build search分离问题的解决。

 

Solr standalone 下的re-indexing的实现

为了实现单机形式下的读写分离,其实就是对不同core的分离。假设core名为 search,提供当前服务的索引,可以再新建一个空白的core, 名为search-rebuild,使用与serach相同schemal配置。需要re-index的时候,就可以这样做:

1、停止当前写往search的增量,search正常服务。

2、对search-rebuild进行全量索引构建。

3、完成search-rebuild全量索引后,做一次coreAdmin的SWAP操作,切换两个索引。

Url形式的api如下:

http://localhost:8983/solr/admin/cores?action=SWAP&core=search&other=search-rebuild

Swap所做的就是将两个core对应的名称做一下交换。也就是说,SWAP之后,search对应的索引为原来在search-rebuild建立的全新索引。而search-rebuild对应的索引为原来search的旧版索引。搜索客户端的搜索url无须修改,做到无缝切换。

4、继续对search(已经是新的索引)做增量。

 

Solr master/slave 下的re-indexing的实现

    Master/slave情况下,涉及到多台solr server,需要对多台solr server的索引做切换,会复杂得多。但最后发现,其实Master/slave下的re-indexing其实也可以通过与standalone的相似SWAP的方式实现的,而且无须对多台solr进行SWAP,只须SWAP master即可,slave会自动从master同步最新的索引。

没有找到文档,说solr是可以支持这种方式的。做了几次实验,这样的操作都成功了。但还是不放心,所以仔细的阅读了solr的源码,考虑了多这种情形了,相信这样的处理方式是可行的,并成功在线上进行了一次这样的操作,如果读者研究之后仍觉得有问题,请纠正我。

关于master/salve的索引同步的实现代码,主要在ReplicationHandler(master端)与SnapPuller(slave端)。

以下文章master/salve的索引同步的实现过程的分析比较清晰准备。

http://www.kafka0102.com/2010/07/249.html

 

Solrcloud 模式下的re-indexing的实现

     Solrcloud下的re-indexing是无法通过swap实现的。以下是Solr中CoreAdminHandler对SWAP请求最终调用的是SolrCore的一段代码:

 

protected void swap(String n0, String n1) {
 
    synchronized (modifyLock) {
      SolrCore c0 = cores.get(n0);
      SolrCore c1 = cores.get(n1);
      if (c0 == null) { // Might be an unloaded transient core
        c0 = container.getCore(n0);
        if (c0 == null) {
          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No such core: " + n0);
        }
      }
      if (c1 == null) { // Might be an unloaded transient core
        c1 = container.getCore(n1);
        if (c1 == null) {
          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No such core: " + n1);
        }
      }
      cores.put(n0, c1);
      cores.put(n1, c0);
 
      c0.setName(n1);
      c0.getCoreDescriptor().putProperty(CoreDescriptor.CORE_NAME, n1);
      c1.setName(n0);
      c1.getCoreDescriptor().putProperty(CoreDescriptor.CORE_NAME, n0);
    }

 

 

可见,SWAP只是简单地对两个内存中CoreDescriptor对象的name进行交换,甚至并没有与zookeeper有任何交涉。所以肯定无法适用于solrcloud的复杂情形。要实现cloud下的re-indexing,在core级别下的swap肯定是不够了,这时候,就需要一种在collection级别下的swap。

最后的解决方法我是在下文中找到,其中就提到了re-indexing的场景,cloudera网站上提供的方法:

http://blog.cloudera.com/blog/2013/10/collection-aliasing-near-real-time-search-for-really-big-data/

原文的片段如下:

Re-indexing

Collection aliases are also useful for re-indexing – especially when dealing with static indices. You

can re-index in a new collection while serving from the existing collection. Once the re-index is

complete, you simply swap in the new collection and then remove the first collection using your read

side aliases.

 

文中主要介绍的是alias 别名的使用,当然别名除了这种场景的应用,还有其他使用场体。利用Alias的修改,我们就可以实现两个collection之间的SWAP。

另外,提一下利用solrj进行alias操作时遇到的一些版本问题:Solrj4.6.0才开始支持CollectionAdmin操作,但是Solrj4.6.0进行alias create操作有明显bug,Solrj4.6.1修复。同时,solrj应使用与solr-core相同的版本,否则可能会有兼容性问题。所以如果想用java调用,而且使用4.6.1之前版本的solr服务,就需要自行实现该API方法,可参考Solrj4.6.1或以后版本,进行修改。

 

 

总结

 

总之,我所发现的solr对re-indexing的实现是增加了另一套索引再做切换实现的,这样的一个代价,就是增加了磁盘空间的占用,另一个代价就是某个时刻占用两倍内存的可能。在solrcloud模式,这种做法不一定需要更多的机器,因为不同collection下的分片副本的core是可以共存于一个solr实例中的。

本文链接:  http://quentinXXZ.iteye.com/blog/2153210

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [solr build search] 推荐:

关于solr build search分离的讨论以及re-indexing的实现

- - 开源软件 - ITeye博客
本文链接:  http://quentinXXZ.iteye.com/blog/2153210. 我们的做法,一般将索引构建大致分为两类操作,一为全量索引构建,二为增量索引构建. 使用solr建索引,一般会在初始状态的时候,进行一次全量构建,根据当前数据源的整体数据生成一套完整索引,可提供服务,但为了保证索引数据的完整且最新,还需要增量索引,使得数据源的改变(包括记录的增加,修改,与删除)体现在这套索引之上.

主流全文索引工具的比较( Lucene, Sphinx, solr, elastic search)

- - 企业架构 - ITeye博客
前几天的调研(  Rails3下的 full text search (全文本搜索, 全文匹配. ) ), 我发现了两个不错的候选: . lucene  (solr, elasticsearch 都是基于它) . 把看到的有价值的文章记录在这里: . 回答1.  Result relevance ranking is the default.

浅谈 Semantic Search

- - IT瘾-dev
顾名思义,关键词搜索就是当用户输入关键词( Query),搜索引擎会去搜索并匹配含有 Query的文档,然后返回相关的结果( Response). 一般来说,一个文档包含越多的用户关键词,它在结果中的排序就越靠前. 假设有以下的 Query和 Responses:. 我们可以观察 Responses中每个结果中的词与 Query 中的词,然后找出在  Query和   Response 都出现的词的个数:.

Solr SpellCheck 应用

- - 开源软件 - ITeye博客
通过对各类型的SpellCheck组件学习,完成项目拼写检查功能. 本文使用基于拼写词典的实现方式,solr版本为5.3.0. SpellCheck 简述. 拼写检查是对用户错误输入,响应正确的检查建议. 比如输入:周杰轮,响应:你是不是想找 周杰伦. Solr的拼写检查大致可分为两类,基于词典与基于Solr索引.

Solr DocValues详解

- - 企业架构 - ITeye博客
什么是docValues. docValues是一种记录doc字段值的一种形式,在例如在结果排序和统计Facet查询时,需要通过docid取字段值的场景下是非常高效的. 为什么要使用docValues. 这种形式比老版本中利用fieldCache来实现正排查找更加高效,更加节省内存. 倒排索引将字段内存切分成一个term列表,每个term都对应着一个docid列表,这样一种结构使得查询能够非常快速,因为term对应的docid是现成就有的.

solr的使用

- - Web前端 - ITeye博客
solr的原理不和大家一一讲述,主要讲solr在使用过程中的注意事项.  首先是安装solr,安装步骤省略. (不要说我懒,安装步骤导出都是. 成功之后 需要在solr里面建立一个针对你的业务的服务,我想建立一个叫做discuz的服务. 然后你在你的solr目录 :solr-5.5.3/server/solr/  下看见了discuz   ,这是你刚刚创建的,针对某一业务的整个搜索配置都是在这个目录下配置的.

Solr调优参考

- - 淘宝网通用产品团队博客
共整理三部分,第一部分Solr常规处理,第二部分针对性性处理,前者比较通用,后者有局限性. 务必根据具体应用特性,具体调节参数,对比性能. 具体应用需要全面去把控,各个因素一起起作用. 第一部分. E文连接 http://wiki.apache.org/solr/SolrPerformanceFactors.

Solr之缓存篇

- - 淘宝网综合业务平台团队博客
Solr在Lucene之上开发了很多Cache功能,从目前提供的Cache类型有:. 而每种Cache针对具体的查询请求进行对应的Cache. 本文将从几个方面来阐述上述几种Cache在Solr的运用,具体如下:. (1)Cache的生命周期. (2)Cache的使用场景. (3)Cache的配置介绍.

Solr主从备份

- - 研发管理 - ITeye博客
SOLR复制模式,是一种在分布式环境下用于同步主从服务器的一种实现方式,因之前提到的基于rsync的SOLR不同方式部署成本过高,被SOLR1.4版本所替换,取而代之的就是基于HTTP协议的索引文件传输机制,该方式部署简单,只需配置一个文件即可. 以下讲解具体操作步骤: . 步骤分主服务器和从服务器,允许有多个从服务器,即从服务器的配置一样.

solr相似匹配

- - CSDN博客推荐文章
相似匹配   在我们使用网页搜索时,会注意到每一个结果都包含一个 “相似页面” 链接,单击该链接,就会发布另一个搜索请求,查找出与起初结果类似的文档. Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeThisHandler 实现了一样的功能. 如上所述,MLT 是与标准 SolrRequestHandler 集成在一起的;MoreLikeThisHandler 与 MLT 结合在一起,并添加了一些其他选项,但它要求发布一个单一的请求.