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);

你可能感兴趣的:(JAVA面试题,java,elasticsearch,开发语言,面试,ES)