elasticsearch写入流程
Posted BadJOKER
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch写入流程相关的知识,希望对你有一定的参考价值。
Elasticsearch的写入文档过程是客户端向Elasticsearch服务发送写入请求,经过多个组件协同工作。
具体步骤如下:
- 客户端向Elasticsearch发送写入请求。请求中需要包含以下信息:
- 索引名称和类型:指明要写入到哪个索引、哪个类型;
- 文档ID:指明要写入的文档唯一标识符;
- 数据:要写入的文档内容,通常是JSON格式。
- 请求首先会被发送到Elasticsearch的协调节点,协调节点负责控制索引中的分片,它的工作包括:
- 确定要写入文档的主分片和副本分片的位置;
- 向主节点发送写入请求;
- 副本分片复制主分片的写操作。
- 写入请求到达主节点后,主节点会采取以下步骤:
- 生成全局唯一的递增版本号(_version);
- 在内存中创建文档,并为其分配一个唯一的文档ID(如果没有指定);
- 将文档写入主分片。
- 主分片写入成功后,主节点会向客户端发送写入成功的响应。同时,主节点还会将写入操作同步到分配给它的所有副本分片上。
- 副本分片接收到同步请求后,会将对应的文档复制到它自己本地的分片中。这样,副本分片就与主分片保持了一致性。
分片写入数据具体步骤如下:
-
当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 Memory Buffer,然后定时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从 Momery Buffer 到 Filesystem Cache 的过程就叫做 refresh;
-
当然在某些情况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会丢失,ES 是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时,才会清除掉,这个过程叫做 flush;
-
在 flush 过程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync将创建一个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删除并开始一个新的 translog。
-
flush 触发的时机是定时触发(默认 30 分钟)或者 translog 变得太大(默认为 512M)时;
ElasticSearch搜索引擎:数据的写入流程
一、ElasticSearch 写数据的总体流程:
(1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node
(2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该落在哪个分片 shard 上,然后根据节点上维护的 shard 信息,将请求转发到对应的实际处理节点node上
shard = hash(document_id) % (num_of_primary_shards),
(3)实际的节点上的 primary shard 主分片处理请求,然后将数据同步到副本节点 replica node
(4)coordinating node 等到 primary node 和所有 replica node 都执行成功之后,就返回响应结果给客户端。
二、ES 的主分片写数据的详细流程:
1、refresh 操作:
primary shard 主分片先将数据写入 memory buffer,然后定时(默认每隔1s)将 memory buffer 中的数据写入一个新的 segment 文件中,并进入 Filesystem cache(同时清空 memory buffer),这个过程就叫做 refresh;每个 Segment 文件实际上是一些倒排索引的集合, 只有经历了 refresh 操作之后,这些数据才能变成可检索的。
ES 的近实时性:当数据存在 memory buffer 时是搜索不到的,只有数据被 refresh 到 Filesystem cache 之后才能被搜索到,而 refresh 是每秒一次, 所以称 es 是近实时的,或者可以通过手动调用 es 的 api 触发一次 refresh 操作,让数据马上可以被搜索到;
上文讲到的 memory buffer,也称为 Indexing Buffer,这个区域默认的内存大小是 10% heap size。
2、写 translog 事务日志文件:
由于 memory Buffer 和 Filesystem Cache 都是基于内存,假设服务器宕机,那么数据就会丢失,所以 ES 通过 translog 日志文件来保证数据的可靠性,在数据写入 memory buffer 的同时,将数据写入 translog 日志文件中,在机器宕机重启时,es 会从磁盘中读取 translog 日志文件中最后一个提交点 commit point 之后的数据,恢复到 memory buffer 和 Filesystem cache 中去。
ES 数据丢失的问题:translog 也是先写入 Filesystem cache,然后默认每隔 5 秒刷一次到磁盘中,所以默认情况下,可能有 5 秒的数据会仅仅停留在 memory buffer 或者 translog 文件的 Filesystem cache中,而不在磁盘上,如果此时机器宕机,会丢失 5 秒钟的数据。也可以将 translog 设置成每次写操作必须是直接 fsync 到磁盘,但是性能会差很多。
3、flush 操作:
不断重复上面的步骤,translog 会变得越来越大,当 translog 文件默认每30分钟或者阈值超过 512M 时,就会触发 flush 操作,将 memory buffer 中所有的数据写入新的 Segment 文件中, 并将内存中所有的 Segment 文件全部落盘,最后清空 translog 事务日志。
- (1)将 memory buffer 中的数据 refresh 到 Filesystem Cache 中的一个新的 segment 文件中去,然后清空 memory buffer;
- (2)创建一个新的 commit point(提交点),同时强行将 Filesystem Cache 中目前所有的数据都 fsync 到磁盘文件中;
- (3)删除旧的 translog 日志文件并创建一个新的 translog 日志文件,此时 flush 操作完成
ES 的 flush 操作主要通过以下几个参数控制:
- index.translog.flush_threshold_period:每隔多长时间执行一次flush,默认30m
- index.translog.flush_threshold_size:当事务日志大小到达此预设值,则执行flush,默认512mb
- index.translog.flush_threshold_ops:当事务日志累积到多少条数据后flush一次。
以上是关于elasticsearch写入流程的主要内容,如果未能解决你的问题,请参考以下文章