带你读《Elastic Stack 实战手册》之39:——3.4.2.20.Refresh/flush(上)

简介: 带你读《Elastic Stack 实战手册》之39:——3.4.2.20.Refresh/flush(上)

3.4.2.20.Refresh/flush


创作人:章海怒

审稿人:欧阳楚才

 

简而言之,_refresh 用于使新文档可见以进行搜索。 而 _flush 用于将内存中的 Segment 段保留在硬盘上。_flush 不会影响 Elasticsearch 中文档的可见性,因为搜索是在内存中

Segment 进行的,而 _refresh 则会影响其可见性。两个操作都与 ES 对数据的存储有着千丝万缕的联系,下面我们就从数据的存储开始仔细梳理其中的区别。

 

Elasticsearch 中的 refresh

 

当我们把一条数据写入到 Elasticsearch 中后,它并不能马上被用于搜索。新增的索引必须写入到 Segment 后才能被搜索到,因此我们把数据写入到内存缓冲区之后并不能被搜索到。新增了一条记录时,Elasticsearch 会把数据写到 translog 和 in-memory buffer (内存缓存区)中,如下图所示:


image.png


在此期间,该文档不能被搜索,但是我们还是可以通过 ID 使用 GET 来获得该文档。如果希望该文档能立刻被搜索,需要手动调用 refresh 操作。在 Elasticsearch 中,默认情况下 _refresh 操作设置为每秒执行一次。 在此操作期间,内存中缓冲区的内容将复制到内存中新创建的 Segment 中,如下图所示 _refresh 接口触发的结果就是新数据可用于搜索。


image.png


这个 refresh 的时间间隔可以由 index 设置中 index.refresh_interval 来定义。只有在 buffer的内容写入到 Segement 后,这个被写入的文档才变为可以搜索的文档。通常 buffer 里的内容被写入到 Segment 里去有三种触发方式:

 

l 由索引中的设置所指定的 refresh_interval 启动的周期性的 refresh。在默认的情况下为1s。这使对索引的最近更改可见以进行搜索。 也可以设置为 -1 以禁用刷新。在 Elasticsearch 7.0 发布之后,如果未明确设置此设置,则至少在 index.search.idle.after 秒之后仍未看到搜索流量的分片在收到搜索请求之前将不会接收后台刷新。 命中空闲分片的搜索将等待下一次后台刷新(在1秒内)。 此行为旨在在不执行搜索时在默认情况下自动优化批量索引。 为了退出此行为,应将显式值 1s 设置为刷新间隔。

l 在导入文档时强制调用 refresh,例如:PUT twitter/_doc/1?refresh=true

l 当 In Memory Buffer 满了,在默认的情况下为 node Heap 的 10%

 

这个过程会产生一个叫 Lucene flush 的操作,也会生产一个 segment。执行完 refresh 后的结果如下:这个 refresh 的时间间隔可以由 index 设置中 index.refresh_interval 来定义。只有在 buffer的内容写入到 Segement 后,这个被写入的文档才变为可以搜索的文档。通常 buffer 里的内容被写入到 Segment 里去有三种触发方式:

 

l 由索引中的设置所指定的 refresh_interval 启动的周期性的 refresh。在默认的情况下为1s。这使对索引的最近更改可见以进行搜索。 也可以设置为 -1 以禁用刷新。在 Elasticsearch 7.0 发布之后,如果未明确设置此设置,则至少在 index.search.idle.after 秒之后仍未看到搜索流量的分片在收到搜索请求之前将不会接收后台刷新。 命中空闲分片的搜索将等待下一次后台刷新(在1秒内)。 此行为旨在在不执行搜索时在默认情况下自动优化批量索引。 为了退出此行为,应将显式值 1s 设置为刷新间隔。

l 在导入文档时强制调用 refresh,例如:PUT twitter/_doc/1?refresh=true

l 当 In Memory Buffer 满了,在默认的情况下为 node Heap 的 10%

 

这个过程会产生一个叫 Lucene flush 的操作,也会生产一个 segment。执行完 refresh 后的结果如下:


image.png

我们可以看出来,相比上一个状态,In-meomory buffer 中的数据被清空,但是是 Translog 里还是有东西的。

 

refresh 的开销比较大,我在自己环境上测试 10W 条记录的场景下refresh一次大概要14ms,因此在批量构建索引时可以把 refresh 间隔设置成-1来临时关闭 refresh, 等到索引都提交完成之后再打开 refresh, 可以通过如下接口修改这个参数:

 

PUT /my-index-000002/_settings 
{"index": {"refresh_interval":"-1"}}


另外当你在批量创建索引时,可以考虑把副本数设置成0,因为 document 从主分片(primary shard)复制到从分片(replica shard)时,从分片也要执行相同的分析、索引和合并过程,这样的开销比较大,会影响批量创建的速率,你可以在构建索引之后再开启副本,这样只需要把数据从主分片拷贝到从分片:


PUT /my-index-000002/_settings 
{"index": {"number_of_replicas":0}}

执行完批量索引之后,再把刷新间隔与副本数改回来:


PUT /my-index-000002/_settings 
{"index": {"refresh_interval":"1s"}}

你还可以强制执行一次refresh以及索引分段的合并:


POST /my-index-000002/_refresh
POST /my-index-000002/_forcemerge?max_num_segments=5

Translog 及持久化存储

 

但是,translog 如何解决持久性问题? 每个 Shard 中都存在一个 translog,这意味着每个

translog 会同时占用磁盘与内存。 translog 是同步且安全的,因此即使对于尚未 Commit 的文档,translog 也可以保证写入数据的持久性。 如果发生了异常,translog 也可以将未落盘但是已进入 translog 的数据恢复。 Translog 写事务日志入磁盘同样也是在一个固定周期内向磁盘 commit 或在成功完成请求(索引,批量,删除或更新)后。

 

《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.20.Refresh/flush(中) https://developer.aliyun.com/article/1229331


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
Linux
USRP N320更改主时钟频率及测试
USRP N320更改主时钟频率及测试
308 0
|
消息中间件 存储 Kafka
【Kafka】Kafka 架构设计分析
【4月更文挑战第5天】【Kafka】kafka 架构设计分析
|
存储 人工智能 架构师
ChatGPT 与软件架构 (2) - 基于 Obsidian 和 GPT 实现解决方案架构自动化
ChatGPT 与软件架构 (2) - 基于 Obsidian 和 GPT 实现解决方案架构自动化
448 0
|
10月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
4月前
|
缓存 Ubuntu Windows
Ubuntu系统安装软件不难,掌握几个命令即可
通过上面的命令,基本就可以掌握管理Ubuntu操作系统的软件安装卸载管理。
|
存储 安全 数据管理
探索区块链技术在医疗数据管理中的应用
区块链技术,一种最初为比特币而创建的分布式账本技术,已经逐渐渗透到各个行业,其中包括医疗领域。本文将深入探讨区块链技术如何革新医疗数据管理系统,提高数据安全性和互操作性,同时降低运营成本。我们将从区块链的基本原理出发,分析其在保护患者隐私、实现数据共享及优化病历管理方面的具体应用案例和潜在挑战。最后,通过实际案例和未来展望,揭示区块链技术在医疗数据管理中的巨大潜力和发展前景。
|
缓存 自然语言处理 API
阿里云百炼产品月刊【2025年4月】
本月刊主要介绍了阿里云百炼平台4月最新更新内容,包括模型服务和产品功能两大部分。在模型服务方面,发布了全新的混合推理模型Qwen3系列,支持思考与非思考模式,性能达到业界顶尖水平;新增了图生视频、语音合成及视觉理解等多款模型,大幅提升多媒体处理能力。产品功能上,新增MCP市场与管理功能,允许用户开通或自定义MCP服务,并在应用中引用以增强能力。此外,部分历史快照模型将于5月8日下线,已实施限流措施。
752 0
|
JSON 数据挖掘 API
深入探索孔夫子旧书网商品详情数据接口:解锁二手书市场的无限可能
`孔夫子/kfz/item_get`接口提供实时商品详情,包括标题、价格、库存等,支持JSON等格式。开发者需注册账号获取授权,可用于数据分析、商品展示、筛选推荐及市场调研,助力电商平台的运营与决策。
|
存储 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(四十九)(5)
SqlAlchemy 2.0 中文文档(四十九)
347 0
|
移动开发 JavaScript 前端开发
前端常见跨域解决方案(全)
前端常见跨域解决方案(全)
1035 0

热门文章

最新文章