分布式搜索引擎的面试连环炮
- 倒排索引是什么
- lucene 和 es 的前世今生
- es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
- es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
- es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
- es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
面试题
es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
面试官心理分析
在搜索这块,lucene 是最流行的搜索库。几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗?现在早已经 out 了,因为现在很多项目都是直接用基于 lucene 的分布式搜索引擎—— ElasticSearch,简称为 es。
而现在分布式搜索基本已经成为大部分互联网行业的 Java 系统的标配,其中尤为流行的就是 es,前几年 es 没火的时候,大家一般用 solr。但是这两年基本大部分企业和项目都开始转向 es 了。
所以互联网面试,肯定会跟你聊聊分布式搜索引擎,也就一定会聊聊 es,如果你确实不知道,那你真的就 out 了。
如果面试官问你第一个问题,确实一般都会问你 es 的分布式架构设计能介绍一下么?就看看你对分布式搜索引擎架构的一个基本理解。
面试题剖析
elasticsearch设计的理念就是分布式搜索引擎,底层其实还是基于lucene的。
核心思想就是在多台机器上启动多个es进程实例,组成了一个es集群。
es中存储数据的基本单位是索引,比如说你现在要在es中存储一些订单数据,你就应该在es中创建一个索引,order_idx,所有的订单数据就都写到这个索引里面去,一个索引差不多就是相当于是mysql里的一张表。
index -> type -> mapping -> document -> field。
- index:index相当于mysql里里的一张表。
- type:type没法跟mysql里去对比,一个index里可以有多个type,每个type的彼此都是差不多的,但是有一些略微的区别。假设有一个index ,是订单索引,里面专门是放订单数据的。就好比说你在mysql中建表,有些订单是实物商品的订单,一件衣服,一双鞋子;有些订单是虚拟商品的订单,某些游戏点卡,话费充值。就两个订单大部分片段是一样的,但是少部分分段可能有略微的一些区别。所以就会在订单索引里,建两个类型,一个是实物商品订单类型,一个是虚拟商品订单类型,这两个类型大部分都是相同的,少部分是不一样的。很多情况下,一个index里可能就一个类型,但是确实如果说是一个index里有多个type的情况(注意,mapping types这个概念在ElasticSearch 7.X已被完全删除,详细说明可以参考官方文档),您可以认为index是一个类别的表,具体的每个类型代表mysql中的一个表。
- mapping :每个type有一个映射,如果您认为一个type是具体的一个表,index就代表多个type同属于的一个类型,而map就是这个类型的表结构定义,你在mysql中创建一个表,肯定是要定义表结构的,里面有什么区别,每个分开是什么类型。
- document :实际上你往索引里的一个类型里面写的一条数据,叫做一条文档,一条文档就代表了mysql中某个表里的一行,每个文档有多个字段,每个字段就代表了这个文档中的一个值。
接着你搞一个索引,这个索引可以拆分成多个shard,每个shard存储部分数据。
接着就是这个shard的数据实际是有多个备份,就是说每个shard都有一个primary shard,负责写入数据,但是还有几个replica shard。primary shard写入数据之后,会将数据同步到其他几个replica shard上去。
通过这个replica的方案,每个shard的数据都有多个备份,如果某个机器宕机了,没关系啊,还有别的数据副本在别的机器上呢。高可用了吧。
es集群多个节点,会自动选举一个节点为master节点,这个master节点其实就是干一些管理的工作的,比如维护索引元数据拉,负责切换primary shard和replica shard身份拉,之类的。
要是master节点宕机了,那么会重新选举一个节点为master节点。
如果是非master节点宕机了,那么会由master节点,让那个宕机节点上的primary shard的身份转移到其他机器上的replica shard。过了一段时间,你要是修复了那个宕机机器,重启了之后,master节点会控制将缺失的replica shard分配过去,同步后续修改的数据之类的,让集群恢复正常。
其实上述就是elasticsearch作为一个分布式搜索引擎最基本的一个架构设计