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合理设计