互联网Java工程师面试题·Elasticsearch 篇·第一弹

news2024/11/18 7:47:08

目录

1、elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。

1.1  设计阶段调优

1.2  写入调优

1.3  查询调优

1.4  其他调优

2、elasticsearch 的倒排索引是什么

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

3.1 动态索引层面

3.2 存储层面

3.3 部署层面

4、elasticsearch 是如何实现 master 选举的

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

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

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

8、lucence 内部结构是什么?

9、Elasticsearch 是如何实现 Master 选举的?

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

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


1、elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。

面试官 :想了解应聘者之前公司接触的 ES 使用场景、规模,有没有做过比较大规模的索引设计、规划、调优。
解答
如实结合自己的实践场景回答即可。
比如: ES 集群架构 13 个节点,索引根据通道不同共 20+ 索引,根据日期,每日递增 20+ ,索引: 10 分片,每日递增 1 亿 + 数据,每个通道每天索引大小控制:150GB 之内。
仅索引层面调优手段:

1.1  设计阶段调优

1 、根据业务增量需求,采取基于日期模板创建索引,通过 roll over API 滚动索引;
2 、使用别名进行索引管理;
3 、每天凌晨定时对索引做 force_merge 操作,以释放空间;
4 、采取冷热分离机制,热数据存储到 SSD ,提高检索效率;冷数据定期进行 shrink操作,以缩减存储;
5 、采取 curator 进行索引的生命周期管理;
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  其他调优

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

2elasticsearch 的倒排索引是什么

面试官 :想了解你对基础概念的认知。
解答 :通俗解释一下就可以。
传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置。
而倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典 + 映射表,即为倒排索引。
有了倒排索引,就能实现 o 1 )时间复杂度 的效率检索文章了,极大的提高了检索效率。
学术的解答方式:
倒排索引,相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成—— 词典和倒排表。
加分项 :倒排索引的底层实现是基于: FST Finite State Transducer )数据结构。
lucene 4+ 版本后开始大量使用的数据结构是 FST FST 有两个优点:
1 、空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;
2 、查询速度快。 O(len(str)) 的查询时间复杂度。

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

面试官 :想了解大数据量的运维能力。
解答 :索引数据的规划,应在前期做好规划,正所谓 设计先行,编码在后 ,这样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他业务受到影响。
如何调优,正如问题 1 所说,这里细化一下:

3.1 动态索引层面

基于 模板 + 时间 +rollover api 滚动 创建索引,举例:设计阶段定义: blog 索引的模板格式为:blog_index_ 时间戳的形式,每天递增数据。
这样做的好处:不至于数据量激增导致单个索引数据量非常大,接近于上线 2 的32 次幂 -1 ,索引存储达到了 TB+ 甚至更大。
一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑 + 及早避免。

3.2 存储层面

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

3.3 部署层面

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

4elasticsearch 是如何实现 master 选举的

面试官 :想了解 ES 集群的底层原理,不再只关注业务层面了。
解答
前置前提:
1 、只有候选主节点( master true )的节点才能成为主节点。
2 、最小主节点数( min_master_nodes )的目的是防止脑裂。
这个我看了各种网上分析的版本和源码分析的书籍,云里雾里。
核对了一下代码,核心入口为 findMaster ,选择主节点成功返回对应 Master ,否则返回 null 。选举流程大致描述如下:
第一步:确认候选主节点数达标, elasticsearch.yml 设置的值
discovery.zen.minimum_master_nodes
第二步:比较:先判定是否具备 master 资格,具备候选主节点资格的优先返回;若两节点都为候选主节点,则 id 小的值会主节点。注意这里的 id string 类型。

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

面试官 :想了解 ES 的底层原理,不再只关注业务层面了。
解答
这里的索引文档应该理解为文档写入 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 搜索的过程?

面试官 :想了解 ES 搜索的底层原理,不再只关注业务层面了。
解答
搜索拆解为 “query then fetch” 两个阶段。
query 阶段的目的:定位到位置,但不取。
步骤拆解如下:
1 、假设一个索引数据有 5 +1 副本 共 10 分片,一次请求会命中(主或者副本分片中)的一个。
2 、每个分片在本地进行查询,结果返回到本地有序的优先队列中。
3 、第 2 )步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。
fetch 阶段的目的:取数据。
路由节点获取所有文档,返回给客户端。

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

面试官 :想了解对 ES 集群的运维能力。
解答
1 、关闭缓存 swap;
2 、堆内存设置为: Min (节点内存 /2, 32GB ;
3 、设置最大文件句柄数;
4 、线程池 + 队列大小根据业务需要做调整;
5 、磁盘存储 raid 方式 —— 存储有条件使用 RAID10 ,增加单节点性能以及避免单节点存储故障。

8lucence 内部结构是什么?

面试官 :想了解你的知识面的广度和深度。
解答
        Lucene 是有索引和搜索的两个过程,包含索引创建,索引,搜索三个要点。可以基于这个脉络展开一些。
        最近面试一些公司,被问到的关于 Elasticsearch 和搜索引擎相关的问题,以及自己总结的回答。

9Elasticsearch 是如何实现 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 功能 *

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

1 、当集群 master 候选数量不小于 3 个时,可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes )超过所有候选节点一半以上来解决脑裂问题;
2 、当候选数量为两个时,只能修改为唯一的一个 master 候选,其他作为 data节点,避免脑裂问题。

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

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

要想了解更多:

千题千解·Java面试宝典_时光の尘的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1062977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ToDoList使用自定义事件传值

MyTop与MyFooter与App之间传递数据涉及到的就是子给父传递数据,MyList和MyItem与App涉及到爷孙传递数据。 之前的MyTop是使用props接收App传值,然后再在methods里面调用,现在使用自定义事件来处理子组件和父组件之间传递数据。 图是之前的…

新款UI动态壁纸头像潮图小程序源码

新款UI动态壁纸头像潮图小程序源码,不需要域名服务器,直接添加合法域名,上传发布就能使用。 可以对接开通流量主,个人也能运营,不需要服务器源码完整。整合头像,动态壁纸,文案功能齐全。 源码…

代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

本文思路和详细讲解来自于:代码随想录 (programmercarl.com) LeetCode T102 二叉树的层序遍历 题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode) 题目思路: 本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建…

芯驰D9评测(3)--建立开发环境

1. 建立交叉编译链接环境 官网下载的SDK包中就有交叉工具链,米尔提供的这个 SDK 中除了包含各种源代码外还提供了必要的交叉工具链,可以直接用于编译应用程序等。 用户可以直接使用次交叉编译工具链来建立一个独立的开发环境,可单独编译…

发光文字跟随鼠标

效果展示 CSS / JavaScript 知识点 background-image 绘制网格背景filter 属性的运用onmousemove 事件运用getBoundingClientRect 方法的运用 实现页面基础结构 <!-- 光标 --> <div class"cursour"></div>实现网格背景样式 body {min-height: …

如何用 Tana AI 一站式批量润色整理音频笔记?

&#xff08;注&#xff1a;本文为小报童精选文章&#xff0c;已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 用好 Tana AI Builder &#xff0c;充分体验和发挥 AI 工作流的强大性能。 痛点 作为一个足够懒惰的写作者&#xff0c;我对音频转文本这事儿…

智慧公厕如何实现?

随着城市化进程的加速&#xff0c;人们对公共设施的需求也日益增长。而公厕&#xff0c;作为城市基础设施的一部分&#xff0c;扮演着重要的角色。然而&#xff0c;传统的公厕存在着诸多问题&#xff0c;例如管理不善、环境脏乱等&#xff0c;给人们的生活带来了不便。为了改善…

笔试强训Day13

T1&#xff1a;跳石板 [小易来到了一条石板路前&#xff0c;每块石板上从1挨着编号为&#xff1a;1、2、3....... 这条石板路要根据特殊的规则才能前进&#xff1a;对于小易当前所在的编号为K的 石板&#xff0c;小易单次只能往前跳K的一个约数(不含1和K)步&#xff0c;即跳…

【LeetCode刷题笔记】双指针

剑指 Offer 21.调整数组顺序使奇数位于偶数前面 解题思路&#xff1a; 对撞指针 &#xff0c; 从左边不停的找第一个偶数&#xff0c;从右边不停的找第一个奇数 &#xff0c;找到后 交换 两者位置 本题与【905. 按奇偶排序数组】几乎雷同。 剑指 Offer 57.和为s的两个数字 本题…

SpringCloud-消息组件

1 简介 了解过RabbitMQ后&#xff0c;可能我们会遇到不同的系统在用不同的队列。比如系统A用的Kafka&#xff0c;系统B用的RabbitMQ&#xff0c;但是没了解过Kafka&#xff0c;因此可以使用Spring Stream&#xff0c;它能够屏蔽地产&#xff0c;像JDBC一样&#xff0c;只关心SQ…

超聚变安装银河麒麟服务器系统ky10-server-x86

超聚变-通过BMC口进服务器管理界面 如下图为BMC管理口&#xff1a; 默认BMC口IP&#xff1a;https://192.168.2.100 l浏览器打开网页&#xff0c;输入用户名和密码 登陆后&#xff0c;如下图红框处&#xff0c;选择“启动虚拟控制台”——选择“HTML集成远程控制台” 系统银河麒…

绘画的颜料

Alcohol Ink 酒精油墨 酒精墨水风格是一种绘画技术&#xff0c;使用酒精为基础的墨水创造出充满活力和丰富多彩的设计。 墨水是半透明的&#xff0c;可以分层以达到深度和复杂性。 Alcohol ink painting of a husky, side viewAcrylic 丙烯颜料 色彩鲜艳的多功能涂料。它可以…

基于Java的蛋糕甜品系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&…

Seata 源码篇之AT模式启动流程 - 下 - 04

Seata 源码篇之AT模式启动流程 - 下 - 04 全局事务提交分支事务全局提交全局事务回滚分支事务全局回滚小结 本系列文章: Seata 源码篇之核心思想 - 01Seata 源码篇之AT模式启动流程 - 上 - 02Seata 源码篇之AT模式启动流程 - 中 - 03 上一篇文章&#xff0c;我们看了Seata AT…

全志ARM926 Melis2.0系统的开发指引⑧

全志ARM926 Melis2.0系统的开发指引⑧ 编写目的12.5. 应用程序编写12.5.1. 简单应用编写12.5.1.1. 注册应用12.5.1.2. 创建管理窗口12.5.1.3. 实现管理窗口消息处理回调函数12.5.1.4. 创建图层12.5.1.5. 创建 framewin12.5.1.6. 实现 framewin 消息处理回调函数 -. 全志相关工具…

JavaScript系列从入门到精通系列第十五篇:JavaScript中函数的实参介绍返回值介绍以及函数的立即执行

文章目录 一&#xff1a;函数的参数 1&#xff1a;形参如何定义 2&#xff1a;形参的使用规则 二&#xff1a;函数的返回值 1&#xff1a;函数返回值如何定义 2&#xff1a;函数返回值种类 三&#xff1a;实参的任意性 1&#xff1a;方法可以作为实参 2&#xff1a;将匿…

Next.js 入门笔记

前言 之前初步体验了 React 的魅力, 又看文档理解了一下 useState 和 useEffect, 目前初步理解的概念是: useState 用来声明在组件中使用并且需要修改的变量 useEffect 用来对 useState 声明的变量进行初始化赋值 可能理解的不太准确, 不过大概差不多是这么个意思. 但是再往后…

Qt之显示PDF文件

之前使用过mupdf库&#xff0c;能够成功显示pdf&#xff0c;但是我用着有BUG&#xff0c;不太理解它的代码&#xff0c;搞了好久都不行。后面又试了其他库&#xff0c;如pdfium、popler、下载了很多例程&#xff0c;都跑不起来&#xff01;后面偶然得知xpdf库&#xff0c;看起来…

【C++设计模式之建造者模式:创建型】分析及示例

简介 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 描述 建造者模式通过将一个复杂对象的构建过程拆分成多个简单的部分&#xff0c;并由不同…

华为云云耀云服务器L实例评测|部署个人音乐流媒体服务器 navidrome

华为云云耀云服务器L实例评测&#xff5c;部署个人音乐流媒体服务器 navidrome 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 产品优势1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 navidrome3.1 navidrome 介绍3.…