Java ElasticSearch面试题

Java ES-ElasticSearch面试题

  • 前言
  • 1、ElasticSearch是什么?
  • 2. 说说你们公司ES的集群架构,索引数据大小,分片有多少 ?
  • 3. ES的倒排索引是什么?
  • 4. ES是如何实现 master 选举的?
  • 5. 描述一下 ES索引文档的过程:
  • 6、文档从接收到写入磁盘过程:
  • 7、ES在部署时,有哪些优化方法?
  • 8、ES中的节点(比如共 20 个),其中的 10 个选了一个 master,另外 10 个选了另一个 master,怎么办?
  • 9、详细描述一下 ES更新和删除文档的过程:
  • 10、在并发情况下,ES如果保证读写一致?
  • 11、如何避免订单重复提交?
  • 12、说一下HTTP和HTTPS的区别?
  • 13、什么是数字证书?
  • 14、说说TCP与UDP的区别,以及各自的优缺点
  • 15、你设计库表时会考虑哪些问题?
  • 16、说一下你对设计模式的理解?
  • 17、cpu高或者内存高,是怎去排查的问题?
  • 18、你们JVM启动参数怎么设置的,大小怎么配置?
  • 19、CMS简介?
  • 20、SPI 机制了解吗?
  • 总结


前言

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。

如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!

1、ElasticSearch是什么?

  • Elasticsearch是一个开源的分布式全文搜索引擎,它可以近乎实时的存储、检索数据。

2. 说说你们公司ES的集群架构,索引数据大小,分片有多少 ?

提供一组真实生产环境数据供参考:
379万数据;每条数据字符数大概是400个英文字母;1个副本、5个分片;占用空间1.53G(也就是es-head看到的索引大小);每个节点的esdata目录大小:2.1G;

3. ES的倒排索引是什么?

传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置。
倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表即为倒排索引。有了倒排索引,检索文章的时间复杂度是 o(1),极大的提高了检索效率。

4. ES是如何实现 master 选举的?

ES的选主是ZenDiscovery模块负责,对所有可以成为Master的节点(node.master: true)根据 nodeId 排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是 Master 节点。
如果对某个节点的投票数超过一半,并且该节点自己也选举自己,那这个节点就是master,否则重新选举。

5. 描述一下 ES索引文档的过程:

  • 1、客户端向 Node 1 发送新建、索引或者删除请求;
  • 2、节点使用文档id 确定文档属于分片 0 ,请求会被转发到 Node 3,因为分片 0 的主分片目前被分配在 Node 3 上;
  • 3、Node 3 在主分片上面执行请求,如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上;
  • 4、一旦所有的副本分片都报告成功, Node 3 就向协调节点报告成功,协调节点向客户端报告成功。

6、文档从接收到写入磁盘过程:

  • 1、当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 MemoryBuffer,然后定时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从 MomeryBuffer 到 Filesystem Cache 的过程就叫做 refresh;
  • 2、在某些情况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会丢失,ES 是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时,才会清除掉,这个过程叫做 flush;
  • 3、在flush过程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync将创建一个新的提交点,并将内容刷新到磁盘,旧的translog将被删除并开始一个新的 translog;
  • 4、flush触发的时机是定时触发(默认30分钟)或者translog变得太大(默认为512M)时;
    (1. translog 可以理解为就是一个文件,一直追加;MemoryBuffer 应用缓存; Filesystem Cache系统缓冲区)

7、ES在部署时,有哪些优化方法?

  • 1、关闭缓存swap:
    原因:大多数操作系统会将内存使用到文件系统缓存,会将应用程序未用到的内存交换出去。会导致jvm的堆内存交换到磁盘上。交换会导致性能问题。会导致内存垃圾回收延长。会导致集群节点响应时间变慢,或者从集群中断开。
  • 2、堆内存设置为:Min(节点内存/2, 32GB);
  • 3、设置最大文件句柄数

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

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

9、详细描述一下 ES更新和删除文档的过程:

  • 1、删除和更新也都是写操作,但是ES中的文档是不可变的,因此不能被删除或者改动以展示其变更;(原因是底层lucene的segment段文件不可更新删除)
    磁盘上的每个段都有一个相应的 .del 文件,当删除请求发送后,文档并没有真 的被删除,而是在 .del 文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del 文件中被标记为删除的文档将不会被写入新段。
  • 2、在新的文档被创建时,ES会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。
    旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。

10、在并发情况下,ES如果保证读写一致?

  • 1、可以通过乐观锁使用版本号并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;
  • 2、对于写操作,一致性级别支持 quorum/one/all,默认为 quorum(指定人数),即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建;
  • 3、对于读操作,可以设置replication为 sync(默认同步),这使得操作在主分片和副本分片都完成后才会返回;如果设置 replication 为 async(异步) 时,也可以通过设置搜索请求参数_preference 为 primary 来查询主分片,确保文档是最新版本。

11、如何避免订单重复提交?

  • 1、前端做防重复提交,限制100ms只能请求一次;
  • 2、在提交订单页面之前,先去后端服务获取一个token令牌,后端服务可以令牌放在redis中,前端提交订单后,后端会先去redis查看令牌是否存,如果存在则创建订单成功,同时删除该令牌,如果不存在,就拒绝请求,返回提示信息。

12、说一下HTTP和HTTPS的区别?

  • 1、安全性:HTTP协议是明文传输数据的,因此不够安全,容易被黑客攻击拦截、篡改数据。而HTTPS通过SSL/TLS协议对数据进行加密传输,可以保证数据的安全性,防止数据被窃取和篡改;
  • 2、数据传输方式: HTTP使用的是明文传输,数据包裹在请求报文和响应报文中,传输过程中可能会被拦截和篡改,而HTTPS通过TLS协议对数据进行加密传输,因此需要额外的SSL/TLS协议进行加解密操作,会比HTTP多消耗一些系统资源;
  • 3、端口号:HTTP默认使用80端口进行通信,而HTTPS默认使用443端口进行通信;
  • 4、数字证书:在HTTPS通信中,服务端需要提供数字证书,证书中包含了公钥和域名等信息,客户端通过验证证书的有效性,可以确认自己连接的是正确的服务器。
    总的来说,HTTPS相比于HTTP具有更高的安全性,适合于需要保护用户隐私信息的场景。而HTTP则适用于一些不需要传输敏感数据的场景,例如一些公开的网站、博客等。

13、什么是数字证书?

  • 客户端向服务端发起身份验证请求的一种证书,数字证书在许多相互认证设计中起着非常重要的作用,为请求者的身份提供了强有力的保证。

14、说说TCP与UDP的区别,以及各自的优缺点

  • 1、连接性:TCP在通信之前必须要三次握手建立连接,而UDP是无连接的协议,通信双方不需要建立连接就可以进行数据传输;
  • 2、可靠性:TCP是一种可靠的协议,它可以保证数据的完整性和准确性,而UDP不能保证可靠性,数据可能会丢失;
  • 3、效率:由于TCP需要建立连接、进行错误检测等操作,所以效率较低,而UDP的效率较高,因为它不需要建立连接;
  • 4、传输方式:TCP是面向字节流的协议,数据在传输过程中会被分成小的数据包进行传输,而UDP是面向数据包的协议,每个数据包都是独立的,互不干扰;
    适用场景:由于TCP具有可靠性和连接性,适合用于传输要求可靠的数据,例如网页、电子邮件、文件传输等。而UDP适合用于传输实时性要求较高、数据量较小的数据,例如文本、音频等;

15、你设计库表时会考虑哪些问题?

字段的长度问题、创建的表的字段是否规范、风格是否和项目组统一、后续扩展问题、以及当前表的数据量级问题、后续的优化等。

16、说一下你对设计模式的理解?

设计模式是针对软件开发中经常遇到的一些设计问题,而总结出来的一套实用的解决方案或者设计思想,提高了代码的复用性和可扩展性。
设计模式的六大原则:

  • 1.开闭原则:有开有闭原则,对扩展开放,但是对修改关闭;
  • 2.里氏代换原则:子类可以扩展父类的功能,但不能改变原有父类的功能;
  • 3.依赖倒转原则:依赖依于接口或者抽象类而不赖于实现类;
  • 4.接口隔离原则:使用多个相互隔离的接口开发,比使用单个接口要好;
  • 5.迪米特法则:最少知道原则,尽量降低类与类之间的耦合;
  • 6.合成复用原则:通过将已有对象作为新对象的成员属性,新对象可以调用已有对象的功能,从而达到复用。

17、cpu高或者内存高,是怎去排查的问题?

原因:可能是业务代码死循环、GC频繁、线程阻塞等;

  • 1.执行top命令,查看CPU占用过高的进程(按M可以排序);
    在这里插入图片描述
  • 2.根据pid找到对应cpu占用最多的Java线程:top -Hp 4861;
    在这里插入图片描述
  • 3.将10进制线程id转换为16进制:
    在这里插入图片描述
  • 4.通过jstack 命令找到对应问题现场堆栈信息:jstack 4851|grep 12fd -C 10
    查看线程运行状态和定位问题代码行数;如果有死锁会出现deadlock关键字;
    如果线程阻塞,会出现BLOCKED关键字;
  • 5.查看进程GC情况:jstat -GCutil <进程号> <统计间隔毫秒> <统计次数>
    查看某进程GC持续变化情况,如果发现返回中FGC很大且一直增大,就是FGC;
  • 6.出dump文件:jmap -dump:format=b,file=filename < PID >
    导出某进程下内存heap到文件中,通过jdk自带 visualvm 或者 mat 工具查看内存中程序实例个数。

18、你们JVM启动参数怎么设置的,大小怎么配置?

java -Xms2048m -Xmx2048m -Xmn700m -Xss512K 
-XX:MaxMetaspaceSize=200m -XX:MetaspaceSize=200m -XX:ParallelGCThreads=8
-XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+
-XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=/usr/local/OutOfMemory.hprof
-jar lugu-portal-1.1.jar

可以看到堆内存为2G,新生代为700M,老年代为1348M,元数据区是200M;
UseParNewGC:新生代使用ParNew回收器,UseConcMarkSweepGC:老年代使用CMS算法;
线程栈为512k(默认1024k调小可以增加创建线程数,增加并发量);
同时打印 GC 详细信息和打印 GC 发生时间,当发生OOM时,Dump文件到指定路径。

19、CMS简介?

CMS是一款基于并发、使用标记清除算法的垃圾回收算法,只针对老年代进行垃圾回收,会尽可能让GC线程和用户线程并发执行,以达到降低STW时间的目的。
原理是通过可达性分析算法(GC Root对象)。

  • 能与CMS搭配使用的新生代垃圾收集器有Serial收集器和ParNew收集器。这2个收集器都采用标记复制算法,都会触发STW事件,停止所有的应用线程。不同之处在于,Serial是单线程执行,ParNew是多线程执行。
  • 缺点:容易产生内存碎片和浮动垃圾(在并发清除过程中,由于用户线程也在不断的运行,所以会产生一些垃圾对象),由于CMS支持与用户线程并行,所以会与用户线程进行CPU资源争夺。

20、SPI 机制了解吗?

spi全称为 (Service Provider Interface),是JDK内置的一种服务提供机制,用于提升接口的可扩展性,可以降低模块之间的解耦和相互依赖。
spi的工作原理:

  • 1.服务的提供方对调用方的接口提供了一种实现, 在jar包中resource的META-INF/services目录下创建一个接口的全限定名的文件,该文件的内容是是实现类的全限定名;
  • 2.在主程序中使用java.util包中的ServiceLoader加载该接口从而获取该实现类;
  • 3.实现类要带一个无参构造;

总结

都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?

目录 PodKubernetes 网络模型同一Pod上的容器之间进行通信同一Node上的不同Pod之间进行通信不同Node上的Pod之间进行通信Service参考 Pod 首先来回顾一下Pod&#xff1a; Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载&#xff0c;并封装一…

mybatisPlus中 Mapper层以及Service层的方法 整理分类 以及代码实操

MyBatis-Plus是一个基于MyBatis的增强工具&#xff0c;旨在简化开发、提高效率。它提供了通用的mapper和service&#xff0c;可以在不编写任何SQL语句的情况下&#xff0c;快速实现对单表的CRUD、批量、逻辑删除、分页等操作。 功能代码测试前提&#xff1a; 需要对mybatisPl…

git介绍4.2

git(版本控制工具) 一、git 介绍 1、git是目前世界上最先进的分布式版本控制系统&#xff0c;可以有效&#xff0c;高速的处理从小到大的项目版本管理。 2、git是linux torvalds 为了帮助管理linux内核开发二开发的一个开放源码的版本控制软件。 3、git作用&#xff1a;更好…

Kubernetes(k8s第二部分)

资源清单相当于剧本 什么是资源&#xff1a; k8s中所有的内容都抽象为资源&#xff0c;资源实例化后&#xff0c;叫做对象。 1.K8S中的资源 集群资源分类 名称空间级别&#xff1a; kubeadm k8s kube-system kubectl get pod -n default 工作负载型资源&#xff0c;&a…

光栅化算法

多数计算机图形图像&#xff0c;是通过光栅显像显示给用户的&#xff0c;这种系统将图像作为像素阵列进行显示&#xff0c;像素&#xff08;pixel&#xff09;即图像元素&#xff08;picture element&#xff09;的简称。这些像素采用RGB颜色空间。本文讨论光栅显像的基本原理&…

基于ceph-deploy部署Ceph 集群

Ceph分布式存储一、存储基础1、单机存储设备1.1 单机存储的问题 2、分布式存储(软件定义的存储SDS)2.1 分布式存储的类型 二、Ceph简介1、Ceph优势2、Ceph架构3、Ceph 核心组件4、OSD 存储后端5、Ceph 数据的存储过程6、Ceph 版本发行生命周期 三、Ceph 集群部署1、 基于 ceph-…

【软考】数据结构之队列和栈

目录 1.例题一1.1题目1.2 题目截图1.3 题目分析 1.例题一 1.1题目 输出受限的双端队列是指元素可以从队列的两端输入&#xff0c;但只能从队列的一端输出&#xff0c;如下图所示&#xff0c;若有e1&#xff0c;e2&#xff0c;e3&#xff0c;e4依次进入输出受限的双端队列&…

基于JAVA的生鲜超市销售系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 商品档案模块2.2 商品进货模块2.3 商品销售模块2.4 供应商模块2.5 活动管理模块2.6 消息通知模块 三、系统展示四、核心代码4.1 查询商品4.2 商品入库4.3 商品出库4.4 查询商品类型4.5 查询店铺活动 五、免责说明 一、摘…

137.乐理基础-协和音程、不协和音程

内容参考于&#xff1a; 三分钟音乐社 上一个内容&#xff1a;136.旋律音程、和声音程、自然音程、变化音程 上一个内容里练习的答案&#xff1a; 所有音程都可以分成协和音程与不协和音程两大类 协和音程又分三个小类&#xff1a; 第一个小类叫极完全协和音程&#xff0c;就…

Vue Html中插入本地视频(Video 标签)

在 Vue 中插入本地视频可以通过使用标签来实现。你可以将视频文件放在你的项目中的合适位置&#xff08;比如assets文件夹&#xff09;&#xff0c;然后在 Vue 组件中引用这个视频文件。html同理 首先&#xff0c;在你的 Vue 项目中的assets文件夹下放入你的视频文件&#xff…

十四、 修改报名名单

描述 GG Bond和牛妹报名了牛客运动会的双人项目&#xff0c;但是由于比赛前一天牛妹身体不适&#xff0c;不能参加第二天的运动&#xff0c;于是想让牛可乐代替自己。 请创建一个依次包含字符串Niuniu和Niumei的元组entry_form&#xff0c;并直接输出整个元组。 然后尝试使用…

MyBatis的补充用法

说明&#xff1a;之前介绍过MyBatis的用法&#xff0c;像 用注解和Mapper.xml操作数据库、在Mapper.xml里写动态SQL。最近在一次用MyBatis批量更新数据库对象的场景中&#xff0c;意识到对MyBatis的一些标签用法不太熟悉&#xff0c;所以去 MyBatis官网 看了一些文档&#xff0…

综合交易模型----可转债双低策略自动轮动实盘,提供源代码

原理 量化研究---可转债双低策略原理 文章链接 综合交易模型----可转债双低策略自动轮动实盘&#xff0c;提供源代码 (qq.com) 就是按照值来轮动&#xff0c;轮动规则 规则 "策略轮动设置":"策略轮动设置************************,轮动都按排名来", &…

界面控件Telerik UI for ASP. NET Core教程 - 如何为网格添加上下文菜单?

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 上下文菜单允许开发者为应…

web服务器nginx下载及在win11的安装

一.背景 还是为了公司安排的师带徒任务。 操作系统版本&#xff1a;win11 家庭版 mginx版本&#xff1a;1.24.0 二.nginx版本选择与下载 我之前也写过下载nginx下载_ngnix stable 下载-CSDN博客 不想看寻找过程的&#xff0c;直接点这里去下载https://nginx.org/download…

好的测试数据管理,到底要怎么做?

你的组织是否实施了测试数据管理&#xff1f;如果你的组织处理关键或敏感的业务数据&#xff0c;测试数据管理肯定会让组织受益。与测试数据相关的问题占所有软件缺陷的 15%&#xff0c;这一事实强调了测试数据的重要性。本文将准确讨论测试数据经理职责、测试数据经理需要什么…

仿牛客网项目---帖子详情功能的实现

这篇文章主要讲讲帖子详情功能。其实帖子详情功能简单来说就是你点进去可以看到文章&#xff0c;这就叫帖子详情功能。那接下来我讲讲我的这个项目是如何实现这个功能的。 首先写DAO层。 Mapper public interface DiscussPostMapper {List<DiscussPost> selectDiscussPo…

寒假作业Day 02

这是第二天的作业&#xff0c;fighting&#xff01; Day 02 一、选择题 首先char* s[6]是指针数组&#xff0c;也就是其存储的都是这些字符串的地址&#xff0c;其实际上的类型为char**&#xff0c;而fun函数传入了s数组的首地址。而后续fun函数中打印字符&#xff0c;p[i]即…

【Linux实践室】Linux初体验

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux 目录结构介绍2.2 &#x1f514;Linux …

Java基于SpringBoot的企业客户管理系统的设计与实现论文

摘 要 本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述企业客户管理系统的当前背景以及系统开发的…