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

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.mzph.cn/pingmian/35204.shtml

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

相关文章

Ubuntu20.04安装python2和python3及版本配置

Ubuntu20.04安装python2和python3及版本配置_ubuntu 20.04 python3-CSDN博客https://blog.csdn.net/pangc2014/article/details/117407413 >>>ubuntu 安装源码python2_mob649e8161c39d的技术博客_51CTO博客https://blog.51cto.com/u_16175489/7327966

大厂薪资福利篇第四弹:字节跳动

欢迎来到绝命Coding&#xff01; 今天继续更新大家最关心的 大厂薪资福利系列&#xff01; 往期分享&#xff1a; 福利开水喝不完&#xff1f;大厂薪资福利篇&#xff01;美团 职场文化发源地&#xff1f;大厂薪资福利篇&#xff01;阿里巴巴 给这么多&#xff01;还能带宠物上…

MFC案例:自制工具条(Toolbar)按钮的小程序

程序目标&#xff1a;在基于对话框的MFC项目中&#xff0c;自制三个 Toolbar 按钮&#xff08;用颜色区分&#xff0c;分别为红、绿、蓝&#xff09;&#xff1b;程序运行时&#xff0c;单击红色按钮显示一个红色的填充椭圆&#xff1b;再单击绿色按钮则进行清屏&#xff1b;最…

[hive] posexplode生成从去年一月一号,到本月的月时间表

生成从去年一月一号&#xff0c;到本月的月时间表 posexplode用法&#xff1a; lateral view 表别名 as 序号列名,数组中的元素的名 1、生成序列 SELECT time_stamp_fist_day_of_last_year,--去年第一天的时间戳numfrom(SELECTsplit(repeat_o,,) o_array,time_stamp_fist_da…

用英文介绍纽约:NEW YORK, USA‘s MEGACITY

NEW YORK, USA’s MEGACITY | America’s Largest City Link: https://www.youtube.com/watch?vdzjQ-akB3BI&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index24 The story of New York City, America’s megalopolis. Summary Paragraph 1: The Historical Developm…

Chrome插件:​Vue.js Devtools 高效地开发和调试

在现代前端开发中&#xff0c;Vue.js因其灵活性和性能优势&#xff0c;受到越来越多开发者的青睐。然而&#xff0c;随着项目规模的扩大&#xff0c;调试和优化变得愈发复杂。幸运的是&#xff0c;Vue.js Devtools的出现&#xff0c;为开发者提供了一套强大的工具集&#xff0c…

vue大屏适配方案

前言 开发过大屏的铁汁们应该知道&#xff0c;前期最头疼的就是大屏适配&#xff0c;由于大屏项目需要在市面上不是很常见的显示器上进行展示&#xff0c;所以要根据不同的尺寸进行适配&#xff0c;今天我将为大家分享的我使用的大屏适配方案&#xff0c;话不多说&#xff0c;直…

Matlab|风光及负荷多场景随机生成与缩减

目录 1 主要内容 计算模型 场景生成与聚类方法应用 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序方法复现了《融合多场景分析的交直流混合微电网多时间尺度随机优化调度策略》3.1节基于多场景技术的随机性建模部分&#xff0c;该部分是随机优化调度的重要组成部分…

轻松掌握:工科生如何高效阅读国际期刊和撰写论文(下)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

透明屏幕的魅力:为何它如此受欢迎

在科技日新月异的今天&#xff0c;透明屏幕技术以其独特的魅力和广泛的应用前景&#xff0c;逐渐成为了科技领域的一颗璀璨明星。从智能手机、平板电脑到大型显示屏&#xff0c;透明屏幕技术以其前所未有的视觉体验和实用性&#xff0c;赢得了广大消费者的喜爱。 一、透明屏幕的…

docker 镜像突然拉取不了,教你解决

最近我们可以发现&#xff0c;在Linux系统里拉取不了镜像了&#xff0c;翻墙也拉取不了&#xff0c;这时候我们可以有一个新的docker 镜像同步网站来解决这个问题 一、首先打开镜像官网&#xff08;需要翻墙&#xff09; https://hub.docker.com/ 然后搜索一个镜像 搜索最新…

Nginx实战:简单登录验证配置(基于openssl)

本文提供的是基于openssl创建的密码文件,对nginx指定的location访问。进行登录验证的配置方式。 1、验证页面配置 我的nginx实验环境是直接yum安装的,如果是自己编译安装的那么对应目录就是自己安装配置的目录。 先在/usr/share/nginx/html下创建一个usertest.html,里面添加…

Spring Cache常见问题解决

目录 一 报错:Null key returned for cache operation 二 报错&#xff1a;类型转换异常 三 取出的数据为null 一 报错:Null key returned for cache operation 这里报错有两种情况&#xff1a; 第一&#xff0c;如果你在新增的方法上使用Cacheable注解&#xff0c;那么肯定是…

绝望中迎来曙光,阿里大模型算法岗 Offer 突然来了!

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

用定时器T1中断控制两个LED以不同周期闪烁

#include<reg51.h> // 包含51单片机寄存器定义的头文件 sbit D1P2^0; //将D1位定义为P2.0引脚 sbit D2P2^1; //将D2位定义为P2.1引脚 unsigned char Countor1; //设置全局变量&#xff0c;储存定时器T1中断次数 unsigned char Countor2; //设置全局变量&#xff0c;储…

virutalBox安装debian并配置docker环境

下载镜像 https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso 虚拟机安装 如何在Virtual Box 上安装Debian系统_virtual box debian iso netinst-CSDN博客 启动命令行模式 如何设置Debian图形启动或命令行界面启动&#xff1…

什么是Cookie?有什么用?如何清除浏览器中的Cookie?

互联网上的每一次点击和每一个选择都可能被一种名为Cookie的技术记录下来。但Cookie是什么&#xff1f;我们在网站上登录时&#xff0c;为什么经常会被问及是否接受Cookie&#xff1f;接受Cookie登录会不会影响我们的在线隐私&#xff1f; Cookie是什么&#xff1f; Cookie是一…

S-Clustr(影子集群)V3 高并发,去中心化,多节点控制

S-Clustr 项目地址:https://github.com/MartinxMax/S-Clustr/releases/tag/S-Clustr-V3.0 Maptnh Не ограничивайте свои действия виртуальным миром. GitHub: Maptnh Jay Steinberg Man kann die Menschen, die man hasst, in d…

体育赛事翻译欧洲杯足球翻译术语分享

欧洲杯又称欧洲足球锦标赛&#xff0c;是世界上受欢迎和具影响力的国际体育赛事之一&#xff0c;有关足球翻译的术语分享如下&#xff1a; penalty mark (点球)罚球点,midfielder 前卫,center forward 中锋 full back 后卫,bicycle kick / overhead kick 倒钩球,chest-high ba…

如何用Vue3打造一个交互式数据统计仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 代码相关技术博客 1. 代码应用场景介绍 本代码示例展示了一个用于展示统计数据的仪表盘界面。它适用于需要可视化跟踪和分析各种指标的应用程序&#xff0c;例如财务管理、健康监测和商业智能。 2. 代码基本…