面试请不要再问我分布式搜索引擎的架构原理

来源:https://juejin.im/post/5c49ae25f265da613d7c6635

(1)倒排索引到底是啥?

要了解分布式搜索引擎,先了解一下搜索这个事儿吧,搜索这个技术领域里最入门级别的一个概念就是倒排索引。

我们先简单说一下倒排索引是个什么东西。

假如说你现在不用搜索引擎,单纯使用数据库来存放和搜索一些数据,比如说放了一些论坛的帖子数据吧,那么这个数据的格式大致如下:

img

很简单吧,假设有一个id字段标识了每个帖子数据,然后title字段是帖子的标题,content字段是帖子的内容。

那么这个时候,比如我们要是用数据库来进行搜索包含“Java”这个关键字的所有帖子,大致SQL如下:

img

咱们姑且不论这个数据库层面也有支持全文检索的一些特殊索引类型,或者数据库层面是怎么执行的,这个不是本文讨论的重点,你就看看数据库的数据格式以及搜索的方式就好了。

但是如果你通过搜索引擎类的技术来存放帖子的内容,他是可以建立倒排索引的。

也就是说,你把上述的几行数据放到搜索引擎里,这个倒排索引的数据大致看起来如下:

关键词 id

Java [1, 2, 3]

语言 [1]

面试 [3]

资源 [2]

所谓的倒排索引,就是把你的数据内容先分词,每句话分成一个一个的关键词,然后记录好每个关键词对应出现在了哪些id标识的数据里。

那么你要搜索包含“Java”关键词的帖子,直接扫描这个倒排索引,在倒排索引里找到“Java”这个关键词对应的那些数据的id就好了。

然后你可以从其他地方根据这几个id找到对应的数据就可以了,这个就是倒排索引的数据格式以及搜索的方式,上面这种利用倒排索引查找数据的方式,也被称之为全文检索。

(2)什么叫做分布式搜索引擎?

其实要知道什么叫做分布式搜索引擎,你首先得知道,假如我们就用一台机器部署一个搜索引擎系统,然后利用上述的那种倒排索引来存储数据,同时支持一些全文检索之类的搜索功能,那么会有什么问题?

其实还是很简单,假如说你现在要存储1TB的数据,那么放在一台机器还是可以的。

但是如果你要存储超过10TB,100TB,甚至1000TB的数据呢?你用一台机器放的下吗?

当然是放不下的了,你的机器磁盘空间是不够的。

大家看一下下面的图:

img

所以这个时候,你就得用分布式搜索引擎了,也就是要使用多台机器来部署搜索引擎集群。

比如说,假设你用的是Elasticsearch(后面简写为:ES)。

现在你总共有3TB的数据,那么你搞3台机器,每台机器上部署一个ES进程,管理那台机器上的1TB数据就可以了。

这样不就可以把3TB的数据分散在3台机器上来存储了?这不就是索引数据的分布式存储吗?

而且,你在搜索数据的时候,不就可以利用3台机器来对分布式存储后的数据进行搜索了?每台机器上的ES进程不都可以对一部分数据搜索?这不就是分布式的搜索?

是的,这就是所谓的分布式搜索引擎:把大量的索引数据拆散成多块,每台机器放一部分,然后利用多台机器对分散之后的数据进行搜索,所有操作全部是分布在多台机器上进行,形成了完整的分布式的架构。

同样,我们来看下面的图,直观的感受一下。

img

(3)Elasticsearch的数据结构

如果你要是使用Elasticsearch这种分布式搜索引擎,必须要熟悉他的一些专业的技术名词,描述他的一些数据结构。

比如说“index”这个东西,他是索引的意思,其实他有点类似于数据库里的一张表,大概对应表的那个概念。

比如你搞一个专门存放帖子的索引,然后他有id、title、content几个field,这个field大致就是他的一个字段。

然后还有一个概念,就是document,这个就代表了index中的一条数据。

下面就是一个document,这个document可以写到index里去,算是index里的一条数据。

而且写到es之后,这条数据的内容就会拆分为倒排索引的数据格式来存储。

img

(4)Shard数据分片机制

那么这个时候大家考虑一下,比如说你有一个index,专门存放论坛里的帖子,现在论坛里的帖子有1亿,占用了1TB的磁盘空间,这个还好说。

如果这个帖子有10亿,100亿,占用了10TB、甚至100TB的磁盘空间呢?

那你这个index的数据还能在一台机器上存储吗?答案明显是不能的。

这个时候,你必须得支持这个index的数据分布式存储在多台机器上,利用多台机器的磁盘空间来承载这么大的数据量。

而且,需要保证每台机器上对这个index存储的数据量不要太大,因为控制单台机器上这个index的数据量,可以保证他的搜索性能更高。

所以这里就引入了一个概念:Shard数据分片结构。每个index你都可以指定创建多少个shard,每个shard就是一个数据分片,会负责存储这个index的一部分数据。

比如说index里有3亿帖子,占据3TB数据。然后这个index你设置了3个shard。

那么每个shard就可以包含一个1TB大小的数据分片,每个shard在集群里的一台机器上,这样就形成了利用3台机器来分布式存储一个index的数据的效果了。

大家看下面的图:

img

现在index里的3TB数据分布式存储在了3台机器上,每台机器上有一个shard,每个shard负责管理这个index的其中1TB数据的分片。

而且,另外一个好处是,假设我们要对这个index的3TB数据运行一个搜索,是不是可以发送请求到3台机器上去?

3台机器上的shard直接可以分布式的并行对一部分数据进行搜索,起到一个分布式搜索的效果,大幅度提升海量数据的搜索性能和吞吐量。

(5)Replica多副本数据冗余机制

但是现在有一个问题,假如说3台机器中的其中一台宕机了,此时怎么办呢?

是不是这个index的3TB数据的1/3就丢失了?因为上面有1TB的数据分片没了。

所以说,还需要为了实现高可用使用Replica多副本数据冗余机制。

在Elasticsearch里,就是支持对每个index设置一个replica数量的,也就是每个shard对应的replica副本的数量。

比如说你现在一个index有3个shard,你设置对每个shard做1个replica副本,那么此时每个shard都会有一个replica shard。

这个初始的shard就是primary shard,而且primary shard和replica shard是绝对不会放在一台机器上的,避免一台机器宕机直接一个shard的副本也同时丢失了。

我们再来看下面的图,感受一下:

img

在上述的replica机制下,每个primary shard都有一个replica shard在别的机器上,任何一台机器宕机,都可以保证数据不会丢失,分布式搜索引擎继续可用。

Elasticsearch默认是支持每个index是5个primary shard,每个primary shard有1个replica shard作为副本。

(6)文末总结

好了,本文到这儿就结束了,再来给大伙简单小结。

我们从搜索引擎的倒排索引开始,到单机无法承载海量数据,再到分布式搜索引擎的存储和搜索。

然后我们以优秀的分布式搜索引擎ES为例,阐述了ES的数据结构,shard数据分片机制,replica多副本机制,解释了一下分布式搜索引擎的架构原理。

最后还是强调一下,在Java面试尤其是高级Java面试中,对于分布式搜索引擎技术的考察越来越重,所以这块技术的重要性,还是不容小觑的!

一、课程优势本课程有陈敬雷老师的清华大学出版社配套书籍教材《分布式机器学习实战》人工智能科学与技术丛书,新书配合此实战课程结合学习,一静一动,互补高效学习!本课程由互联网一线知名大牛陈敬雷老师全程亲自授课,技术前沿热门,是真正的互联网工业级实战项目。二、课程简介       大数据和算法类的系统和传统的业务系统有所不同,一个是多了离线计算框架部分,比如Hadoop集群上的数据处理部分、机器学习和深度学习的模型训练部分等,另一个区别就是大数据和算法类系统追求的是数据驱动、效果驱动,通过AB测试评估的方式,看看新策略是否得到了优化和改进。所以在系统架构上,需要考虑到怎么和离线计算框架去对接,怎么设计能方便我们快速迭代的优化产品,除了这些,像传统业务系统那些该考虑的也照样需要考虑,比如高性能、高可靠性、高扩展性也都需要考虑进去。这就给架构师非常高的要求,一个是需要对大数据和算法充分了解,同时对传统的业务系统架构也非常熟悉。        本节课就对当前几个热门的大数据算法系统架构(推荐系统架构设计、个性化搜索引擎架构设计、用户画像系统架构设计)做一个深度解析!1.个性化推荐算法系统 是一个完整的系统工程,从工程上来讲是由多个子系统有机的组合,比如基于Hadoop数据仓库的推荐集市、ETL数据处理子系统、离线算法、准实时算法、多策略融合算法、缓存处理、搜索引擎部分、二次重排序算法、在线web引擎服务、AB测试效果评估、推荐位管理平台等。如下就是我们要讲的个性化推荐算法系统架构图,大家仔细欣赏、品味:      这节课我们就对推荐系统的整体架构和各个子系统做了详细的讲解,解开个性化推荐算法系统神秘的面纱!2.个性化搜索引擎 和个性化推荐是比较类似的,这个架构图包含了各个子系统或模块的协调配合、相互调用关系,从部门的组织架构上来看,目前搜索一般独立成组,有的是在搜索推荐部门里面,实际上比较合理的应该是分配在大数据部门更好一些,因为依托于大数据部门的大数据平台和人工智能优势可以使搜索效果再上一个新的台阶。下面我们来详细的讲一下整个架构流程的细节。如下就是我们要讲的个性化搜索架构图,大家仔细欣赏、品味:这节课我们就对个性化搜索的整体架构和各个子系统做了详细的讲解,解开搜索引擎神秘的面纱! 3.大数据用户画像系统 用户画像是一个非常通用普遍使用的系统,从我们的架构图中可以看出,从数据计算时效性上来讲分离线计算和实时计算。离线计算一般是每天晚上全量计算所有用户,或者按需把用户数据发生变化的那批用户重新计算。离线计算主要是使用Hive SQL语句处理、Spark数据处理、或者基于机器学习算法来算用户忠诚度模型、用户价值模型、用户心理模型等。实时计算指定的通过Flume实时日志收集用户行为数据传输到Kafka消息队列,让流计算框架Flink/Storm/SparkStreaming等去实时消费处理用户数据,并触发实时计算模型,计算完成后把新增的用户画像数据更新搜索索引。个性化推荐、运营推广需要获取某个或某些用户画像数据的时候直接可以毫秒级别从搜索索引里搜索出结果,快速返回给调用方数据。这是从计算架构大概分了两条线离线处理和实时。下面我们从上到下详细看下每个架构模块。如下就是我们要讲的大数据用户画像架构图,大家仔细欣赏、品味:这节课我们就对大数据用户画像系统的整体架构和各个子系统做了详细的讲解,解开用户画像系统神秘的面纱!三、老师介绍陈敬雷  充电了么创始人,CEO兼CTO陈敬雷,北京充电了么科技有限公司创始人,CEO兼CTO,十几年互联网从业经验,曾就职于用友、中软、凡客、乐蜂网(唯品会)、猎聘网、人民日报(灵思云途)、北京万朝科技,曾任架构师、首席技术官、首席科学家等职务,对业务领域B端、C端、电商、职场社交招聘、内容文娱、营销行业都有着丰富的经验,在技术领域,尤其在大数据和人工智能方向有丰富的算法工程落地实战经验,其中在猎聘网任职期间主导的推荐算法系统项目获得公司优秀项目奖,推荐效果得到5倍的提升。陈敬雷著有清华大学出版社两本人工智能书籍,分别是《分布式机器学习实战(人工智能科学与技术丛书)》、《自然语言处理原理与实战(人工智能科学与技术丛书)》。目前专注于大数据和人工智能驱动的上班族在线教育行业,研发了充电了么app和网站,用深度学习算法、nlp、推荐引擎等技术来高效提升在线学习效率。 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值