Elasticsearch学习

是一个分布式的,restful风格的搜索引擎

支持对各种类型的数据的检索

搜索速度快,可以提供实时的搜索服务

便于水平扩展,每秒可以处理PB级别海量数据

ES术语

index索引:类似于mysql中的数据库 es中的所有是存储数据的地方,包含一堆相似结构的文档数据

type类型:用来定义数据结构,可以认为是mysql的一张表,type是index中的一个逻辑数据分类

document文档:一行数据 采用json 类似于mysql中的一行,不同之处在于es中的每个文档可以有不同的字段,但是对于通用字段应该具有相同的数据类型 文档是es中的最小数据单元

field字段:是es中的最小单位,一个文档里有多个field

shard分片:单台机器无法存储大量的数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储,有了shard就可以横向扩展,存储更多数据,让搜索和分析操作分布到多台服务器上执行,提升吞吐量

replica副本:任何服务器随时可能故障或宕机,创建副本,可以在shard故障时提供备用服务,保证数据不丢失

ES写入流程

1.客户端选择ES的某个节点发送请求过去,这个节点就是协调节点

2.协调节点对document进行路由,将请求转发给对应的node

3.实际的node上的primary shard 处理请求,然后将数据同步到副本节点

4.协调节点等到主节点和所有副本节点都执行完成后,最后返回响应结果给客户端

ES主分片写数据的流程

1.主分片先将数据写入ES的memory buffer,然后定时(默认1s)将memory buffer 中的数据写入一个新的segment文件中,并进入操作系统缓存filesystem cache,这个过程就叫做refresh,每个segment文件实际上是一些倒排索引的集合,,只有经历refresh操作之后,这些数据才能被检索

ES的近实时性:数据存在memory buffer时搜索不到,只有数据被refresh到FileSystem cache之后才能被搜索到,而refresh每秒一次,所以称es是近实时性,可以手动调用es的api触发一次refresh操作,让数据马上可以被搜索到

2.由于memory buffer和fileSystem cache都是基于内存的,假设服务器宕机,那么数据就会丢失,所以es通过translog日志文件中的数据,恢复到memory buffer和FileSystem cache中去

ES数据丢失的问题:translog是先写入Filesystem cache 然后默认每隔5秒刷新一次到磁盘中,所以默认情况下,可能有5s的数据会仅仅停留在memory buffer或者translog文件的Filesystem cache中,而不在磁盘上,如果此时机器宕机,会丢失5秒钟的数据。

3.flush操作:由于translog会变得越来越大,不过translog文件默认每30分钟或者阈值超过512M时,就会触发commit操作,即flush操作,将memory buffer中所有的数据写入新的segment文件,并将内存中所有的segment文件全部落盘,最后清空translog事务日志

(1)将memory buffer 中的数据refresh 到Filesystem Cache中去,清空buffer

(2)创建一个新的commit point(提交点) 同时强行将Filesystem Cache 中目前所有的数据都fsync到磁盘中

(3)删除旧的translog日志文件并创建一个新的translog日志文件,此时commit操作完成

es的更新和删除

Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更,所以ES利用.del文件标记文档是否被删除,磁盘上的每个段都有一个相应的.del文件

(1)如果是删除操作,文档其实并没有真的被删除,而是在.del文件中被标记为deleted状态,该文档依然能匹配到,但是会在结果中被过滤掉

(2)如果是更新操作,就是将旧的doc标识为deleted状态 ,然后创建一个新的doc

memory buffer每refresh一次,就会产生一个segment文件,所以默认情况下是1s生成segment文件,这样下来segment文件会越来越多,此时会定期执行merge。每次merge的时候,会将多个segment文件合并成一个,同时这里会将标识为deleted的doc给物理删除掉,不写入到新的segment中,然后将新的segment文件写入到磁盘,这里会写一个commit point,标识所有新的segment文件,然后打开新的segment文件共搜索使用,同时删除旧的segment文件

ES的搜索流程

Query阶段

客户端发送请求到coordinate node, 协调节点将搜索请求广播到所哦与primary shard或replica,每个分片在本地执行搜索并构建一个匹配文档的大小为from+size的优先队列。接着每个分片返回各自优先队列中,所有docId和打分值给协调节点,由协调节点进行数据的合并,排序,分页操作

Fetch阶段

协调节点根据query阶段产生的结果,去各个节点上查询docId实际的document内容,最后由协调节点返回结果给客户端。

协调节点对doc Id进行哈希路由,将请求转发到相应的node,此时会使用随机轮询算法,在primary shard 以及所有副本中随机选择一个,让读请求负载均衡

接收请求的node返回document给coordinate node

coordinate node返回给document给客户端

es在高并发下保证读写一致性

对于更新操作 可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖

对于写操作,一致性级别支持quorum/one/all 即只有当大多数分片可用时才允许写操作。

ES集群如何选举Master节点

Elasticsearch会对存储的数据进行切分,划分到不同的分片上,同时每一个分片会生成多个副本,从而保证分布式环境的高可用,ES集群中的节点是对等的,节点间会选出集群的master,由Master会负责维护集群状态信息,并同步给其他节点

Es集群如何选举Master

ES的选主是ZenDiscovery模块负责的,主要包含ping 节点之间通过这个rpc来发现彼此 和unicast (单播模块包含一个列表以控制哪些节点需要ping通)

(1) 确认候选主节点的最少投票通过数量

(2) 选举时,集群的每个节点对所有master候选节点,根据nodeId进行字典排序,然后选出第一个节点,暂且认为他是master节点

(3)如果对某个节点的投票数达到阈值,并且该节点自己也选举自己,那这个节点就是master,否则重新选举一直到满足上述条件

ES是如何避免脑裂现象

(1) 当集群中master候选节点数量不少于3时,可以通过设置最少投票通过数量,设置超过所有候选节点一半以上来解决脑裂问题

(2)当候选数量为两个时,只能修改唯一的一个master候选,其他作为data节点,避免脑裂问题

倒排索引原理

key-value的结构,其中key是分词后的单词,这里称为Term 这一系列的Term组成倒排索引的第一部分Term Dictionary(索引表)

倒排索引的另一部分称为Posting List(记录表) 记录表由所有的Term对应的数据Postings组成,不仅包含文档id信息,还包含以下信息

文档id :包含单词的所有文档id,用于去正排索引中查询原始数据

词频:记录Term在每篇文档中出现的次数,用于后续相关性算法

位置:记录term在每篇文档中的分词位置,用于词语搜索

偏移:记录Term在每篇文档的开始和结束位置,用于高亮显示

相关推荐
南宫生25 分钟前
力扣-图论-18【算法学习day.68】
java·学习·算法·leetcode·图论
海岛日记29 分钟前
基于master开发了一个feature/new_fun分支,但是开发过程中origin/master发生更新了,此时应该怎么做?
大数据·elasticsearch·搜索引擎
StarRocks_labs1 小时前
深入解析 StarRocks 物化视图:全方位的查询改写机制
java·大数据·数据库·sql
shen121381 小时前
【Graylog】索引别名deflector的异常处理和索引分片数限制解除
运维·elasticsearch·graylog
武子康1 小时前
Java-31 深入浅出 Spring - IoC 基础 启动IoC XML与注解结合的方式 配置改造 applicationContext.xml
java·大数据·spring·mybatis·springboot
树莓集团1 小时前
什么是数字化转型?对企业发展的帮助有哪些?
大数据·人工智能·云计算·新媒体运营·媒体
京东零售技术1 小时前
京东大数据治理探索与实践 | 京东零售技术实践
大数据·零售
thesky1234561 小时前
活着就好20241221
学习·算法
HE10291 小时前
威沙特(Wishart)分布
学习
LuckyLay2 小时前
Golang学习笔记_15——range
笔记·学习·golang·range