elasticsearch 概述


elasticsearch 概述

 

*******************************

lucene 简介

 

          

elasticsearch底层使用lucene负责索引的创建及搜索,各模块作用如下:

analysis:分词,负责语法分析及语言处理

index:创建索引

store:索引读写

queryparser:将查询语句解析为底层可识别条件

search:负责索引搜索

similarity:文档相似度打分

 

*******************************

核心概念

 

倒排索引

            

 

fst

            

 

term:索引的最小存储和查询单元,数据结构为fst(fst具有较高的压缩率,空间利用效率更高)

倒排表:存储文档的id、词频等信息,数据结构为有序链表

段:索引最小的独立存储单元,段一旦提交就只能读不能改,对数据的修改、删除会记录在相应文件中,段合并的时候才会删除

 

索引会存储的信息主要包括正向信息和反向信息

正向信息:原始文档信息

反向信息:词典、倒排表等信息

 

*******************************

数据写入与日志

 

             

 

数据写入jvm内存,同时将数据写入事务日志,当达到指定时间(默认为1秒)或者数据量达到一定值时,系统内存中生成段(segment),将数据刷新到段中;

当时间超过30s或者日志中的数据超过512m时,在系统内存中生成段,接受jvm内存中的数据,随后将系统内存中的段写入到磁盘的段中,生成提交点;

段写入到磁盘后,删除事务日志,创建一个新的事务日志;

注意:重启elasticsearch时,不仅需要根据提交点加载段,还需要把日志数据中未提交的数据存储到磁盘的段中

 

*******************************

段合并策略

 

每次新增数据都需要创建段,当索引中段的数量过多时,不仅会消耗服务器的性能,还会影响搜索的性能


段合并之前需要对段的大小进行标准化处理,使之更加紧凑,处理公式:

                               

相关参数:

mergeFactor:参与段合并的数量,默认为10

segmentSize:段的实际大小

minMergeSize:小于此值的段会被分到一组

maxMergeSize:大于此值的段不参与合并,大段的合并需要耗费更多的资源

 

                 

合并步骤:

根据段生成时间排序,对段进行标准化处理;

使用两个指针start、end(start指向第一个段处,end指向satrt+mergeFactor处),取指针内最大的段为区间上限,最大值减去level_log_span(默认为0.75)为区间下限;

如果end指针所指的段在区间内,且区间的段没有超过maxMergerSize,则进行段合并;

重复上述过程,直到遍历完所有的段

 

*******************************

elasticsearch 核心概念

 

cluster:集群中包含多个node节点

node:同一个集群中的node节点的名称不能相同,node上有多个分片

shards:分片用来存储数据,分片分散在node节点上,默认为5,主分片数一旦设置不能更改

replicas:副本备份主分片,默认为1,可修改replicas的个数

 

index:索引(相当于数据库),通过index_name在集群中唯一标识

type:elasticsearch7开始移除type

文档:类似于表的行记录,通过_id在索引中唯一标识

 

settings:设置index的分片数、副本数等信息

mappings:设置文档的字段属性

 

node节点类型

master节点:候选主节点,集群的主节点在候选主节点中选举产生,主节点负责索引的创建、删除,分片的分配,追踪集群中节点的状态;

data节点:存储数据

协调节点:接受客户端的请求,转发给对应的分片进行处理

 

*******************************

索引写入流程

 

                  

任意一个节点接受到客户端的索引写入请求,节点将请求转发给对应的主分片;

主分片写入的同时将请求转发给对应的副本分片;

副本分片写入完成后,向主分片返回写入状态,主分片向客户端返回写入成功

 

*******************************

索引查询流程

 

包含路由字段:协调节点直接将请求转发给对应的主分片或者副本分片,向客户端返回查询结果

 

不包含路由字段

协调节点将请求分发给所有的主分片或者主分片的副本分片;

将查询结果返回给协调节点,协调节点作相应处理,并将处理后的结果返回给客户端

 

*******************************

并发性与一致性

 

*******************

并发性

 

写写并发:elasticsearch使用乐观锁解决写写冲突,每个文件都带有version属性,version值大的文档不会被version值低的文档覆盖

读写并发:elasticsearch使用多版本并发控制解决读写冲突,读取事务开始前的快照数据,与写操作不会发生冲突

 

*******************

一致性

 

写一致性:elasticsearch通过在写入数据时检查可写的分片数来保证,否则等待足够的分片数可用后写入,默认为1分钟

one:主分片可用时就可进行写入操作

quroum:大部分可用时就可写入,默认选项

all:所有分片都可用时才可以写入

 

读一致性:通过主副分片同步(sync)或者异步(async)写入来实现读一致性

sync:主副同步写入可保证读取到最新的数据,默认同步写入

async:如果对数据的一致性要求不高可异步写入,提高写入的效率

 

*******************************

性能优化

 

写优化

批量写入数据;

优化存储设备:可使用固态硬盘;

合理使用段合并:在写入数据时限制段合并写入速度,或者关闭段合并写入完成后打开段合并;

适当调大相关参数,减少数据刷新和刷盘的次数;

减少副本的数量,或者写入数据时关闭副本写入,写入完成后打开副本

 

读优化

避免大结果集和深翻:可使用scroll操作一次性读取大量数据,随后直接在快照里面读取数据;

选择合适的路由,直接查找对应的分片;

定期合并含有数据删除的段

 

*******************************

集群脑裂

 

现象:网络故障发生时,集群中的节点不能正常通信,出现多个主节点

解决办法:配置文件中设置参数discovery.zen.minimum_master_nodes=num(master)/2+1