【ES实战】ES中关于segment的小结

news2024/11/27 21:41:29

文章目录

  • ES中关于segment的小结
    • ES中segment相关的原理
      • 在Lucene中的产生segment的过程。(Lucene commit过程)
      • ES为了实现近实时可查询做了哪些
        • 缩短数据可被搜索的等待时长
        • 增加数据的可靠性
        • 优化segment的数量 段合并
          • 自动合并
          • 强制合并
    • 相关配置
      • translog
      • 合并策略相关
      • 合并调度相关
    • 相关API
      • 手动refresh
      • 手动flush
      • 强制合并API

ES中关于segment的小结

segment对于索引的影响

  • segment数量过多会导致搜索的效率降低,主要是搜索需要遍历全部segment文件。

  • segment过大会导致,多次读取磁盘才找到数据,加剧IO和GC

  • segment数量过少会降低并发数

需要根据不同的场景控制segment的数量,单个segment的大小最大就是索引单个分片的大小,大小最大不超过50GB。

本文图片均来自elasticsearch官网

ES中segment相关的原理

一个Lucene的索引即ES中索引的一个分片

Elasticsearch底层依赖的Lucene,引入了按段查询(per-segment search)的概念。一个段(segment)是有完整功能的倒排索引,但是现在Lucene中的索引指的是段的集合,再加上提交点(commit point,即记录所有分段的文件)。当在这个commit point上进行搜索,就是在这个提交点下面的所有的segment文件中搜索,每个segment返回结果,然后汇总返回给用户。

一个Lucene索引的是示意图
在这里插入图片描述

在Lucene中的产生segment的过程。(Lucene commit过程)

在这里插入图片描述

  1. 新的文档被写入内存中。

  2. 当内存中的文档数达到一定数量或者达到一定时长。缓存会被提交。

    a. 生成一个新的segment文件,写入磁盘。

    b. 生成一个新的commit point文件,记录当前可用的所有segment。

    c. 通过同步方式,等待数据写入磁盘。

  3. 打开新建的segment文件,使其可供搜索。

  4. 清空内存。

    在这里插入图片描述

Lucene中的分段一旦创建完成,是无法变更的。优点:

  1. 没有必要给逆向索引加锁,因为不允许被更改,只有读操作,所以就不用考虑多线程导致互斥等问题。
  2. 索引一旦被加载到了缓存中,大部分访问操作都是对内存的读操作,省去了访问磁盘带来的io开销。
  3. 因为逆向索引的不可变性,所有基于该索引而产生的缓存也不需要更改,因为没有数据变更。
  4. 使用逆向索引可以压缩数据,减少磁盘io及对内存的消耗。

ES为了实现近实时可查询做了哪些

缩短数据可被搜索的等待时长

Lucene commit实现了数据的持久化(数据存入磁盘),这是一个高代价的操作,耗时且占资源。所以ES旨在减少Lucene commit的次数。

由于Lucene 允许新段被写入和打开—使其包含的文档在未进行一次完整提交时便对搜索可见。所以在文件系统的缓存中新建一个segment,将内存中的数据写入其中,并打开此segment,这样就使得数据可以快速的被搜索。此代价比直接commit的代价要小。

为了增加对上述操作的可操控性,ES提供了refresh操作。此操作就是,将内存中的文档写入新segment(文件系统缓存中),再打开这个segment的轻量的过程。通过减少refresh的间隔时间,会是数据近实时可搜索。

增加数据的可靠性

但是这个segment是临时的,在进程退出或者机器断电的情况下,数据会丢失。为了增加数据的可靠性。ES就提供了translog和flush操作,这个flush操作就是类似ucene的commit操作。

文档索引的过程

  1. 文档在被写入Lucene的内存区域的同时会被写入Translog文件中。先写Lucene,再写translog,在写Lucene时会进行数据的检查,写入会失败,先写Lucene可以避免对translog的回滚处理。

在这里插入图片描述

  1. 在refresh执行后,会将内存中的数据写入文件系统缓存中的segment中。

在这里插入图片描述

  1. 不同写入和refresh,数据不断的写入到内存和translog中。

    在这里插入图片描述

  2. 当达到一定的时长,或者translog达到一定大小时,会触发flush操作。

    a. 生成一个新的segment文件,将内存数据写入磁盘

    b. 内存缓冲区被清空。

    c. 生成一个新的commit point文件,记录当前可用的所有segment。

    d.文件系统缓存通过 fsync 被刷新(flush),将文件系统缓存中的segment写入磁盘。

    e.老的 translog 被删除。

    在这里插入图片描述

优化segment的数量 段合并

自动合并

由于自动refresh流程每个周期会创建一个新的段 ,这样会导致短时间内的段数量暴增。

段数量过多的问题:

  1. 资源过度消耗:占用大量的文件句柄、内存和CPU
  2. 降低搜索的效率:每个搜索请求都必须轮流检查每个段;所以段越多,搜索也就越慢。

ES提供了合并调度程序 (ConcurrentMergeScheduler) ,将较小的segments会定期合并为较大的段以保持索引大小并清除删除。合并过程使用自动节流来平衡合并和其他活动(如搜索)之间硬件资源的使用。

合并的方式是先复制后删除。

合并过程

  1. 根据策略选择合理的一组segment,新建一个大一点segment,将一组中的segment的数据写入新的segment中。

    在这里插入图片描述

  2. 新的segment刷盘后,新建一个新的提交点(排除被合并的那一组segment,增加新的segment)。

  3. 打开新的segment,供搜索。

  4. 删除被合并的一组segment。

    在这里插入图片描述

强制合并

强制合并API的源码分析

相关配置

translog

索引级别动态translog配置项:

  • index.translog.sync_interval

    translog 被synced到磁盘并提交的频率。 默认为5s。不允许小于100ms

  • index.translog.durability

    是否在每个索引、删除、更新或批量请求后进行 fsync 和提交 translog。 此设置接受以下参数:

    • request(默认)fsync 并在每次请求后提交。 在硬件故障的情况下,所有确认的写入都已经提交到磁盘。
    • asyncfsync 并在每个 sync_interval 后台提交。 在硬件故障的情况下,自上次自动提交以来的所有确认写入都将被丢弃。
  • index.translog.flush_threshold_size

    translog 一旦达到最大大小,就会发生flush,生成一个新的 Lucene 提交点。 默认为512mb

  • index.translog.retention.size

    要保留的 translog 文件的总大小。 保留更多的 translog 文件会增加在恢复副本时执行基于操作的同步的机会。 如果 translog 文件不足,副本恢复将回退到基于文件的同步。 默认为512mb

  • index.translog.retention.age

    translog 文件将被保留的最长时间。 默认为12h

如果集群健康状态优秀,同时可以接收数据丢失的话,可以将translog配置调整一下,增加数据写入速率。

index.translog.durability: async
index.translog.sync_interval: 120s
index.translog.flush_threshold_size: 1024mb

合并策略相关

索引级别的相关动态配置

  • index.merge.policy.expunge_deletes_allowed:当调用expungeDeletes时,我们仅在其删除百分比超过此阈值时才合并掉一个段。默认值10
  • index.merge.policy.floor_segment:小于此的段将“向上取整”到此大小,即视为合并选择的相等(下限)大小。 这是为了防止频繁刷新微小段,从而防止索引中出现长尾。默认值2MB。
  • index.merge.policy.max_merge_at_once:在“normal”合并期间一次合并的最大段数。默认值10
  • index.merge.policy.max_merge_at_once_explicit:在强制合并或 expungeDeletes 期间,一次合并的最大段数。默认值30
  • index.merge.policy.max_merged_segment:在正常合并(not explicit force merge)期间生成的最大段。此设置是近似值:合并段大小的估计是通过对要合并的段的大小求和(补偿已删除文档的百分比)得出的。默认值5GB
  • index.merge.policy.segments_per_tier:设置每层允许的段数。较小的值意味着更多的合并但更少的段。默认为 10。请注意,此值需要大于 max_merge_at_once 的值,否则您将强制发生太多合并。
  • index.merge.policy.deletes_pct_allowed:控制索引中允许的已删除文档的最大百分比。较低的值会使索引的空间效率更高,但会增加 CPU 和 I/O 活动。值必须介于 2050 之间。默认值为 33

进行写入优化的时候可以将index.merge.policy.segments_per_tier适当的变大,建议:20,在降低合并的操作次数。同时降低index.merge.policy.max_merged_segment的值,建议值:2GB,来加快写入的速度。

5.X 调整index.merge.policy.reclaim_deletes_weight增加合并含有已删除segment的权重。6已经标记为废弃。

合并调度相关

调度相关动态配置,不建议调整

  • index.merge.scheduler.max_thread_count:一次可以合并的最大线程数。 默认为 Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),它适用于良好的固态硬盘 (SSD)。 如果是机械硬盘,将其减少到 1。
  • index.merge.scheduler.auto_throttle:如果是true(默认值),则合并调度程序将根据随时间请求的合并次数将合并的 IO(写入)速率限制为自适应值。 一个低索引率的应用程序不幸突然需要一个大的合并,将会看到合并被严重限制,而一个执行大量索引的应用程序会看到限制调整的更高,以允许合并跟上正在进行的写入。
  • index.merge.scheduler.max_merge_count:一次可以合并的最大分段数。默认值由最大线程数据+5。最小值为1。

相关API

手动refresh

POST /index1,index2/_refresh

手动flush

POST index1,index2/_flush

强制合并API

强制合并API的使用

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

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

相关文章

Python 学习之路 03 之循环

😀前言 欢迎来到 Python 循环和流程控制的基础教程!无论您是一名新手,还是希望复习 Python 编程的基本知识,这个教程都是一个非常好的资源。在这份教程中,我们将探索 Python 中的不同循环结构和流程控制机制&#xff0…

火山引擎DataWind产品可视化能力揭秘

引言 BI是商业智能(Business Intelligence)的缩写,是一种将企业中现有的数据进行有效的整合的平台,它可以帮助企业、组织和个人更好地了解其业务状况、发现问题,并进行决策。BI产品普遍采用可视化的方式,可以帮助用户更直观、更高…

快速傅里叶变换

引言 目标 傅里叶变化(Fourier transform)是一种信号处理技术,它可以将时间信号转换为频率信号,即将一组具有相同数量频率的正弦波叠加在一起,形成一组新的正弦波。如果我们把时间信号从频域转换到时域,那么…

Drupal __ 8.5.0 __ XSS文件上传 __CVE-2019-6341

Drupal __ 8.5.0 __ XSS文件上传 __CVE-2019-6341 说明内容漏洞编号CVE-2019-6341漏洞名称Drupal XSS漏洞漏洞评级中危影响范围在7.65之前的Drupal 7版本中; 8.6.13之前的Drupal 8.6版本; 8.5.14之前的Drupal 8.5版本。漏洞描述Drupal诞生于2000年,是一…

PbootCMS在搭建网站

1、打开网站 https://www.pbootcms.com/ 2、点击 “本站” 下载最新的网站代码 3、在本地laragon/www下创建目录(hejuwuye),并将代码放进去 4、创建本地数据库,数据库名称为: hejuwuye,然后将static/bac…

25.Xaml DateGrid控件---->默认单选,可以多项选择的网格控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

深入理解JVM虚拟机第五篇:一些常用的JVM虚拟机(二)

文章目录 一&#xff1a;JRockit VM的介绍 二&#xff1a;J9 VM的介绍 三&#xff1a;KVM和CDC/CLDC Hotspot 四&#xff1a;Azul VM的介绍 五&#xff1a;Liquid VM的介绍 六&#xff1a;Apache Harmoney 七&#xff1a;Microsoft JVM 八&#xff1a;Taobao JVM 九&a…

第三方软件测试机构有哪些测试服务软件测试报告收费标准是怎样的?

软件验收机构 一、什么是第三方软件测试机构? 第三方软件测试机构是区别于软件开发公司以及软件需求方的第三方机构&#xff0c;软件企业将软件测试外包给第三方软件测试机构已经成为了行业发展趋势。既省心省力&#xff0c;又降低企业成本&#xff0c;得出的软件测试结果以…

【Proteus仿真】【STM32单片机】四驱寻迹避障小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 系统运行后&#xff0c;LCD1602显示红外、超声波检测状态和距离、小车运行状态。可通过K1键可手动切换模式&#xff0c;寻迹、避障、蓝牙遥控&#xff1b;也可通过蓝牙发送指令切换模式&#xff1b; 当处…

绝佳用户体验:构建响应式网页设计的关键原则

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 当谈到前端开发时&#…

使用Java创建一个简单的图书管理系统

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 图书管理系统项目简…

for...in...与for..of...

for...in... 仅迭代自身的属性for...in 语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性&#xff0c;包括继承的可枚举属性。 for ... in是为遍历对象属性而构建的&#xff0c;不建议与数组一起使用&#xff0c;数组可以Array.prototype.forEach()和for ... of const …

Python实现猎人猎物优化算法(HPO)优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

新手如何开始Microstation CE版二次开发

一步步学习MicroStation CE MDL&#xff08;C&#xff09;开发 - 技术资料库 - Bentley 中国优先社区 - Bentley Communities https://communities.bentley.com/communities/other_communities/chinafirst/w/chinawiki/57704/microstation-ce-mdl-c一步步学习MicroStation CE A…

python项目制作docker镜像,加装引用模块,部署运行!

一、创建Dockerfile # 基于python:3.10.4版本创建容器 FROM python:3.10.4 # 在容器中创建工作目录 RUN mkdir /app # 将当前Dockerfile目录下的所有文件夹和文件拷贝到容器/app目录下 COPY . /app# 由于python程序用到了requests模块和yaml模块&#xff0c; # python:3.10.4基…

使用Java创建一个待办事项列表

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 待办事项列表项目简…

基于串口通讯的多电机控制技术研究

基于STM32CubeMX生成keil工程 基于proteus 8.7版本进行程序验证 采用了简单的串口通讯协议 基本效果如图 先对电机旋转方向进行指令设置 :221 :320 分别实现对第二个电机正转、第三个电机反转设置 为了方便观测&#xff0c;程序对接受到的串口数据会进行回显。 然后使能电…

用c语言编写出三底模型

以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据&#xff0c;判断是否出现三底形态&#xff0c;如果是&#xff0c;则输出买入信号&#xff0c;否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…

Python计算机二级知识点整理

1. 一个完整的二叉树包括根节点&#xff0c;左子树和右子树&#xff0c;不同的遍历方式的区别就是访问的顺序的不同&#xff0c;前序遍历是首先访问根节点然后再访问左子树和右子树&#xff0c;中序遍历是访问根节点在访问左子树和右子树之间&#xff0c;后序遍历是先访问左子树…

ElasticSearch 5.6.3 自定义封装API接口

在实际业务中&#xff0c;查询 elasticsearch 时会遇到很多特殊查询&#xff0c;官方接口包有时不便利&#xff0c;特殊情况需要自定义接口&#xff0c;所以为了灵活使用、维护更新 编写了一套API接口&#xff0c;仅供学习使用 当前自定义API接口依赖 elasticsearch 5.6.3 版本…