ES面试题,看这一篇就够了

2022-10-27 14:38:10 浏览数 (3)

ES有哪些角色的节点,各自作用?

master node: 索引的创建与删除、

data node:存储索引数据、对文档数据增删查改

cordinate node:协调节点,接收用户请求、转发请求、汇总结果

ingest node:拦截请求,对文档进行转换和预处理

ES写入数据流程?

(1)客户端发送写请求给cordinate node

(2)cordinate node 计算路由计算,转发到对应的主分片所在的节点上

(3)主分片节点处理请求,并将数据同步至副本分片节点

(4)当所有节点写完数据后,cordinate node 返回相应给客户端

ES基于doc id读取数据流程?

(1)客户端发送请求给cordinate node

(2)cordinate node 计算路由,使用round-robin方式将请求转发到对应node的主分片或副本分片节点上

(3)接受请求的node 将查询的document返回给cordinate node

(4)cordinate node 将document返回给客户端

ES 搜索流程?

以query_then_fetch搜索方式为例:

(1)客户端发送请求给cordinate node

(2)cordinate node将请求转发给所有的shard对应的主分片或副分片之一

(3)query 阶段:每个shard 将自己的搜索结果返回给cordinate node,由cordinate node进行数据的合并、排序、分页等操作,产出最终结果

(4)fetch phase:接着由协调节点根据 doc id 去各个节点上拉取实际的 document 数据,最终返回给客户端

ES有哪几种数据缓存?

ES有以下三种数据缓存:

(1)Node Query Cache(queryCache)

Node级别的缓存,基于LRU策略,filter查询会使用query cache,相关调整参数为:

index.queries.cache.enabled:false

indices.queries.cache.size:10%(默认)

(2)Shard Rquest Cache(requestCache)

主要缓存aggregations、hits.total和suggestions等查询size=0的请求结果,基于LRU策略

request cache缓存分片级本地结果集,request cache在每次refresh_interval后就会被清空,所以其生命周期是一个refresh_interval。

(3)Fielddata Cache(fielddata)

主要用于sort以及aggs的字段。这会把字段的值加载到内存中,以便于快速访问。field data cache的构建非常昂贵,因此最好能分配足够的内存以保障它能长时间处于被加载的状态。调整参数:

indices.fielddata.cache.size

ES常用的查询有哪些?

(1)term、match、multi_match

(2)组合查询:bool(must、should、must_not、filter)、boost(加权)、constant(固定分值)、dis_max(单字符多字段组合)、function(函数脚本组合)

(3)wildcard(通配符查询)、fuzzy(模糊查询)、regexp(正则查询)

(4)match phrase(短语匹配查询)、match phrase prefix(短语前缀查询)

ES索引优化有哪些?

机器:使用SSD磁盘

OS:禁止swapping交换内存、给filesystem cache更多的内存

JVM:考虑使用G1,设置-Xms 与-Xmx参数相同

ES:

(1)增加refresh时间间隔,调整参数:index.refresh_interval

(2)临时关闭副本(replia)

(3)尽量使用es自动生成的id,如果自己指定id,写入前需要查看该id是否存在

应用程序:

(1)使用多线程、bulk批量写入

(2)增加写入缓存,调整参数:indices.memory.index_buffer_size(Node上所有的shard共享)

ES查询优化有哪些?

(1)尽量使用filter过滤器(filter不进行打分、可以缓存数据)

(2)分页查询,不能太深,考虑使用scroll

(3)mapping合理设计

0 人点赞