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

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

 

2.3 将数据存储到磁盘

(3)通过执行flush操作(刷盘),将内存中的segment存储到磁盘,同时删除磁盘中的translog文件(已持久化到磁盘的数据对应的translog数据会被删除,尚未写入到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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ability Liao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值