欢迎关注我的公众号:石杉的架构笔记(ID:shishan100)程序员
周一至周五早8点半!精品技术文章准时送上!面试
目录算法
(1)倒排索引究竟是啥?数据库
(2)什么叫分布式搜索引擎?缓存
(3)ElasticSearch的数据结构性能优化
(4)Shard数据分片机制数据结构
(5)Replica多副本数据冗余机制架构
(6)全文总结并发
“ 这篇文章,咱们来聊一下最近这一两年行业内Java高级工程师面试的时候尤其常见的一个问题:谈谈你对分布式搜索引擎的理解,聊聊他的架构原理?分布式
不少同窗可能历来没接触过这个东西,因此本文咱们就以如今最火最流行的Elasticsearch为例,来聊一下分布式搜索引擎的核心架构原理。”
要了解分布式搜索引擎,先了解一下搜索这个事儿吧,搜索这个技术领域里最入门级别的一个概念就是倒排索引。
咱们先简单说一下倒排索引是个什么东西。
假如说你如今不用搜索引擎,单纯使用数据库来存放和搜索一些数据,好比说放了一些论坛的帖子数据吧,那么这个数据的格式大体以下:
那么这个时候,好比咱们要是用数据库来进行搜索包含“Java”这个关键字的全部帖子,大体SQL以下:
可是若是你经过搜索引擎类的技术来存放帖子的内容,他是能够创建倒排索引的。
也就是说,你把上述的几行数据放到搜索引擎里,这个倒排索引的数据大体看起来以下:
关键词 id
Java [1, 2, 3]
语言 [1]
面试 [3]
资源 [2]
所谓的倒排索引,就是把你的数据内容先分词,每句话分红一个一个的关键词,而后记录好每一个关键词对应出如今了哪些id标识的数据里。
那么你要搜索包含“Java”关键词的帖子,直接扫描这个倒排索引,在倒排索引里找到“Java”这个关键词对应的那些数据的id就行了。
而后你能够从其余地方根据这几个id找到对应的数据就能够了,这个就是倒排索引的数据格式以及搜索的方式,上面这种利用倒排索引查找数据的方式,也被称之为全文检索。
其实要知道什么叫作分布式搜索引擎,你首先得知道,假如咱们就用一台机器部署一个搜索引擎系统,而后利用上述的那种倒排索引来存储数据,同时支持一些全文检索之类的搜索功能,那么会有什么问题?
其实仍是很简单,假如说你如今要存储1TB的数据,那么放在一台机器仍是能够的。
可是若是你要存储超过10TB,100TB,甚至1000TB的数据呢?你用一台机器放的下吗?
固然是放不下的了,你的机器磁盘空间是不够的。
你们看一下下面的图:
因此这个时候,你就得用分布式搜索引擎了,也就是要使用多台机器来部署搜索引擎集群。
好比说,假设你用的是Elasticsearch(后面简写为:ES)。
如今你总共有3TB的数据,那么你搞3台机器,每台机器上部署一个ES进程,管理那台机器上的1TB数据就能够了。
这样不就能够把3TB的数据分散在3台机器上来存储了?这不就是索引数据的分布式存储吗?
并且,你在搜索数据的时候,不就能够利用3台机器来对分布式存储后的数据进行搜索了?每台机器上的ES进程不均可以对一部分数据搜索?这不就是分布式的搜索?
是的,这就是所谓的分布式搜索引擎:把大量的索引数据拆散成多块,每台机器放一部分,而后利用多台机器对分散以后的数据进行搜索,全部操做所有是分布在多台机器上进行,造成了完整的分布式的架构。
一样,咱们来看下面的图,直观的感觉一下。
若是你要是使用Elasticsearch这种分布式搜索引擎,必需要熟悉他的一些专业的技术名词,描述他的一些数据结构。
好比说“index”这个东西,他是索引的意思,其实他有点相似于数据库里的一张表,大概对应表的那个概念。
好比你搞一个专门存放帖子的索引,而后他有id、title、content几个field,这个field大体就是他的一个字段。
而后还有一个概念,就是document,这个就表明了index中的一条数据。
下面就是一个document,这个document能够写到index里去,算是index里的一条数据。
并且写到es以后,这条数据的内容就会拆分为倒排索引的数据格式来存储。
那么这个时候你们考虑一下,好比说你有一个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的数据的效果了。
你们看下面的图:
如今index里的3TB数据分布式存储在了3台机器上,每台机器上有一个shard,每一个shard负责管理这个index的其中1TB数据的分片。
并且,另一个好处是,假设咱们要对这个index的3TB数据运行一个搜索,是否是能够发送请求到3台机器上去?
3台机器上的shard直接能够分布式的并行对一部分数据进行搜索,起到一个分布式搜索的效果,大幅度提高海量数据的搜索性能和吞吐量。
可是如今有一个问题,假如说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的副本也同时丢失了。
咱们再来看下面的图,感觉一下:
在上述的replica机制下,每一个primary shard都有一个replica shard在别的机器上,任何一台机器宕机,均可以保证数据不会丢失,分布式搜索引擎继续可用。
Elasticsearch默认是支持每一个index是5个primary shard,每一个primary shard有1个replica shard做为副本。
好了,本文到这儿就结束了,再来给大伙简单小结。
咱们从搜索引擎的倒排索引开始,到单机没法承载海量数据,再到分布式搜索引擎的存储和搜索。
而后咱们以优秀的分布式搜索引擎ES为例,阐述了ES的数据结构,shard数据分片机制,replica多副本机制,解释了一下分布式搜索引擎的架构原理。
最后仍是强调一下,在Java面试尤为是高级Java面试中,对于分布式搜索引擎技术的考察愈来愈重,因此这块技术的重要性,仍是不容小觑的!
End
扫描下方二维码,备注:“资料”,获取更多“秘制” 精品学习资料
若有收获,请帮忙转发,您的鼓励是做者最大的动力,谢谢!
一大波微服务、分布式、高并发、高可用的原创系列文章正在路上
欢迎扫描下方二维码,持续关注:
石杉的架构笔记(id:shishan100)
十余年BAT架构经验倾囊相授
推荐阅读:
二、【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?
三、【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战
六、大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问
七、【性能优化的秘密】Hadoop如何将TB级大文件的上传性能优化上百倍
九、【坑爹呀!】最终一致性分布式事务如何保障实际生产中99.99%高可用?
十一、【眼前一亮!】看Hadoop底层算法如何优雅的将大规模集群性能提高10倍以上?
1六、亿级流量系统架构之如何设计全链路99.99%高可用架构
1八、大白话聊聊Java并发面试问题之volatile究竟是什么?
1九、大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?
20、大白话聊聊Java并发面试问题之谈谈你对AQS的理解?
2一、大白话聊聊Java并发面试问题之公平锁与非公平锁是啥?
2二、大白话聊聊Java并发面试问题之微服务注册中心的读写锁优化
2三、互联网公司的面试官是如何360°无死角考察候选人的?(上篇)
2四、互联网公司面试官是如何360°无死角考察候选人的?(下篇)
2五、Java进阶面试系列之一:哥们,大家的系统架构中为何要引入消息中间件?
2六、【Java进阶面试系列之二】:哥们,那你说说系统架构引入消息中间件有什么缺点?
2七、【行走的Offer收割机】记一位朋友斩获BAT技术专家Offer的面试经历
2八、【Java进阶面试系列之三】哥们,消息中间件在大家项目里是如何落地的?
2九、【Java进阶面试系列之四】扎心!线上服务宕机时,如何保证数据100%不丢失?
30、一次JVM FullGC的背后,竟隐藏着惊心动魄的线上生产事故!
3一、【高并发优化实践】10倍请求压力来袭,你的系统会被击垮吗?
3二、【Java进阶面试系列之五】消息中间件集群崩溃,如何保证百万生产数据不丢失?
3三、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(上)?
3四、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(中)?
3五、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(下)?
3七、亿级流量系统架构之如何保证百亿流量下的数据一致性(上)
3八、亿级流量系统架构之如何保证百亿流量下的数据一致性(中)?
3九、亿级流量系统架构之如何保证百亿流量下的数据一致性(下)?
40、互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(1)
4一、互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(2)
4三、高并发场景下,如何保证生产者投递到消息中间件的消息不丢失?
4五、从团队自研的百万并发中间件系统的内核设计看Java并发性能优化
4六、【非广告,纯干货】英语差的程序员如何才能无障碍阅读官方文档?
4七、若是20万用户同时访问一个热点缓存,如何优化你的缓存架构?
4八、【非广告,纯干货】中小公司的Java工程师应该如何逆袭冲进BAT?
做者:石杉的架构笔记 连接:juejin.im/post/5c263a… 来源:掘金 著做权归做者全部,转载请联系做者得到受权!