1.由来《深入浅出搜索架构(上篇)》详细介绍:(1)全网搜索引擎的架构和流程(2)搜索引擎的架构和流程站内(三)搜索原理及核心数据结构本文重点介绍:(四)流量数据量从小到大,常用搜索方案及架构变化(五)数据量、并发、扩展方案只要业务有检索需求,本文一定对您有所帮助。2.检索需求的满足与架构的演进任何互联网需求都可能有或多或少的检索需求。我们以58同城的邮政业务场景为例。帖子的标题和帖子的内容有很强的用户检索需求。如何实现流量和并发增长的各个阶段的检索需求?1、原始阶段-LIKE数据在数据库中可能是这样存储的:t_tiezi(tid,title,content)为了满足title和content的检索需求,可以通过LIKE实现:selecttidfromt_tieziwherecontentlike'%tiantongyuan%'可以快速满足业务需求,存在的问题也很明显:(1)效率低,每次都需要全表扫描,计算量大,并发高时CPU容易100%(2)不支持分词2.初级阶段——如何快速提高全文索引效率,支持分词,尽量减少对原有系统架构的影响。首先想到的是建立全文索引:altertablet_tieziaddfulltext(title,content)使用match和against实现对索引字段的查询需求。全文索引可以快速实现业务中分词的需求,快速提升性能(分词后倒转,至少不用全表扫描),但是存在一些问题:(1)只适用于MyISAM(2)由于全文索引的使用是数据库的一个特性,在数据库中搜索需求和普通的CURD需求是耦合的:当检索需求并发量大时,可能会影响CURD请求;会明显减少,查询返回时间很长,业务难以接受(4)难以横向扩展3.中间阶段——开源外部索引为了解决全文搜索的局限性,当数据量增加到几百万、几千万,需要考虑外部索引。外部索引的核心思想是:索引数据与原始数据分离。前者满足搜索要求,后者满足CURD要求。通过一定的机制(双写、通知、周期重构)来保证数据的一致性。原来的数据可以继续使用Mysql存储。如何实现外部索引?Solr、Lucene、ES都是常见的开源解决方案。楼主强烈推荐ES(ElasticSearch),原因是Lucene虽然好,但是总有一些缺点:(1)Lucene只是一个库,潜台词是需要自己做服务,实现复杂的功能比如高可用性/可扩展性/负载均衡(2)Lucene只支持Java。如果要支持其他语言,还是得自己做服务。(3)Lucene不友好,这是致命的,非常复杂。用户往往需要深入了解搜索知识才能理解其工作原理。为了屏蔽它的复杂性,一种方法是自己做服务。为了改善Lucene的各种缺点,解决方案是“用友好的接口封装一个服务,屏蔽底层的复杂性”,于是就有了ES:(1)ES是以Lucene为内核实现搜索功能,以及提供REStful接口的服务(2)ES可以支持大量数据的信息存储,支持高并发搜索请求(3)ES支持集群,为用户屏蔽高可用/可扩展性负载均衡等复杂特性在。目前,58到家以ES为核心实现了自己的搜索服务平台,通过在平台上的简单配置即可实现业务方的搜索需求。搜索服务数据量最大的“接口耗时数据采集”需求,数据量约7亿条;对于并发量最大的“经纬度地理位置查询”需求,平均线上并发量在600左右,压测数据并发。量在6000左右。结论:ES完全可以满足常见的10亿数据量、5k吞吐量的搜索业务需求,强烈推荐。4.高级阶段——自主研发搜索引擎当数据量进一步增加,达到10亿或100亿条数据时;并发量进一步提升,达到每秒10万吞吐量;当业务个性也逐渐增加时,需要自研搜索引擎更新,搜索内核定制化。3.数据量、并发、扩展性解决方案已经达到定制化自研搜索引擎阶段。设计侧重于大数据量和高并发。为了满足“无限容量、无限并发”的需求,需要考虑架构设计。“可扩展性”,力求做到:增加机器可以扩容(数据量+并发)。58同城自研搜索引擎易搜的初步架构图如下:(1)上层代理(粉色)接入集群,作为外部入口,接受搜索请求。它的无状态保证了代理集群的性能可以通过增加机器来扩展(2)中层合并(浅蓝色)是一个逻辑集群,主要用于实现搜索合并,打分排序。业务相关的rank在这一层实现,其无状态性也可以保证合并集群可以通过加机器进行扩展性能(3)底层搜索器(深红色大框)是一个检索集群。服务和索引数据部署在同一台机器上。服务启动时,可以将索引数据加载到内存中,请求访问时从内存中加载数据。访问速度非常快为了满足数据容量的可扩展性,索引数据被水平拆分,通过增加拆分次数可以无限扩展性能。如上图所示,搜索者分为4组。冗余,理论上,如果增加机器,可以无限扩展性能。如上图所示,每组搜索者都有2个冗余副本。这样的设计可以真正做到通过加机器来实现更大的数据量和响应更高的并发。.3.总结为了满足搜索业务的需求,随着数据量和并发量的增长,搜索架构一般会经历几个阶段:(1)原始阶段-LIKE(2)初级阶段-全文索引(3)中级-开源外部索引(4)高级阶段-自研搜索引擎
