0
点赞
收藏
分享

微信扫一扫

ElasticSearch搜索引擎:数据的写入流程

一、ElasticSearch 写数据的总体流程:

(1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node 

(2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该落在哪个分片 shard 上,然后根据节点上维护的 shard 信息,将请求转发到对应的实际处理节点node上

(3)实际的节点上的 primary shard 主分片处理请求,然后将数据同步到副本节点 replica node 

(4)coordinating node 等到 primary node 和所有 replica node 都执行成功之后,就返回响应结果给客户端。

二、ES 的主分片写数据的详细流程:

Elasticsearch索引文档的过程

1、refresh 操作:

        primary shard 主分片先将数据写入 memory buffer,然后定时(默认每隔1s)将 memory buffer 中的数据写入一个新的 segment 文件中,并进入 Filesystem cache(同时清空 memory buffer),这个过程就叫做 refresh;每个 Segment 文件实际上是一些倒排索引的集合, 只有经历了 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 中去。

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 操作完成
举报

相关推荐

0 条评论