Elasticsearch 使用误区之二——频繁更新文档

在使用 Elasticsearch 时,频繁更新文档是一种常见误区。这不仅影响性能,还可能导致系统资源的浪费。

理解 Elasticsearch 的文档更新机制对于优化性能至关重要。

关于 Elasticsearch 更新操作,常见问题如下:

94e641275e580990aea05aa0828a97ed.png

——https://t.zsxq.com/bDxwL

1、频繁更新的挑战

在关系型数据库中,更新操作在事务完成后立即生效,查询结果可以立刻反映变化。

而在 Elasticsearch 中,更新操作则依赖于刷新(refresh,如下图标红部分)过程。这增加了额外的开销,特别是在频繁更新的场景下。

91ab16398fd84e4a2b7d2d7f1b5362e8.png

细节参见《一本书讲透Elasticsearch》第342-343页详细阐释。

2、文档更新的步骤

Elasticsearch 更新的本质可以分为以下几个步骤:

20a204cafe9ff9435b64269d8f38b396.png

1c3afedd122c27daccce43888ff826bc.png

2.1 查找文档

首先,Elasticsearch 根据请求中的文档 ID 或查询条件,在索引中查找需要更新的文档。

2.2 读取并更新

找到文档后,Elasticsearch 会将文档加载到内存中,并根据请求中的更新内容修改文档数据。这包括字段的增加、修改或删除。

2.3 版本控制

Elasticsearch 使用版本号或乐观锁定机制,确保并发更新时数据的一致性。每次更新,版本号都会增加,以避免更新冲突。

示例:首次写入文档,version是 1。

bb52a5f6ec89160c2cba02baafb0f68b.png

查看索引分段信息如下:

4f19d411694640302506ffa654572e21.png

2.4 重新索引

修改后的文档并不会直接更新到原位置,而是作为一个新文档写入索引。这是因为 Elasticsearch 使用不可变的段文件来存储数据。

继续刚才的示例:更新操作执行一次后,截图如下:_version 由  1 变成 2。

e697add162e918e8c5f85534106f070c.png

更新后查看分段:

2bbb82f75e8c33c2a6a870656dab6bec.png

文档数显示为1(如下图),但其实是两个不同的分段(如上图)。

6dac4461ce3389b82f78674c2391e6c6.png

2.5 旧文档标记删除

原始文档被标记为删除。删除标记会在段合并时清理,以节省存储空间。

befb3511995253fce746fbfef7f9cdf0.png

在如下示例中,通过 _delete_by_query 可以看到标记删除的过程。标记的文档将在段合并时被清理。

3b6781910ec5f8e6b14628017183cea8.png

2.6 刷新与合并

更新完成后,Elasticsearch 定期刷新内存中的变更到磁盘,并合并段文件以优化存储和查询性能。

这些步骤确保了 Elasticsearch 在处理更新时的高效性和数据一致性。

更多细节操作参见源码:

https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/action/update/UpdateHelper.java

3、更新操作的代价

每次更新都涉及到重新索引,而不是简单的“原地”修改。这会增加磁盘 I/O 和计算资源的使用。

此外,标记为删除的文档在段合并前仍然占用空间,增加了存储负担。

第二部分的截图能让我们进一步理解:为什么越更新文档存储占据磁盘空间越大,为什么越删除文档存储占据磁盘越大的原因。

同时,进一步理解,段合并之后,磁盘空间骤降!

4、性能优化建议

4.1. 减少更新频率

实战场景:对于用户行为数据(如浏览次数、点赞数),可以合并多次更新为一次批量更新。

  • 建议1:设置一个合理的批量更新间隔,比如每隔 5 分钟更新一次,而不是每次用户操作后立即更新。

  • 建议2:使用消息队列收集用户操作,定时批量更新。

4.2. 批量处理

实战场景:在电商平台中,商品信息的批量更新。

  • 建议:使用 _bulk API 一次性更新多个文档,减少单次请求的开销。

实践参考:

POST _bulk
{ "update": {"_id": "1"} }
{ "doc": {"price": 100} }
{ "update": {"_id": "2"} }
{ "doc": {"price": 200} }

4.3. 延迟刷新

实战场景:日志数据的批量插入场景。

  • 建议:对不需要实时可见性的索引,增加 refresh_interval,比如设置为 30s 或 60s。

实现:

PUT /my_index/_settings
{"refresh_interval": "30s"
}

4.4. 合理的索引设计

实战场景:对于大规模数据的索引设计,避免不必要的字段更新。

  • 建议1:仅索引必要的字段,避免在频繁更新时更新整个文档。

PUT /my_index
{"mappings": {"properties": {"title": {"type": "text"},"views": {"type": "integer", "index": false}}}
}
  • 建议2:在设计阶段多花时间,考虑建模的充分性,在创建索引时明确指定需要索引的字段。

  • 建议3:能 ingest pipeline 预处理管道或者 logstash filter 中间过滤阶段搞定的,咱们就不要拖到实现阶段。

e71f4e908a35f48b3c2f9f7a210b9db2.png

83a399138f19ee2b1fb65ac947b9bfdb.png

如下问题的解决方案就是借助:json processor 实现。相比于更新操作,写入前的预处理非常有必要!

1a93dfc4e6b50c0df16a238706c3a87b.png

5、结论

频繁更新文档是 Elasticsearch 使用中的一个常见误区。

理解其更新机制和潜在开销是进行系统优化的关键。通过减少更新频率、使用批量处理、延迟刷新等策略,可以显著提高系统的性能和资源利用率。Elasticsearch 的强大功能需要合理使用,才能充分发挥其优势。

希望这篇文章能够帮助你更好地理解和优化 Elasticsearch 的使用!

参考:

https://betterprogramming.pub/boosting-elasticsearch-cluster-performance-3-proven-tips-9b718a9114bc

https://www.youtube.com/watch?v=gWXkAhnYFYw

Elasticsearch 使用误区之一——将 Elasticsearch 视为关系数据库!

Elasticsearch 为什么会产生文档版本冲突?如何避免?

748d33558fbe1d8669f33a510f773a24.jpeg

更短时间更快习得更多干货!

和全球2000+ Elastic 爱好者一起精进!

elastic6.cn——ElasticStack进阶助手

f7a73b3573aad4b1be626ea8275e19df.gif

比同事抢先一步学习进阶干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剖析DeFi交易产品之UniswapV4:概述篇

本文首发于公众号:Keegan小钢 UniswapV4 与 UniswapV3 相比,算法上并没有什么改变,依然还是采用集中流动性模型,但架构上变化很大,包括功能架构,也包括技术架构。相比之前的版本,UniswapV4 最大…

百元蓝牙耳机推荐2024,百元蓝牙耳机排行榜盘点

在2024年面对琳琅满目的蓝牙耳机选项,消费者往往难以抉择,特别是在预算有限的情况下,如何在众多产品中挑选出既满足质量又符合预算的耳机成为了一个不小的挑战。 为了帮助大家在繁多的选择中找到真正物有所值的百元蓝牙耳机,我们…

UnityUGUI之一:image和Rawimage

image组件的相关属性 其中SpriteMode,若为单个图片则为Single,图片集则为Multiple 图集的切割 点击Slice可以进行自动切割 为且每个格子都可以进行单独的九宫格切割 当图片被九宫格切割再进行拉伸以后,九宫格的四角不会被拉伸 Tiled&#x…

如何在本地一键配置最强国产大模型

自从OpenAI的ChatGPT横空出世以来,国内外各类大语言模型(LLM)层出不穷,其中不乏Google的Gemini、Claude、文心一言等等。相较于竞争激烈的商业模型赛道,以Llama为代表的开源大模型的进步速度也十分惊人。 伴随着大语言…

Python Tkinter:开发一款文件加密解密小工具

在这个信息泄露风险日益增加的时代,使用文件加密工具对于保护个人隐私和企业机密至关重要。 本文介绍了一款小工具——encryptDecrypt,它不仅提供了一个易于使用的图形界面,简化了加密和解密过程,还确保了数据的安全性&#xff0c…

深入解析 androidx.databinding.BaseObservable

在现代 Android 开发中,数据绑定 (Data Binding) 是一个重要的技术,它简化了 UI 和数据之间的交互。在数据绑定框架中,androidx.databinding.BaseObservable 是一个关键类,用于实现可观察的数据模型。本文将详细介绍 BaseObservab…

python-求s=a+aa+aaa+aaaa+aa...a的值(赛氪OJ)

[题目描述] 求 saaaaaaaaaaaa...a 的值,其中 a 是一个一位的整数。 例如 :2222222222222222(此时共有 5 个数相加)。输入格式: 整数 a 和 n ( n 个数相加)。输出格式: s 的值。样例输入 2 2样例输出 24数据…

WSL——忘记root密码(Ubuntu)

1、问题描述 Windows下的WSL(Ubuntu)忘记了root密码,无法使用管理员权限。 2、解决方法 关闭 Ubuntu 窗口。打开 Windows 的 Powershell 或 cmd, 以 root 默认登陆 WSL。 wsl -u root 修改对应用户密码。 # xxx为要修改密码的用…

Stable Diffusion【真人模型】:人脸特美的人像摄影大模型wuhaXL_realisticMixV3.0

今天和大家分享一个基于SDXL的真人大模型:wuhaXL_realisticMix。该模型无需使用LORA**就能生成的特别漂亮的人脸,虽然有时候人脸有些假,但是生成的人脸确实非常漂亮。 该模型底模融合了WhiteXL_realisticMix,训练素材来自于视频转…

pytorch统计学分布

1、pytorch统计学函数 import torcha torch.rand(2,2) print(a) print(torch.sum(a, dim0)) print(torch.mean(a, dim0)) print(torch.prod(a, dim0))print(torch.argmax(a, dim0)) print(torch.argmin(a, dim0)) print(torch.std(a)) print(torch.var(a)) print(torch.median…

如何学好AI绘画?点这里有答案!

前言 地狱难度的求职模式下,“掌握一门技术”的那部分求职者,远比其他人更有竞争力;而拥有出色技术和技能的设计师、以及未来想做设计师的小伙伴们,怎么才能更好实现工作自由? 只有两个字:学习。 学习新…

EE trade:白银什么情况下会暴涨

白银价格的暴涨通常由多种因素共同作用引发,包括宏观经济背景、市场供需变化、地缘政治紧张局势以及金融市场波动等。本文整理了一些具体情况和实例,说明白银在什么情况下可能会暴涨。 1. 宏观经济因素 通货膨胀急剧上升 背景:当通货膨胀急…

电脑怎么录屏幕视频带声音?2种方法教会你

在数字时代的浪潮中,电脑屏幕视频录制已经成为一项潮流且实用的技能。无论是为了创作短视频、分享游戏过程,还是为了记录在线会议或教程,电脑录屏都是非常重要的功能。但是不少的人都会遇上录制好的视频没有声音的困境,面对这种情…

HTML5+CSS3+JS小实例:图片九宫格

实例:图片九宫格 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1…

操作系统精选题(四)(论述题)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 一、银行家算法的一道例题 二、页…

二叉搜索树的实现与测试

目录 1.二叉搜索树的结构与特性 2.二叉搜索树的实现 &#xff08;1&#xff09;节点 &#xff08;2&#xff09;功能实现 插入&#xff1a; 删除&#xff1a; 查找: 打印&#xff1a; 3.测试 插入删除&#xff1a; 查找&#xff1a; 4.变种测试&#xff0c;即带valu…

vue3 【提效】自动注册组件 unplugin-vue-components 实用教程

还在为每次都要导入组件而烦恼吗 &#xff1f; // 每次都需手动导入组件 import webName from /components/webName.vue用 unplugin-vue-components 来帮你吧&#xff0c;以后组件直接拿来用即可&#xff0c;无需再导入啦 &#xff01; <webName />使用流程 1. 安装 un…

逻辑这回事(七)---- 器件基础

Xilinx FPGA创建了先进的硅模块(ASMBL)架构,以实现FPGA具有针对不同应用程序领域优化的各种功能组合的平台。通过这一创新,Xilinx提供了更多的设备选择,使客户能够为其特定设计选择具有正确的功能和功能组合的FPGA。ASMBL体系结构通过以下方式突破了传统的设计障碍:消除几…

LINUX系统编程:多线程互斥

目录 1.铺垫 2.线程锁接口的认识 静态锁分配 动态锁的分配 互斥量的销毁 互斥量加锁和解锁 3.加锁版抢票 4.互斥的底层实现 1.铺垫 先提一个小场景&#xff0c;有1000张票&#xff0c;现在有4个进程&#xff0c;这四个进程疯狂的去抢这1000张票&#xff0c;看看会发生什…

新书速览|Adobe Firefly:萤火虫:AI绘画快速创意设计

《Adobe Firefly&#xff1a;萤火虫&#xff1a;AI绘画快速创意设计》 本书内容 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;浪潮的席卷已经变成不可阻挡的趋势&#xff0c;伴随着这种变化&#xff0c;在图形设计、图像制作、绘画领域也相应发生了…