概述
底层基于Luence,用于全文检索和分析应用
术语概念
- 索引(Index):ES数据存储在索引上,索引是具有类似特性的文档的集合。
- 类型(Type):索引内部的逻辑分区(paritition),一个索引可定义多个类型。
- 节点(Node):一个运行中的ElasticSearch实例,集群是由一个或多个拥有相同cluster.name配置的节点组成。ES集群中节点有三种不同的类型。
- 主节点:负责管理集群范围内的所有变更,包括:创建或删除索引,跟踪那些节点是集群的一部分,决定哪些分片分配给相关的节点。主节点不涉及文档级别的变更和搜索等操作。可通过node.master属性设置。
- 数据节点:存储数据和其对应的倒排索引,主要对文档进行增删改查、聚合等操作。可通过属性node.data属性设置。
- 协调节点:如果node.master和node.data属性均为false,则此节点为协调节点,用来相应客户请求,均衡每个节点的负载。处理搜索,分发索引操作等。
- 分片(Shared):一个索引中的数据保存在多个分片中,相当于水平分表。一个分片便是一个Lucence的实例,它本身就是一个完整的搜索引擎。分片被分配到集群的各个节点上。主/副分片。
写操作
- 节点首先计算新文档写入那个分片;
- 写入新文档时,先写入内存中,并将操作记录到translog文件中。此时执行搜索操作,新文档不能被索引到;
- ES每隔1秒(可修改)进行一次刷新(refresh)操作,将这1秒时间内写入内存的文档写入到文件系统缓存(filesystem Cache),并构成一个分段(Segment)。分段可被搜索到,但尚未写入磁盘,可能因宕机丢失;
- 重复2、3步骤,当每隔30分钟或translog文件变得很大,则执行fsync操作,segment将被写入磁盘、translog被删除(此后生成新的translog)。
PS:为防止数据丢失,ES每5s会将translog写入磁盘;为提高性能,ES会自动启用segment合并操作。
更新/删除操作
ES索引不能修改,因此更新、删除操作不是直接在原索引上执行的。
- 删除:每个分区的segment维护del文件,表示记录删除的文档,在查询时将其过滤掉,并未真正删除。
- 更新:首先查询原文档,得到文档版本号,然后将修改后的文档全新写入,同时旧文档标识为删除。
读操作
查询的过程大体上分为查询(query)和取回(fetch)两个节点,通过广播查询请求得到所有相关分片,并将它们的响应整合成全局排序的结果集合,然后将结果集合返回给客户端。
- 当一个节点接收到一个搜索请求,则这个节点变成了协调节点;
- 广播请求到索引中每个节点的分片,查询请求可以被某个主分片或者某个副本分片处理;
- 每个分片将在本地构建一个优先级队列。如果客户端要求返还结果排序中从第from开始数量为size的结果集,则每个节点都需要产生一个from+size大小的结果集,因此优先级队列的大小为from+size,分片仅会返回一个轻量级的结果给协调节点;
- 协调节点将所有分片的结果汇总,并进行全局排序,得到最终的查询排序结果;
- 以上步骤为查询阶段,得到一个排序结果,标记出哪些文档是符合要求的,仍然需要获取这些文档返回客户端。协调节点向含有该文档的分片发送get请求,分片获取文档返回给协调节点,协调节点返回给客户端。