两个通宵熬出来的互联网大厂最新面试题收集整理1000道(二-ElasticSearch),欢迎点赞收藏!!!

6、仅针对需要分词的字段, 合理的设置分词器;

7、Mapping 阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。… ……

1.2、写入调优

1、写入前副本数设置为 0;

2、写入前关闭 refresh_interval 设置为-1, 禁用刷新机制;

3、写入过程中: 采取 bulk 批量写入;

4、写入后恢复副本数和刷新间隔;

5、尽量使用自动生成的 id。

1.3、查询调优

1、禁用 wildcard;

2、禁用批量 terms( 成百上千的场景);

3、充分利用倒排索引机制, 能 keyword 类型尽量 keyword;

4、数据量大时候, 可以先基于时间敲定索引再检索;

5、设置合理的路由机制。

1.4、其他调优

部署调优, 业务调优等。

上面的提及一部分, 面试者就基本对你之前的实践或者运维经验有所评估了。

2、倒排索引是什么


传统的我们的检索是通过文章, 逐个遍历找到对应关键词的位置。

而倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表 即为倒排索引。有了倒排索引, 就能实现 o( 1) 时间复杂度的效率检索文章了, 极大的提高了检索效率。

在这里插入图片描述

学术的解答方式:

倒排索引, 相反于一篇文章包含了哪些词, 它从词出发, 记载了这个词在哪些文档中出现过, 由两部分组成— — 词典和倒排表。

加分项: 倒排索引的底层实现是基于: FST( Finite State Transducer) 数据结构。lucene 从 4+版本后开始大量使用的数据结构是 FST。FST 有两个优点:

  1. 空间占用小。通过对词典中单词前缀和后缀的重复利用, 压缩了存储空间;

  2. 查询速度快。O(len(str))的查询时间复杂度。

3、索引数据多了怎么办,如何调优,部署


索引数据的规划, 应在前期做好规划, 正所谓“ 设计先行, 编码在后” , 这

样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他业务受到影响。

如何调优, 正如问题 1 所说, 这里细化一下:

3.1动态索引层面

基于模板+时间+rollover api 滚动创建索引, 举例: 设计阶段定义: blog 索引的模板格式为: blog_index_时间戳的形式, 每天递增数据。

这样做的好处: 不至于数据量激增导致单个索引数据量非常大, 接近于上线 2 的32 次幂-1, 索引存储达到了 TB+甚至更大。一旦单个索引很大, 存储等各种风险也随之而来, 所以要提前考虑+及早避免。

3.2存储层面

冷热数据分离存储,热数据( 比如最近 3 天或者一周的数据), 其余为冷数据。对于冷数据不会再写入新数据, 可以考虑定期 force_merge 加 shrink 压缩操作, 节省存储空间和检索效率。

3.3部署层面

一旦之前没有规划, 这里就属于应急策略。结合 ES 自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意: 如果之前主节点等规划合理, 不需要重启集群也能完成动态新增的。

4、如何实现Master 选举的?


  1. Elasticsearch 的选主是 ZenDiscovery 模块负责的, 主要包含 Ping( 节点之间通过这个 RPC 来发现彼此) 和 Unicast( 单播模块包含一个主机列表以控制哪些节点需要ping 通) 这两部分;

  2. 对所有可以成为 master 的节点( node.master: true) 根据 nodeId 字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个( 第 0 位) 节点, 暂且认为它是 master 节点。

  3. 如果对某个节点的投票数达到一定的值( 可以成为 master 节点数 n/2+1) 并且该节点自己也选举自己, 那这个节点就是 master。否则重新选举一直到满足上述条件。

  4. 补充: master 节点的职责主要包括集群、节点和索引的管理, 不负责文档级别的管理; data 节点可以关闭 http 功能*。

5、详细描述一下Elasticsearch 索引文档的过程


这里的索引文档应该理解为文档写入 ES, 创建索引的过程。文档写入包含:单文档写入和批量 bulk 写入,这里只解释一下:单文档写入流程。记住官方文档中的这个图。

在这里插入图片描述

第一步:客户写集群某节点写入数据,发送请求。( 如果没有指定路由/协调节点, 请求的节点扮演路由节点的角色。)

第二步: 节点 1 接受到请求后, 使用文档_id 来确定文档属于分片 0。请求会被转到另外的节点, 假定节点 3。因此分片 0 的主分片分配到节点 3 上。

第三步: 节点 3 在主分片上执行写操作, 如果成功, 则将请求并行转发到节点 1 和节点 2 的副本分片上, 等待结果返回。所有的副本分片都报告成功, 节点 3 将向协调节点

( 节点 1) 报告成功, 节点 1 向请求客户端报告写入成功。

如果面试官再问: 第二步中的文档获取分片的过程?

回答:借助路由算法获取,路由算法就是根据路由和文档 id 计算目标的分片 id 的过程。

1shard = hash(_routing) % (num_of_primary_shards)

6、详细描述一下Elasticsearch 搜索的过程?


搜索拆解为“ query then fetch” 两个阶段。

query 阶段的目的: 定位到位置, 但不取。步骤拆解如下:

  1. 假设一个索引数据有 5 主+1 副本 共 10 分片, 一次请求会命中( 主或者副本分片中) 的一个。

  2. 每个分片在本地进行查询, 结果返回到本地有序的优先队列中。

  3. 第 2) 步骤的结果发送到协调节点, 协调节点产生一个全局的排序列表。

fetch 阶段的目的: 取数据。

路由节点获取所有文档, 返回给客户端。

7、在部署时,对Linux 的设置有哪些优化方法


1、64 GB 内存的机器是非常理想的, 但是 32 GB 和 16 GB 机器也是很常见的。少于 8 GB 会适得其反。

2、如果你要在更快的 CPUs 和更多的核心之间选择, 选择更多的核心更好。多个内核提供的额外并发远胜过稍微快一点点的时钟频率。

3、如果你负担得起 SSD, 它将远远超出任何旋转介质。 基于 SSD 的节点, 查询和索引性能都有提升。如果你负担得起, SSD 是一个好的选择。

4、即使数据中心们近在咫尺, 也要避免集群跨越多个数据中心。绝对要避免集群跨越大的地理距离。

5、请确保运行你应用程序的 JVM 和服务器的 JVM 是完全一样的。 在Elasticsearch 的几个地方, 使用 Java 的本地序列化。

6、通过设置 gateway.recover_after_nodes、gateway.expected_nodes、gateway.recover_after_time 可以在集群重启的时候避免过多的分片交换, 这可能会让数据恢复从数个小时缩短为几秒钟。

7、Elasticsearch 默认被配置为使用单播发现, 以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。最好使用单播代替组播。

8、不要随意修改垃圾回收器( CMS) 和各个线程池的大小。

9、把你的内存的( 少于) 一半给 Lucene( 但不要超过 32 GB!), 通过ES_HEAP_SIZE 环境变量设置。

10、内存交换到磁盘对服务器性能来说是致命的。如果内存交换到磁盘上, 一个

100 微秒的操作可能变成 10 毫秒。 再想想那么多 10 微秒的操作时延累加起来。 不难看出 swapping 对于性能是多么可怕。

11、Lucene 使用了大量的文件。同时, Elasticsearch 在节点和 HTTP 客户端之间进行通信也使用了大量的套接字。 所有这一切都需要足够的文件描述符。你应该增加你的文件描述符, 设置一个很大的值, 如 64,000。

补充: 索引阶段性能提升方法

1、使用批量请求并调整其大小: 每次批量数据 5– 15 MB 大是个不错的起始点。

2、存储: 使用 SSD

3、段和合并:Elasticsearch 默认值是 20 MB/s,对机械磁盘应该是个不错的设置。如果你用的是 SSD,可以考虑提高到 100– 200 MB/s。如果你在做批量导入, 完全不在意搜索, 你可以彻底关掉合并限流。另外还可以增加

index.translog.flush_threshold_size 设置, 从默认的 512 MB 到更大一些的值, 比如1 GB, 这可以在一次清空触发的时候在事务日志里积累出更大的段。

4、如果你的搜索结果不需要近实时的准确度, 考虑把每个索引的index.refresh_interval 改到 30s。

5、如果你在做大批量导入,考虑通过设置 index.number_of_replicas: 0 关闭副本。

8、lucence 内部结构是什么?


在这里插入图片描述

Lucene 是有索引和搜索的两个过程, 包含索引创建,索引, 搜索三个要点。可以基于这个脉络展开一些。

最近面试一些公司,被问到的关于 Elasticsearch 和搜索引擎相关的问题,以及自己总结的回答。

9、实际场景问题


Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个master,另外 10 个选了另一个master,怎么办?

1、当集群 master 候选数量不小于 3 个时, 可以通过设置最少投票通过数量( discovery.zen.minimum_master_nodes) 超过所有候选节点一半以上来解决脑裂问题;

2、当候选数量为两个时, 只能修改为唯一的一个 master 候选, 其他作为 data 节点, 避免脑裂问题。

10、客户端在和集群连接时,如何选择特定的节点执行请求的?


TransportClient 利用 transport 模块远程连接一个 elasticsearch 集群。它并不加入到集群中,只是简单的获得一个或者多个初始化的 transport 地址,并以 轮询 的方式与这些地址进行通信。

11、详细描述一下 Elasticsearch 索引文档的过程。


协调节点默认使用文档 ID 参与计算( 也支持通过 routing), 以便为路由提供合适的分片。

shard = hash(document_id) % (num_of_primary_shards)

  1. 当分片所在的节点接收到来自协调节点的请求后, 会将请求写入到 Memory Buffer, 然后定时( 默认是每隔 1 秒)写入到 Filesystem Cache,这个从 Momery Buffer 到Filesystem Cache 的过程就叫做 refresh;

  2. 当然在某些情况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会丢失, ES 是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时, 才会清除掉, 这个过程叫做 flush;

  3. 在 flush 过程中, 内存中的缓冲将被清除, 内容被写入一个新段, 段的 fsync 将创建一个新的提交点, 并将内容刷新到磁盘, 旧的 translog 将被删除并开始一个新的translog。

  4. flush 触发的时机是定时触发( 默认 30 分钟) 或者 translog 变得太大( 默认为512M) 时;

在这里插入图片描述

补充: 关于 Lucene 的 Segement:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
54671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

[外链图片转存中…(img-y2wv01qB-1711875760171)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值