Interview preparation--Elasticsearch写入原理与调优

news2024/11/26 7:53:07
ES的写入过程
ES支持的写操作
  • create: create操作不同于put操作,put操作的时候如果当前put的数据存在则会被覆盖,如果put操作的时候加上操作类型create,如果数据存在则会返回失败,比如:PUT /pruduct/_create/1/
  • delete:删除文档,ES对文档的删除是懒删除机制,即标记删除
  • index:在ES中,写入操作被称为Index这里的Index为动词,即将数据创建在ES中的索引里面
  • update:指向partial update,(全量替换,部分替换)
ES写入流程图解
  • ES中数据写入均发生在Primary shard(主分片),当数据在Primary写入完成之后会同步到其他Relica Shard。如下图

在这里插入图片描述

  • 第一步:客户端发起请求到node4的1分片

  • 第二步:node 4 通过文档id在路由表中的映射信息确定当前数据的位置为分片0,分片0的主分片位于node 5,将数据妆发到node5

  • 第三步:数据在node 5写入,写入成功后数据的同步请求转发到副本所在的node 4和node 6

  • 第四步:等待所有副本数据写入完成后,node5 返回结果给node4,node4 将结果返回给客户的

  • node 4 转到node 5 的依据是通过如下算法来完成的:

shard_num = hash(_routing)% num_primary_shards
  • _routing :默认值是文档id
  • num_primary_shards:现有的分片总数
写一致性策略
  • ES 5.x 之后,一致性策略配置:wait_for_active_shards 参数控制,默认1,
  • 写入操作,必须等数据同步到 wait_for_active_shards 配置的制定个分片后才能返回成功,默认1个,最多是number_of_replicas + 1 也就是all
ES写入原理

在这里插入图片描述

  • ES的写入优化和其他数据库存储类似,就是避免直接对磁盘进行操作,通过加缓存的方式,如果加一层缓存不行,那么久多加一层缓存,通过backup文件追加写的方式来做crash-safe。大体思路就是如此,流程如下

  • ES是用java实现的,在写入的时候为写入实现提供了一个缓冲区 Memory Buffer,数据显写入缓冲区,缓冲区固定大小

  • Memory Buffer 有空间阈值 10% JVM heap,时间阈值 1s钟,当任意一个满足的时候,ES会对MemoryBuffer 进行Refresh,将缓存中数据写入Segment

  • MemoryBuffer 写入Segment文件并没有落盘,而是生成了一个临时的Segment索引这部分数据存储在文件系统缓存中,此时就能查询到新写入的数据

  • 因为缓存数据可能丢失,为了做crash-safe,es从Memory Buffer到生成Segment索引缓存同时会通过追加写的方式 写入translog

  • Es会定期进行flush ,将缓存中的Segment写入到磁盘,写完后,会讲Segment索引标记为可用,所以写入到查询有1s延迟

对Translog的控制(flush的时机)
  • 配置一:index.translog.sync_interval
    • 无论写入操作如何,translog 默认每隔 5s (可以设置更大时间)被 fsync 写入磁盘一次,不允许设置小于 100ms 的提交间隔。
  • 配置二:index.translog.durability
    • 同步刷盘还是异步刷盘,默认情况是fsync(同步刷盘)
  • 配置三:index.translog.flush_threshold_size
    • 也就是translog的容量大小,默认为 512mb. 在达到translog的最大容量的时候,会立刻停止写入同坐一次flush,晴空translog
refresh原理
  • refresh的过程是从jvm的内存索引缓冲区 写入到 文件系统缓冲区(这个是两个缓存直接数据交换,消耗低)。
  • 数据在进入文件缓存后,它可以像任何其他文件一样打开和读取。文件缓存是文件系统的一部分,这个位置由操作系统控制了
  • 配置信息:index.refresh_interval:可以设置刷新的间隔时间
Segment 的Merge操作
  • 由于默认每一秒都从缓冲区refresh 到Segment,所以会生成非常多的小数据量的Segment。而Segment段数目太多会带来较大的麻烦。 每一个段都会消耗文件句柄、内存和cpu运行周期。更重要的是,每个搜索请求都必须轮流检查每个段;所以段越多,搜索也就越慢。
  • Elasticsearch通过在后台进行段合并来解决这个问题。小的段被合并到大的段,然后这些大的段再被合并到更大的段。 这个就是Merge操作,Merge操作发生在Jvm 中

在这里插入图片描述

  • Elasticsearch 中的一个 shard 是一个 Lucene 索引,一个 Lucene 索引被分解成段。段是存储索引数据的索引中的内部存储元素,并且是不可变的。较小的段会定期合并到较大的段中,并删除较小的段
  • Merge操作是一个需要消耗大量的I/O和CPU资源的操作,会影响搜索性能。Elasticsearch在默认情况下会对合并流程进行资源限制,所以搜索仍然 有足够的资源很好地执行。
写入性能调优
  • 第一点:多Merge的限制:

    • 原因:merge 过程发生在 JVM中,频繁的生成 Segmen 文件可能会导致频繁的触发 FGC,导致 OOM
    • 方法一:增加refresh的间隔时间
    • 方法二:增加Memory Buffer的空间阈值
  • 生产经常面临的写入可以分为两种情况:

    • 高频低量:高频的创建或更新索引或文档一般发生在 处理 C 端业务的场景下。
    • 低频高量:一般情况为定期重建索引或批量更新文档数据。
具体优化配置
  • 第一:增加 flush 时间间隔 ,目的减少写入磁盘的次数,减少磁盘IO频率
  • 第二:增加index.refresh_interval 配置值,减少Segment文件创建,减少merge发生频率
  • 第三:增加memory Buffer大小,减少Segment文件创建,减少merge发生频率,最小值 48MB< 默认值 JVM 空间的10% < 默认最大无限制
  • 第四:关闭副本,当需要单次写入大量数据,或者就是es数据初始化的时候,建议关闭副本,暂停搜索服务,或选择在检索请求量谷值区间时间段来完成。通过index.number_of_replicas 为0 设置,同步完成后在复原
    • 第一可以减少读写资源的抢占,读写分离
    • 第二 副本的存在会导致主从之间频繁的进行数据同步,大大增加服务器的资源占用。
  • 第五:使用多个工作线程,设置为 cpu 数 + 1
  • 第六:避免使用避免使用稀疏数据,稀疏数据就是你有100 个字段,但是每条数据都只占用其中一个字段,这就是稀疏数据
  • 第七:合理的max_result_window参数,分页返回的最大数值,默认值为10000,是JVM的一种保护机制
查询性能调优
  • 首先明确:读写性能不可兼得
具体优化方法:
第一:避免单次召回大量数据
  • 搜索引擎最擅长的事情是从海量数据中查询少量相关文档,而非单次检索大量文档。非常不建议动辄查询上万数据。如果有这样的需求,建议使用滚动查询,条件限制查询尽量减少返回数据量
第二:避免单个文档过大
  • 鉴于默认http.max_content_length设置为 100MB,所以单个文档(一行数据)不要超过100M
第三:单次查询10条文档 好于 10次查询每次一条(批量的优势)
  • 批量请求将产生比单文档索引请求更好的性能。但是每次查询多少文档最佳,不同的集群最佳值可能不同,为了获得批量请求的最佳阈值,建议在具有单个分片的单个节点上运行基准测试,测试方式可以逐次增加批量级别,观察索引速度取一个合适的量级
第四:给系统留足够的内存
  • luncene数据Segment 的flush到磁盘是发生在缓存中的,因此要给OS cache预留足够的内从大小
第五:预索引
  • 在能预知的业务场景下,我们给必须的查询字段创建索引,例如我们知道每个文档都有 price 价格字段,那么我们预先打开 price的doc values属性来创建正排索引,之后通过price来完成聚合查询。
第六:使用 filter 代替 query
  • filter查询的是是不计算评分的,另外filter有相应的缓存机制,可以提高查询效率。query是要对查询的每个结果计算相关性得分的因此更慢,如果我们认为评分排序对业务并不重要,可以考虑
第七:避免深度分页
  • 详情见 elasticSearch解决方案
第八:使用 Keyword 类型
  • 并非所有数值数据都应映射为数值字段数据类型。Elasticsearch为 查询优化数字字段,例如integeror long。如果不需要范围查找,对于 term查询而言,keyword 比 integer 性能更好。只不过keyword只能是等值查询
第九:避免使用脚本
  • Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能。相对于 DSL 而言,脚本的性能更差,DSL能解决 80% 以上的查询需求,如非必须,尽量避免使用 Script

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

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

相关文章

实测2024年最佳的三款Socks5代理IP网站

一、引言 在浩瀚的网络世界中&#xff0c;Socks5代理IP服务如同导航灯塔&#xff0c;指引我们穿越数据海洋&#xff0c;安全、稳定地访问目标网站。作为专业的测评团队&#xff0c;我们深知一款优秀的Socks5代理IP网站需要具备哪些特质&#xff1a;稳定的IP资源、高效的连接速…

QT基本对话框(基本对话框、工具盒类、进度条、调色板与电子钟、可扩展对话框、程序启动画面)

此篇文章通过实例介绍基本对话框的用法。首先介绍标准文件对话框&#xff08;QFileDialog&#xff09;、标准颜色对话框&#xff08;QColorDialog&#xff09;、标准字体对话框&#xff08;QFontDialog&#xff09;、标准输入对话框&#xff08;QInputDialog&#xff09;以及标…

AI绘画 Stable Diffusion【特效文字】:火焰特效艺术字,轻松搞定特效生成!

大家好&#xff0c;我是画画的小强 今天我们继续艺术字系列的分享&#xff0c;艺术字的玩法很多&#xff0c;今天给大家带来的是火焰特效艺术字的制作。我们先来看火焰特效艺术字的效果图。 一. 火焰特效文字的制作方法 【第一步】&#xff1a;制作底图 这里制作底图使用白底…

VMware Workstation 安装 Centos 虚拟机

1. 下载 VMware Workstation 直接上网找官网下载即可 2. 下载 Centos 镜像 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 3.打开 VMware 创建虚拟机 3.1点击创建虚拟机 3.2 选择自定义安装 3.3 选择使用 Workstation 的版本 版本越高兼容性越低但性能越好&#xff0c;一…

2024年Stable Diffusion应用入门,AI绘画超详细兼职攻略,从零开始!

. AI绘画&#xff1a; 利用AI工具在AI绘画上的应用非常广泛&#xff0c;涵盖了从艺术创作到工业设计等多个领域。 目前市面上有许多AI绘画软件和工具&#xff0c;适合不同需求的用户。 例如&#xff0c;Midjourney、DALL-E 2、Stable Diffusion、DreamStudio等都是较为知名的…

深入了解Qt 控件:Display Widgets部件(1) 以及 QT自定义控件(电池)

QT自定义控件(电池&#xff09; 在线调色板Qt之CSS专栏Chapter1 QT自定义控件(电池&#xff09;Chapter2 Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件(1)1 Display Widgets简介2 如何使用Display Widgets部件 Chapter3 Qt自定义控件电池组件使用前言一、最基…

AIGC实战:LLaMA2打造中文写作利器——数据准备与模型训练全攻略

目录 一、下载并加载中文数据集二、中文数据集处理 1、数据格式 2、数据集处理之tokenizer训练格式 1&#xff09;先将一篇篇文本拼凑到一起&#xff08;只是简单的拼凑一起&#xff0c;用于训练tokenizer&#xff09; 2&#xff09;将数据集进行合并 3、数据集处理之模型&am…

新书速览|解密AI绘画与修图: Stable Diffusion+Photoshop

《解密AI绘画与修图&#xff1a; Stable DiffusionPhotoshop》 本书内容 《解密AI绘画与修图&#xff1a;Stable DiffusionPhotoshop》全面介绍了Photoshop和Stable Diffusion的交互方式&#xff0c;以及各自的AI功能和具体使用方法。除了讲解功能&#xff0c;还通过实际案例加…

浪潮信息存储的灵魂:平台化+场景化 全面释放数据价值

在数字化浪潮的席卷下&#xff0c;浪潮信息存储平台凭借卓越的性能和稳定性&#xff0c;正日益成为企业释放数据价值的重要力量。近日&#xff0c;浪潮信息出席了“2024数据基础设施技术峰会”&#xff0c;相关代表聚焦当前数据价值的释放话题&#xff0c;围绕先进存储基础设施…

Mongodb安装与配置

Mongodb的下载 这里下载的是MongoDB 7.0.11版本的 首先进入官网&#xff1a;https://www.mongodb.com/ 点击完上面两步后&#xff0c;加载来到该页面&#xff0c;选择自己的版本、系统&#xff0c;是压缩包(zip)还是安装包(msi)。 下载好之后能&#xff0c;来到安装包哪里&a…

爱奇艺 Opal 机器学习平台:特征中心建设实践

01 综述 Opal 是爱奇艺大数据团队研发的一站式机器学习平台&#xff0c;旨在提升特征迭代、模型训练效率&#xff0c;帮助业务提高收益。整个平台覆盖了机器学习生命周期中特征生产、样本构建、模型探索、模型训练、模型部署等在内的多个关键环节。其中特征作为模型训练的基石…

maven安装jar和pom到本地仓库

举例子我们要将 elastic-job-spring-boot-starter安装到本地的maven仓库&#xff0c;如下&#xff1a; <dependency><groupId>com.github.yinjihuan</groupId><artifactId>elastic-job-spring-boot-starter</artifactId><version>1.0.5&l…

基于SpringBoot网吧管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《600套》 2025-2026年最值得选择的Java毕业设计选题大全&#xff1…

TCP/IP模型原理(理论)

TCP/IP模型 1. 网络模型简介2. 应用层2.1 URL2.1.1 urlencode和urldecode 2.2 HTTP协议2.2.1 HTTP协议格式2.2.2 HTTP问题2.2.3 HTTPS 3 传输层3.1 端口号3.2 udp3.2.1 udp协议帧格式3.2.2 udp特点3.2.3 udp缓冲区3.2.4 注意 3.3 tcp协议3.3.1 tcp协议段格式3.3.2 确认应答机制…

计算机组成原理:海明校验

在上图中&#xff0c;对绿色的7比特数据进行海明校验&#xff0c;需要添加紫色的4比特校验位&#xff0c;总共是蓝色的11比特。紫色的校验位pi分布于蓝色的hi的1, 2, 4, 8, 16, 32, 64位&#xff0c;是2i-1位。绿色的数据位bi分布于剩下的位。 在下图中&#xff0c;b1位于h3&a…

如何借助ai(文心一言)获取tushare的数据

1. 准备工作 确保已安装python &#xff0c;安装Tushare库 和文心一言的地址&#xff08;文心一言&#xff09;&#xff1a; 注册Tushare账号并获取Token&#xff1a;在Tushare官方网站注册账号&#xff0c;并获取个人Token。如下 tushare地址&#xff1a;&#xff08;点击即…

音视频开发32 FFmpeg 编码- 视频编码 h264 参数相关

1. ffmpeg -h 这个命令总不会忘记&#xff0c;用这个先将ffmpeg所有的help信息都list出来 C:\Users\Administrator>ffmpeg -h ffmpeg version 6.0-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 pro…

如何恢复已删除的 JPG/JPEG 图片文件

您是否意外丢失或删除了 JPG 或 JPEG 照片&#xff1f;幸运的是&#xff0c;您可以使用照片恢复工具找回它们。立即获取 JPEG 恢复工具 - PC 版照片恢复&#xff1a; 照片是捕捉和重温生活中特殊时刻的最佳方式。因此&#xff0c;当我们因硬盘崩溃、意外格式化磁盘或错误删除图…

Element UI搭建使用过程

本章内容基于上一篇---Vue-cli搭建项目基础版 Vue-cli搭建项目----基础版-CSDN博客 官网地址:Element - The worlds most popular Vue UI framework 介绍:完全基于Vue.js ,用于快速搭建用户界面. 第一步:安装ElementUI 在终端输入 npm i element-ui -S 在main.js输入 …

SpringMVC启动流程

文章目录 引文HandlerHandlerMapperHandlerAdapterRequestMapping方法参数解析RequestMapping方法返回值解析文件上传流程拦截器解析 SpringMVC启动流程如下 引文 我们在使用SpringMVC时&#xff0c;传统的方式是在webapp目录下定义一个web.xml文件&#xff0c;比如&#xff1a…