ES读写原理
写入原理
- 客户端请求发送到一个节点, 该节点被称为协调节点,协调节点解析请求发现为写请求,解析其doc id,计算其路由,将其发送到对应的主分片上 primary shard
- 数据会先被写入内存buff中,然后再写入translog,进行 2.1 2.2 的操作,数据会被写入磁盘上的translog文件。一旦数据被写入磁盘,es 宕机不会丢失数据。
- 3过程可以在2.1操作成功之后进行,也可以在 2.2操作成功之后进行。 如果3过程在2.1之后进行,那么es会存在数据丢失的风险,因为给客户端返回写入成功,但translog并未入磁盘,仍存在os cache中,os cache也在内存中,内存数据断电丢失,如果4过程之后,2.2过程执行之前宕机,数据丢失。如果3过程在2.2之后进行,则es不会出现数据丢失情况。 可以通过es的参数 来进行控制,设置为同步,会在每次写入translog时都写入磁盘,设置为异步,则2.2操作会异步进行,默认5s进行一次写磁盘操作(fsync)
- 数据经过5过程才会被search操作搜索得到, ps:当使用文档id进行get查询时,即使数据在内存buff中也可以搜索得到,5过程默认1s操作一次, 将内存buff中的数据写入os cache对应的segment file
- 6过程是将os cache中的segment file 写入磁盘,操作本质上与2.2一致,默认每半小时更新一次
- flush过程同时也会写一个commit到commit point中
Q: 为什么叫 es 是准实时的?
A: NRT,全称 near real-time。默认是每隔 1 秒 refresh 一次的,所以 es 是准实时的,因为写入的数据 1 秒之后才能被看到。可以通过 es 的 restful api 或者 java api,手动执行一次 refresh 操作,就是手动将 buffer 中的数据刷入 os cache中,让数据立马就可以被搜索到。只要数据被输入 os cache 中,buffer 就会被清空了,因为不需要保留 buffer 了,数据在 translog 里面已经持久化到磁盘去一份了。
Q: ES会丢失数据吗?
A: es宕机是否丢失数据主要看translog是否丢失数据, translog在写入时可以设置写入方式,通过设置每次写translog都写入磁盘,可防止translog数据的丢失,从而达到es宕机不丢失数据的目的。
读原理
以上图三个节点为例,三个节点组成一个es集群,一个索引,3主3从。
- 当查询从客户端发送到节点2时,此客户端发送的请求被节点2接受并处理,此时我们称节点2为此次请求的协调节点,节点2会将查询发送到索引对应的三个分片,三个分片可能是主可能是从,es会根据负载均衡算法来决定查询请求发送到哪个分片。
- 各个分片会将查询结果的docid和排序字段返回给协调节点,注此时并不返回文档的全部数据。
- 协调节点根据各个分片返回的docid和排序字段进行排序,筛选出需要返回给客户端的文档docid
使用docid去对应分片上拉取文档真实数据,返回给客户端
4 过程排序,数据若能完全在内存中,则使用快速排序(logn ~ n), 若内存放不下所有数据,就要借助文件进行排序,使用归并排序算法(nlogn)文章来源:https://www.toymoban.com/news/detail-400311.html
es二阶段查询文章来源地址https://www.toymoban.com/news/detail-400311.html
- query阶段, 2,3,4为query阶段
- fetch阶段, 5,6为fetch阶段
到了这里,关于ES读写原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!