大型网站架构设计lucene 索引优化

文章标签: 大型网站架构设计
2015-1-2 18:18:31     32 人阅读    

          Lucene的索引是由段(segment)组成的,每个段可能又包含多个索引文件,即每个段包含 了一个或者多个Document;段结构使得Lucene可以很好地支持增量索引,新增的Document 将被添加到新的索引段当中。但是,当越来越多的段被添加到索引当中时,索引文件也就越来 越多。一般来说,操作系统对于进程打开的文件句柄数是有限的,当一个进程打开太多的文件 时,会抛出too many openfiles异常,并且执行搜索任务时,Lucene必须分别搜索每个段,然后 将各个段的搜索结果合并,这样查询的性能就会降低。

         为了提高Lucene索引的查询性能,当索引段的数量达到设置的上限时,Lucene会自动进 行索引段的优化,将索引段合并成为一个,以提高查询的性能,并减少进程打开的文件句柄数 量。但是,索引段的合并需要大量的I/O操作,并且需要耗费相当的时间。虽然这样的工作做 完以后,可以提高搜索引擎查询的性能,但在索引合并的过程中,查询的性能将受到很大影响, 这对于前台应用来说一般是难以接受的。

         因此,为了提高搜索引擎的查询性能,需要尽可能地减少索引段的数量,另外,对于需要 应对前端高并发查询的应用来说,对索引的自动合并行为也需要进行抑制,以提高查询的性能。

          一般来说,在分布式环境下,会安排专门的集群来生成索引,并且生成索引的集群不负责 处理前台的查询请求。当索引生成以后,通过索引优化,对索引的段进行合并。合并完以后, 将生成好的索引文件分发到提供查询服务的机器供前台应用查询。当然,数据会不断地更新, 索引文件如何应对增量的数据更新也是一个挑战。对于少量索引来说,可以定时进行全量的索 引重建,并且将索引推送到集群的其他机器,前提是相关业务系统能够容忍数据有一定延迟。 但是,当数据量过于庞大时,索引的构建需要很长的时间,延迟的时间可能无法忍受,因此, 我们不得不接受索引有一定的瑕疵,即索引同时包含多个索引段,增量的更新请求将不断地发 送给查询机器。查询机器可以将索引加载到内存,并以固定的频率回写磁盘,每隔一定的周期, 对索引进行一次全量的重建操作,以将增量更新所生成的索引段进行合并。
分布式扩展

           与其他的分布式系统架构类似,基于Lucene的搜索引擎也会面临扩展的问题,单台机器难 以承受访问量不断上升的压力,不得不对其进行扩展。但是,与其他应用不同的是,搜索应用 大部分场景都能够接受一定时间的数据延迟,对于数据一致性的要求并不那么高,大部分情况 下只要能够保障数据的最终一致性,可以容忍一定时间上的数据不同步


             每个query server实例保存一份完整的索引,该索引由dump server周期性地生成,并进行 索引段的合并,索引生成好之后推送到每台query server进行替换,这样避免集群索引dump对 后端数据存储造成压力。当然,对于增量的索引数据更新,dump server可以异步地将更新推送 到每台query server,或者是query server周期性地到dump server进行数据同步,以保证数据最

本文出自   《大型分布式网站架构设计与实践试读样章》 试读,如果感觉到对你有帮助可以去购买该书


原文地址:http://www.itmmd.com/201501/429.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

linux命令详解(26)分页查看文本 less 命令详解   上一篇
下一篇  linux命令详解(25)查看文本文件 cat、head、tail命令详解

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!