es是如何处理索引数据的变动的?

1 概述

es是如何处理索引数据的变动的?

或者说索引数据变动时,es会执行哪些操作?

refresh、fsync、merge 和 flush 操作有何作用?

es是如何确保即使es发生宕机数据也不丢失的?

在回答上述问题前,可以先了解一下es处理索引数据变动的主要流程,其示意图如下所示。

2 处理索引数据变动的过程

由示意图可知,es处理索引数据变动的主要过程如下所述:

(1)将数据写入内存缓冲区;

(2)生成新的segment,使数据可见-即可被搜索到;

(3)将数据存储到磁盘。

2.1 将数据写入内存缓冲区

当索引数据变动(插入、更新或删除索引数据)时,首先会将变动的索引数据写入到内存中的“索引缓冲区”,然后将索引数据变动命令写入到内存中的“translog缓冲区”。

  • translog的作用是当es服务宕机后需要进行数据恢复时,通过translog可以恢复尚未存储到磁盘中的es索引数据。
  • 通过每次索引变动请求完成时(默认)执行fsync操作,或者定时执行(设为异步执行时,默认为5s)fsync操作,将“translog缓冲区”中的数据添加到磁盘中的translog文件中。

New documents are added to the in-memory buffer and appended to the transaction log

2.2 使数据可见

通过定时执行refresh操作,将“索引缓冲区”的文档生成一个新的segment(段),此时新增和修改的数据能被搜索到。

  • 默认每秒执行一次refresh操作
  • 每次refresh操作都会生成一个新的segment,随着时间的增长segmengt会越来越多。因为每次search操作都会扫描所有的segment,因此segmengt过多将导致查询效率变慢。为了避免该问题的发生,es会定期将segment进行merge合并操作。
  • 执行refresh操作时,磁盘中的translog文件不会被清除。

 After a refresh, the buffer is cleared but the transaction log is not

2.3 将数据存储到磁盘

(3)通过执行flush操作(刷盘),将内存中的segment存储到磁盘,同时删除磁盘中的translog文件。

  • 默认每隔30min执行一次或者在磁盘中的translog文件过大时(index.translog.flush_threshold_size,默认512mb)执行一次。

After a flush, the segments are fully commited and the transaction log is cleared

3 refresh、merge 和 flush

3.1 refresh

3.1.1 定义

将“索引缓冲区”的文档生成一个新segment(段)并清空该“索引缓冲区”,使新增或修改后的数据能被ES的api接口查询到。

refresh_interval 控制索引refresh频率 ,默认为1s。

3.1.2 修改执行频率

可以通过修改 refresh_interval 来修改执行频率

PUT /test_index/_settings
{
  "settings": {
    "refresh_interval": "2s"           
  }
}

3.1.3 api

refresh全部索引

POST /_refresh 

refresh指定索引

POST /test_index/_refresh

3.2 merge

将多个小segment合并成一个大segment,并删除旧的segment。

3.3 flush

3.3.1 定义

通过执行flush操作(刷盘),将内存中的segment存储到磁盘,同时删除磁盘中的translog文件。

3.3.2 api

刷盘指定索引

POST /test_index/_flush

刷盘所有索引,且等刷盘结束才返回结果

POST /_flush?wait_for_ongoing

4 参考文献

(1)理解ES的refresh、flush、merge

(2)Making Changes Persistent | Elasticsearch: The Definitive Guide [2.x] | Elastic

(3)Translog | Elasticsearch Guide [7.10] | Elastic

相关推荐

  1. Python如何查询es数据

    2024-07-10 12:10:03       33 阅读
  2. LiveData如何感知Room数据变化

    2024-07-10 12:10:03       27 阅读
  3. Tomcat如何处理并发请求?

    2024-07-10 12:10:03       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 12:10:03       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 12:10:03       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 12:10:03       90 阅读
  4. Python语言-面向对象

    2024-07-10 12:10:03       98 阅读

热门阅读

  1. 认字之 刬

    2024-07-10 12:10:03       19 阅读
  2. lvs集群

    lvs集群

    2024-07-10 12:10:03      28 阅读
  3. AUTOSAR:汽车软件架构的未来

    2024-07-10 12:10:03       26 阅读
  4. 相机光学(二十九)——显色指数(Ra)

    2024-07-10 12:10:03       23 阅读
  5. 贪心算法合集一

    2024-07-10 12:10:03       26 阅读
  6. 索引知识总结

    2024-07-10 12:10:03       28 阅读
  7. Oracle怎么实现RSA加密解密

    2024-07-10 12:10:03       29 阅读
  8. 前端判断场景和方式

    2024-07-10 12:10:03       23 阅读