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