当前位置: 首页 > 科技观察

本文将给大家进行Elasticsearch技术扫盲

时间:2023-03-16 18:54:49 科技观察

很多同学可能从来没有接触过这个东西,所以这篇文章我们就以目前最流行、最受欢迎的Elasticsearch为例,来谈谈分布式搜索引擎的核心架构原理。1.倒排索引到底是什么?要了解分布式搜索引擎,首先要了解搜索。搜索技术领域最入门的概念之一就是倒排索引。下面简单说一下什么是倒排索引。如果你现在不使用搜索引擎,只是用一个数据库来存储和搜索一些数据,比如放一些论坛帖子数据,那么这个数据的格式大致如下:idtitlecontent1IsJavaeasytouse?Java是一种非常非常好的语言。...2让我们一起学习Java。例如,我这里有一些很好的Java学习资源。..3一次Java面试经历去年这个时候学了Java,今年开始面试。..很简单,假设有一个标识每条帖子数据的id字段,那么title字段就是帖子的标题,content字段就是帖子的内容。那么此时,比如我们使用数据库搜索所有包含关键字“Java”的帖子,一般的SQL如下:我们先不管数据库层面支持全文搜索的特殊索引类型,或者说在数据库层面是如何实现的,这不是本文的重点,只看数据库的数据格式和查找方式。但是如果你用搜索引擎技术来存储帖子的内容,他可以建立一个倒排索引。也就是说,如果把上面几行数据放到搜索引擎中,这个倒排索引的数据大概是这样的:KeywordidJava[1,2,3]Language[1]Interview[3]Resource[2】所谓倒排索引就是先把你的数据内容分词,把每句话一个一个分词成关键词,然后记录每个关键词出现在哪个id标识数据。然后你要搜索包含关键词“Java”的帖子",直接扫描倒排索引,在倒排索引中找到关键字"Java"对应的数据的ids。然后就可以根据这些id从其他地方找到相应的数据了。这就是倒排索引的数据格式和查找方式。上述使用倒排索引查找数据的方法也称为全文搜索。2、什么是分布式搜索引擎?其实要知道什么是分布式搜索引擎,首先要知道如果我们在一台机器上部署一个搜索引擎系统,然后使用上面提到的倒排索引来存储数据,并且支持全文等一些搜索搜索功能,有什么问题吗?其实还是很简单的。如果现在要存储1TB的数据,一台机器上存储还是可以的。但是如果要存储超过10TB、100TB甚至1000TB的数据怎么办?你能用机器放下吗?当然不能放下,你的机器磁盘空间不够。看下图:那么这个时候,你就不得不使用分布式搜索引擎,也就是你需要用多台机器部署一个搜索引擎集群。例如,假设您正在使用Elasticsearch(以下简称:ES)。现在你总共有3TB的数据,那么你可以设置3台机器,在每台机器上部署一个ES进程,在该机器上管理1TB的数据。这样3TB的数据就可以分散在3台机器上存储?这不就是索引数据的分布式存储吗?而且,你查数据的时候,分布式存储之后的数据就不能用3台机器查吗?每台机器上的ES进程不能搜索一部分数据吗?这不就是分布式搜索吗?对,这就是所谓的分布式搜索引擎:把大量的索引数据打散成多块,一部分放在每台机器上,然后用多台机器去搜索分散的数据,所有的操作都分布在多台机器上互联网,一个完整的分布式架构就形成了。同样,我们看下图,直观感受一下。3.Elasticsearch的数据结构如果你使用过Elasticsearch这样的分布式搜索引擎,你肯定熟悉它的一些专业技术术语,描述它的一些数据结构。例如,“索引”表示索引。其实有点类似于数据库中的表,大概对应表的概念。比如你创建一个索引,用来存储帖子,然后它有id、title、content等几个字段,这个字段大致就是它的其中一个字段。然后还有一个概念,文档,代表索引中的一条数据。下面是一个文档,可以写入索引,在索引中算是一条数据。而写入es后,这段数据的内容会被拆分成倒排索引的数据格式来存储。idtitlecontent1Java好用吗?Java是一种非常非常好的语言。...4.Shard数据分片机制那么这个时候我们来思考一下。例如,您有一个索引来存储论坛中的帖子。现在论坛有1亿个帖子,占用1TB磁盘空间。这没关系。如果这个帖子有10亿、100亿,占用10TB,甚至100TB的磁盘空间怎么办?那你的索引的数据还能存到一台机器上吗?答案显然是否定的。这时候就必须支持这个索引的数据在多台机器上分布式存储,利用多台机器的磁盘空间来承载这么大的数据量。而且需要保证每台机器上这个索引存储的数据量不会太大,因为在单台机器上控制这个索引的数据量可以保证更高的搜索性能。所以这里引入一个概念:Shard数据分片结构。对于每个索引,您可以指定要创建的分片数量。每个分片都是一个数据分片,负责存储这个索引的部分数据。例如,索引中有3亿个帖子,占用3TB的数据。然后为该索引设置3个分片。那么每个shard可以包含一个1TB的数据切片,每个shard在集群中的一台机器上,这样就形成了用三台机器分布式存储一个索引的数据的效果。看下图:现在索引中的3TB数据分布存储在3台机器上,每台机器有一个shard,每个shard负责管理索引中1TB数据的分片。而且,还有一个好处是,假设我们要对这个索引的3TB数据进行搜索,是否可以向3台机器发送请求?三台机器上的分片可以直接分布式并行搜索部分数据,起到了分布式搜索的作用,大大提高了海量数据的搜索性能和吞吐量。5.Replica多副本数据冗余机制但是现在有个问题,如果三台机器中有一台宕机了,这时候怎么办呢?这个索引的3TB数据有1/3丢失了吗?因为上面的1TB数据碎片没有了。因此,也需要利用Replica多副本数据冗余机制来实现高可用。在Elasticsearch中,支持为每个索引设置一个replicanumber,即每个shard对应的replica副本数。比如你当前一个索引有3个shard,你为每个shard设置了一个replica,那么此时每个shard都会有一个replicashard。initialshard就是primaryshard,primaryshard和replicashard永远不会放在同一台机器上,以免一台机器宕机时丢失一个shard副本。我们再看下图感受一下:在上面提到的replica机制下,每个primaryshard在另一台机器上都有一个replicashard,任何一台机器宕机都可以保证数据不会丢失。分布式搜索引擎仍然可用。默认情况下,Elasticsearch支持每个索引有5个主分片,每个主分片有1个副本分片作为副本。六、文末总结,本文到此结束,接下来给大家做一个简单的总结。我们从搜索引擎的倒排索引开始,到单机无法承载海量数据,再到分布式搜索引擎的存储和搜索。然后我们以优秀的分布式搜索引擎ES为例,讲解了ES的数据结构、shard数据分片机制、replica多副本机制,讲解了分布式搜索引擎的架构原理。最后要强调的是,在Java面试中,尤其是高级Java面试中,分布式搜索引擎技术的考察越来越重要,因此这项技术的重要性不容小觑!