假如面试官和你死磕elasticSearch?

“你好,我是‘Elastic科技有限公司’的面试官,简单介绍一下你自己吧”,一道轻柔的声音响起,只见一名拥有着精致脸颊的女子,坐在会议桌旁,大大的眼睛一眨一眨地看着对面。
对面就是今天过来面试的应试者,小武。
“您好,我叫小武,我是来应试贵公司‘ElasticSearch工程师’岗位的,巴拉巴拉~’,小武有单害羞地说道,面对这么一个惊艳的女面试官,小武一时还不能适应。
“好的,那咱们今天的面试就正式开始吧,说说你对我们公司的了解?”,面试官轻轻地说道。
“贵公司致力于实时分析和搜索数据,核心产品是基于文档的分布式搜索分析引擎ElasticSearch,同时贵公司为了使人们更加容易地将es用于各个场景,推出了Elasitc Stack集成方案,这个方案中包含可视化组件kibana;能够同时从多个数据源采集,并最终发送给es的数据管道LogStash;还有最新的轻量型的单一功能数据采集器组合beats,使得搜索分析更加简单!”小武略带激动的说到。
“嗯…挺好的,那咱们就聊聊我们的核心产品ElasticSearch吧…”面试官柔声道。
“好的好的,一切听小姐姐安排~嘿嘿”,小武开心的说道。
“咱们一步一步来,首先,你知道ES的设计目标是什么吗?”
ES是一个分布式的搜索分析引擎,那么简单来说的话它的目标有两点,第一点就是分布式,ES致力于隐藏分布式的复杂性,将分片、副本、同步等分布式相关的东西都隐藏在自己的底层,对于用户时无感知的,在这个大数据时代是占有绝对优势的。第二点就是搜索分析,ES致力于更加快速更加多维度的搜索分析功能,以满足更多场景的需求。
“那你知道它是如何实现这两个目标的吗?”
“我先说一下ES的分布式,它和redis很像,没有引入三方的协调组件,而是使用集群内部相互通信来进行协调。一个索引会有多个分片,分布在多个实例机器上,每个分片都会有多个副本,副本一般和主分片不会在同一台机器,多分片保证了可存储数据量的弹性,多副本保证了系统的高可用。通常我们可以根据数据量的大小来确定分片的数量(因为每个分片的数据容量都是有限的,20亿条数据),根据系统可用性的要求决定副本的数量。第二点搜索分析的话,它主要使用了lucene搜索引擎,将每个需要建立索引的字段都创建了倒排索引,这样就可以通过倒排索引快速地查询。”
“ES是如何在多分片环境下进行写入和读取的?”
“写入的话,和redis类似,主要是通过hash值和分片数进行取模来确定写入具体分片的,查询的话,会去连接所有分片所在的实例,将所有分片的数据都读取到之后,在客户端进行排序。”
“ES,或者说lucene的底层索引结构是什么样子的你知道吗?”
“lucene底层主要使用的是倒排索引,也就是说通过词来索引文档,这些词就组成了索引,而这些词的存储为了满足内存占用小,查询速度快的要求,采用了字典表的方式,并通过FST进行存储(term index使用FST term dictionary 使用有序数组)。”
“为什么不使用排序列表、hash表、跳表或者B+tree?”
“排序列表的话,插入删除复杂度都太高了,hash表占用的内存太大了,跳表支持不能很好地支持模糊查询,B+tree检索速度慢,需要多次和磁盘进行交互。”
“那FST有什么缺陷吗?”
“FST+有序数组的索引结构更新复杂度是比较高的,所以ES不建议有太多的更新”
“ES有什么优劣势你清楚吗?”
“ES的优势就是大数据量的搜索,可用通过很多种方式进行聚合分析,比如提供的桶聚合的方式。劣势的话就是我们刚刚说的更新比较慢,并且Es为了更新不影响性能,默认采用1s刷新一次磁盘的策略,这样会导致更新后的数据不能立即看到。再者ES并没有提供权限控制以及事务控制,这可能会导致在一些业务复杂的场景下无法使用。”
【假如面试官和你死磕elasticSearch?】“你觉得ES中有哪些思想是值得赞扬的?”
“ES在存储文档id(posting list)的过程中采用了很多巧妙的方式来减少存储,比如增量存储,roadring birmaps等方式,同时在查询的时候,也采用了一些巧妙的方式,比如使用跳表或者bitSet的方式来实现联合索引。”
“那你觉得未来世界数据存储的发展趋势会是什么样子的?”
“我觉的现在存储越来越向细分化了,之前我们不管什么样的数据,我们只要使用mysql就可以实现存储查询,但是现在为了更好地存储查询数据,不同的业务场景有了不同的存储方式,比如高并发写入非结构化数据场景的hbase,对搜索分析要求比较高的场景使用ES,对于时序数据场景我们可以使用时序数据库等等,这种细分化也就意味着我们可以更好地满足业务场景的要求,但是对于我们技术人员来说,对于这么多种存储方式的掌握也是一个挑战,所以我们要尽可能地掌握其中的原理以及规律,这样在未来多种多样的存储世界中才能游刃有余…”
“好的,那今天的面试到这里就结束了,你有什么需要问我的吗?”
“大概多久能知道我的面试结果哈?”小武小心翼翼地问道。
“你觉得我长得怎么样?”面试官突然反问到。
“啊…很漂亮啊”,小武愣了一下说到。
“肤浅!回去等通知吧…”
“????”
参考文章
ES官网
Lucene底层实现原理,它的索引结构

    推荐阅读