Elasticsearch 入门到高手的成长阶梯-索引的基本操作(2)-索引的收缩和拆分

ElasticSearch之Index modules 阅读详情

一、收缩索引

1、介绍

在大型的集群中,索引的分片也往往比较多,但是随着时间的推移,有一些索引慢慢的就会由“热”变“冷”,到最终基本上不再使用;还有一些索引,它本身的索引文档的数据量并不多,但是却还是使用了不少的分片。如果不对这些索引进行管理,这些索引的分片信息就会一直被集群所维护着,集群主节点维护分片的压力就会越来越大,如果是涉及到集群恢复,也会耗费更多的时间。

Elasticsearch本身提供了集群收缩的shrink API来执行这方面的操作,但不是针对源索引执行操作,它会创建一个和源索引除主分片数不一样的目标索引来存储数据,在收缩完成后,源索引就可以被删除了,这样就达到索引收缩的目的。

索引收缩工作过程

  1. 创建一个新的目标索引,其定义与源索引相同,只是主分片数量较少;
  2. 将源索引中的段硬链接到目标索引(如果文件系统不支持硬链接,则会将所有段复制到新索引中,这是一个更耗时的过程);
  3. 恢复目标索引,像重新打开一个关闭的索引一样;

 

索引被收缩需要满足的条件

  1. 目标索引必须是不存在;
  2. 源索引必须被设置为只读状态;
  3. 当前集群的健康状态须为绿色;
  4. 源索引必须比目标索引有更多的主分片数;
  5. 目标索引中的主分片数,必须是源索引的一个因子,或者可以理解为目标索引的分片数可以被源索引整除。如源索引有8个主分片,则目标索引的主分片可以是4个、2个或1个,如源索引有15个主分片本,则目标索引的主分片可以是5个、3个或1个,如源索引的主分片数是一个素数,如7个,则目标索引的主分片数则只能够是1个;
  6. 源索引的所有索引文档数量如果超过了2,147,483,519个,则不能够将其收缩为只有一个主分片的目标索引中,因为这已经超过了单个分片所能够存放的最大的索引文档数;
  7. 用于执行索引收缩的节点,必须有足够的硬盘空间,以便于存储新的索引;
  8. 在执行索引的收缩之前,需要确保当前索引的所有分片(分片可以是主分片或副本)必须存在于同一个节点之前,因而在执行索引的收缩之前,需要先执行分片的移动。如被收收缩的索引有5个主分片,其中有3个主分片:主分片1、主分片2、主分片3,和2个副本:副本4和副本5都已经迁移到了同一个节点上,则这个时候才可以执行索引的收缩操作。

 

下面是针对具有5个主分片1个副本的索引new_index的收缩过程,new_index所在的索引包括了三个节点:es-learnnode-1、es-learnnode-2和es-learnnode-3,使用节点es-learnnode-1来执行收缩操作,此时new_index的分片在集群中是如下分布的:

2、移动分片并设置源节点为只读状态

PUT /new_index/_settings

{

  "settings": {

    "index.routing.allocation.require._name": "es-learnnode-1",

    "index.blocks.write": true

  }

}

该操作强制将new_index的每个分片的一份(可能是主分片或副本)都移动到了节点es-learnnode-1上,并将new_index设置为只读。

如果响应为:

{

  "acknowledged" : true

}

则表示操作执行成功。

如果索引中索引文档的数量比较多,这个操作将会花费一定的时间,移动完成后,可以在head插件上直接观察到分片的分布情况,如下图所示:

​​​​​​​3、执行索引的收缩

执行如下请求:

POST /new_index/_shrink/new_index_target

{

  "settings": {

    "index.routing.allocation.require._name": null,

    "index.blocks.write": null

  }

}

该操作执行了以下几个动作:

  1. 执行索引的压缩;
  2. 通过设置index.routing.allocation.require._name的值为null,清除了目标库中从源索引中带过来的强制索引分片的每一份都分配置到指定节点设置;
  3. 通过设置index.blocks.write属性,清除了目标库中从源过引库带过来的拒绝写入的设置;

响应如果为:

{

  "acknowledged" : true,

  "shards_acknowledged" : true,

  "index" : "new_index_target"

}

则表示操作执行成功,再查看集群中的索引,发现目标索引new_index_target已经建立成功了。

 

上面执行的收缩过程中,创建了一个新的索引,其实这本身也确实是一个创建索引的过程,此时也可以指定一些参数目标索引,如指定主分片数(一定要注意目标索引的主分片数可以被源索引的主分片数给整除,且小于源索引的主分片数)和副本数、别名等,如下示例:

POST /new_index/_shrink/new_index_target

{

  "settings": {

    "index.routing.allocation.require._name": null,

    "index.blocks.write": null,

    "number_of_shards":1,

    "number_of_replicas" : 2,

    "index.codec": "best_compression"

  }

}

注:mapping不可以在索引收缩的过程中指定。

 

这里举一个错误的示例,如果这里将目标索引的主分片数设置为2,则会报如下异常:

{

  "error": {

    "root_cause": [

      {

        "type": "remote_transport_exception",

        "reason": "[es-learnnode-2][indices:admin/resize]"

      }

    ],

    "type": "illegal_argument_exception",

    "reason": "the number of source shards [5] must be a multiple of [2]"

  },

  "status": 400

}

 

​​​​​​​二、索引的拆分

1、介绍

索引可以被拆分的次数(以及每个原始分片可以拆分成的分片数)由路由分片的数量设置index.number_of_routing_shards的值确定,拆分后的总分片数不能够超过该值,路由分片的数量指定了内部可使用的最大散列空间,以便在具有一致性散列的分片中分发文档。例如,一个具有5个索引分片的索引其路由分片数量number_of_routing_shards设置为30,则可以按因子2或3分割。换句话说,它可以按如下方式拆分:

5→10→30(每个分片先拆分成2个,然后再把拆分后的分片每个拆分成3个)

5→15→30(每个分片先拆分成3个,然后再把拆分后的分片每个拆分成2个)

5→30(每个分片拆分成6个)

路由分片数量的默认值为1024,也就是索引分片最多可以被拆分成1024个,但是这个还取决于原始主分片的数量。如原始主分片只有1个,则原始分片可被拆分成1-1024中任意数量的主分片数;如原始主分片的数量为5个,则主分片被拆分成的数量可以是10、20、40、80、160、320或最多640个分片,要达到最多的640个分片,可以通过一次拆分或者通过多次拆分。

也可以在创建索引时显式通过指定参数index.number_of_routing_shards进行设置,如下所示:

PUT /new_index_2

{

  "settings": {

    "number_of_shards":2,

    "number_of_replicas" : 2,

    "index.number_of_routing_shards": "1000"

  }

}

 

拆分的工作过程

  1. 创建一个新的目标索引,其定义与源索引相同,但主分片数量比源索引多;
  2. 将源索引中的段硬链接到目标索引(如果文件系统不支持硬链接,则会将所有段复制到新索引中,这是一个比硬链接耗时的多过程);
  3. 创建低级文件后,将再次对所有文档进行哈希处理,以删除不属于当前分片的文档;
  4. 恢复了目标索引,像重新打开原来关闭的索引一样;

 

索引可以被拆分的条件

  1. 索引需要被设置为只读;
  2. 当前集群的健康状况须为绿色;
  3. 目录索引必须是不存在的;
  4. 源索引的主分片须小于目标索引的主分片数;
  5. 目标索引的主分片数须是源索引分片数的倍数;
  6. 用于执行拆分的节点须有足够的硬盘空间,以便于保留拆分出来的新的索引;

还是以有5个主分片1个副本的索引new_index为例。

​​​​​​​2、将源索引设为只读状态

执行如下语句:

PUT /new_index/_settings

{

  "settings": {

    "index.blocks.write": true

  }

}

响应:

{

  "acknowledged" : true

}

表示执行成功,将索引new_index设置为只读状态。

​​​​​​​3、索引拆分

将目标索引的主分片数设置为源索引的2倍即10个,执行如下语句:

POST /new_index/_split/new_index_split

{

  "settings":{

    "index.number_of_shards":10

  }

}

响应:

{

  "acknowledged" : true

}

表示执行成功,再查看elasticsearch-head中new_index和new_index_split的集群分片分布如下:

可以看到new_index_split的分片数量已经是new_index的2倍了,再次确认执行拆分成功。

 

以下执行一下错误的示例,把目标索引的主分片数量设置为不是源索引主分片数量的倍,如设置为11个,则会报如下错误信息:

{

  "error": {

    "root_cause": [

      {

        "type": "illegal_argument_exception",

        "reason": "the number of source shards [5] must be a factor of [11]"

      }

    ],

    "type": "illegal_argument_exception",

    "reason": "the number of source shards [5] must be a factor of [11]"

  },

  "status": 400

}

 

ElasticSearch 索引设计指南 总结上述的实战,主要涉及到了三块:索引生命周期管理、索引 settings 设计管理、索引的 templates 管理,这几块既有配置类的设计管理,也有性能方面的考虑,还加入了生产中使用的 templates 进行设计管理,提升可维护性。并统一通过 airflow 定时任务进行自动化维护,保证了索引周期性设计的稳定性。 阅读详情

相关推荐

2024最新超详细无痛安装PyTorch,包括下载地址、环境配置与各种避坑指南

PyTorch更新很快,2024最新下载安装经验贴,包括anaconda+CUDA+cuDNN+PyTorch四部分的下载和安装。文章详细介绍了下载地址、环境配置、虚拟环境建立的问题,还温馨提示了各种闭坑指南。有需要的友友快过来康康!

qq_43596278的博客 11万+

Elasticsearch拆分索引知多少

原文链接:indices-split-index API 环境 Elasticsearch 7.13Mac 10.14.6 概述 拆分索引API允许将现有索引拆分为新索引,其中每个原始的主分片被拆分为新索引中的两个或者多个主分片 索引可以拆分的次数(以及每个原始的主分片可以拆分成的分片数量)由index.number_of_routing_shards设置。路由分片的数量指定使用的hash空间,该空间内部使用一致性hash在分片之间分发文档。例如,一个5个分片的索引,其中number_of_routing

醉鱼的博客 973

ESP32-C5硬件设计全链路指南:ADC/SDIO/USB/RF PCB实战

模数转换器(ADC)和高速外设接口是嵌入式系统硬件设计的核心基础。理解ADC通道映射、输入阻抗特性与抗干扰布线,是保障传感器采样精度的前提;掌握SDIO、USB差分信号的阻抗控制、端接策略与电源去耦方法,则直接决定通信可靠性与EMC性能。在Wi-Fi 6/Bluetooth 5.3双模SoC如ESP32-C5中,ADC复用约束、USB与SDIO管脚冲突、RF匹配网络调校、四层板叠层规划等工程细节,共同构成高成功率PCB落地的关键技术栈。本文聚焦ESP32-C5平台,系统梳理从模拟前端到射频输出的硬件设计规范

weixin_35756130的博客 345

Elasticsearch搜索优化-自定义路由规划(routing)

Elasticsearch使用routing机制缩小服务器搜索范围,减轻搜索压力。

致橡树 2158

sentaurus浪涌仿真sdevice代码解释(4)

9. `Plot(FilePrefix="Surge_n@node@" time=(Range=(0 @<0+10E-3>@) Intervals=10) NoOverWrite)`:设置了一个绘图过程,用于在瞬态分析过程中绘制结果,文件名前缀为`Surge_n@node@`,时间范围从0到`10E-3`秒,每隔10个时间点绘制一次,且不覆盖之前的结果。同样设置了最大迭代次数和线搜索阻尼系数。这个过程将模拟从`0`到`10E-3`秒内器件的行为,并且会在不同的时间点记录和绘制电流和电势的数据。

qq_52640792的博客 1658

AS7262六通道可见光传感器:从光谱原理到物联网色彩检测实战

光谱检测是嵌入式感知领域的关键技术,其核心原理是通过特定波长的滤光片分离光线并转换为电信号,从而实现对环境光或物体反射光的成分分析。这项技术的价值在于将复杂的光学分析简化为可编程读取的数字信号,极大降低了色彩检测在物联网和智能设备中的应用门槛。在智能农业、工业分拣、环境监测等场景中,精确的光谱数据能够驱动自动化决策,例如评估植物光照条件或识别物料颜色。本文以Adafruit AS7262传感器为例,深入解析其基于硅干涉滤光片的六通道设计,并通过Arduino与Python实战,演示如何快速构建从数据采集到可

weixin_28738173的博客 595

Elasticsearch基础篇(四):Elasticsearch的基础介绍与索引设置

这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文检索的应用场景检索的数据对应是大量的非结构化的文本型数据文件的记录量至少是十万以上级别支持交互式文本的全文检索查询对于检索结果的相关性具有较高的要求,且检索的实时性要求很高。

后端开发 2638

告别手动翻页!用幻影联动+DLL调用,5分钟搞定通达信分时指标自动选股

本文详细介绍了如何利用幻影联动软件结合DLL调用技术,实现通达信分时指标的自动化选股。通过改造指标代码和配置幻影联动任务,用户可以在5分钟内完成从信号检测到自动报警的全流程,大幅提升短周期交易的效率和准确性。

weixin_42561040的博客 764

elasticSearch-索引详解-索引管理

文章导航索引管理创建索引索引监控状态管理 索引管理 创建索引 /* */ PUT twitter { "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } } 索引监控 状态管理 ...

qq_42815122的博客 1768

如何用 Python 实现自动化测试?详细步骤和代码示例

Python自动化测试实战指南 本文系统介绍了使用Python构建自动化测试体系的完整方案。主要内容包括: 环境搭建:Python 3.8+虚拟环境配置,安装pytest、Selenium等核心测试库 分层测试实现: 单元测试:通过计算器示例演示pytest断言和异常测试 API测试:使用requests库进行RESTful接口验证 UI测试:Selenium WebDriver实现网页交互测试 高级特性: 使用fixture管理测试依赖 参数化实现数据驱动测试 生成HTML和Allure测试报告 GitH

m0_64424835的博客 448

AI视频生成工作流开发:从产品拆解到带货视频全流程实现

本文介绍了一套完整的AI视频生成工作流开发方案,该系统能够自动分析产品素材并生成9个标准化分镜,支持白底图智能替换,最终输出专业带货视频。系统基于Coze平台搭建,整合豆包大模型及多模态生成模型,实现从产品分析、脚本生成到视频合成的全流程自动化。关键模块包括产品特征提取、智能分镜分配、视觉内容生成和用户交互调整,支持手动优化提示词和输出结果。该方案采用模块化设计,结合多种AI模型协同工作,为电商视频制作提供高效解决方案。

huanghm88的专栏 383

【Elasticsearch索引】Rollover滚动、Shrink收缩、Split拆分索引

新索引的设置、映射和别名取自任何匹配的索引模板。另外,您可以在请求的主体中指定设置、映射和别名,就像create index一样。请求中指定的值将覆盖在匹配索引模板中设置的任何值。例如,下面的滚动请求将覆盖索引。},"index.number_of_shards": 1, //目标索引中的分片数。这必须是源索引中分片数量的一个因素。"index.codec": "best_compression" //最佳压缩仅在对索引进行新写操作时生效,例如将分片强制合并到单个段时。},

qq_44849679的博客 1961

基于Abaqus的横向各向同性线弹性理想塑性材料模型的umat子程序实现——以Fortran为例,带您揭秘弹性塑性模型编程之道

通过以上步骤,我们已经在Abaqus中使用Fortran实现了横向各向同性线弹性理想塑性材料模型的umat子程序。在实际应用中,我们需要根据具体的材料特性和加载条件来调整模型参数和计算过程。尽管我在这篇文章中尽力提供了详细的教程,但由于我自身的知识限制和经验不足,可能会有误解或错误。我希望大家在学习过程中能多思考,多实践,多交流,以更好地理解和掌握这个主题。

qq_38334677的博客 1689

Elasticsearch进行优化-使用索引拆分(Split)和索引收缩(shrink )

在Elasticsearch集群部署的初期我们可能评估不到位,导致分配的主分片数量太少,单分片的数据量太大,导致搜索时性能下降,这时我们可以使用Elasticsearch提供的Split功能对当前的分片进行拆分,拆分到具有更多主分片的新索引。

2678

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ElasticSearch搜索引擎搭建笔记

搜索引擎调研 Solr Solr是一个用java开发的独立的企业级搜索应用服务器,它提供了类似于Web-service的API接口,它是基于Lucene的全文检索服务器,也算是Lucene的一个变种,很多一线互联网公司都在使用Solr,也算是一种成熟的解决方案. 官方主页:http://lucene.apache.org/solr/ Elasticsearch Elast...

liuxing93619的博客 4980

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Elasticsearch学习笔记之(二)ES索引

快速入门 查看集群的健康状况 直接访问es服务端如下: http://localhost:9200/_cat http://localhost:9200/_cat/health 带上参数v返回结果会带上表头 http://192.168.13.129:9200/_cat/health?v 以上都是直接访问ES服务端的,下面我们直接访问ES的可视化界面Kibana来操作如下 Kibana的UI操作界面会有自动提示我们可以逐个把每个参数都查看一番 状态值说明

G探险者的博客 1922

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

实战:ElasticSearch索引管理和映射详解(补充)

静态信息不可更改,如索引的分片数。这个类比存在一个严重的问题,就是当多个mapping type中存在同名字段时(特别是同名字段还是不同类型的),在一个索引中不好处理,因为搜索引擎中只有 索引-文档的结构,不同映射类别的数据都是一个一个的文档(只是包含的字段不一样而已)如果别名logs_write指向的索引是7天前(含)创建的或索引的文档数>=1000或索引的大小>= 5gb,则会创建一个新索引 logs-000002,并把别名logs_writer指向新创建的logs-000002索引。

为无为,事无事,味无味。 1301

四、ElasticSearch——基本操作&索引管理

查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v v是用来要求在结果中返回表头 状态值说明 Green - everything is good (cluster is fully functional) Yellow - all data is available but some replicas ...

m0_38143867的博客 446

ElasticSearch 最全详细使用教程

一、快速入门 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状态值说明 Green - everything is good (cluster is fully functional),即最佳状态 Yellow - all data is available but some replicas are not yet allocated (cluster is fu

qq_40907977的博客 2万+

搜索引擎(Elasticsearch索引管理)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34302798的博客 429

elasticsearch之索引管理API(Index management)

本节详细介绍了索引管理相关的API,主要包括Index Create、Delete Index、Get index、indices Exists Index、Open/Close Index 、Shrink Index、Split Index、Rollover Index,特别详细介绍了索引的动态扩容与收缩机制。

中间件兴趣圈 8442

ElasticSearch 最全详细使用教程_怎么看elasticsearch是否可用

12.2 查看索引模板 12.3 删除模板 13. Open/Close Index 打开/关闭索引 说明:关闭的索引不能进行读写操作,几乎不占集群开销。 关闭的索引可以打开,打开走的是正常的恢复流程。14. Shrink Index 收缩索引 索引的分片数是不可更改的,如要减少分片数可以通过收缩方式收缩为一个新的索引。新索引的分片数必须是原分片数的因子值,如原分片数是8,则新索引的分片数可以为4、2、1 。什么时候需要收缩索引呢?最初创建索引的时候分片数设置得太大,后面发现用不了那么多分片,这个时候就需

2401_87112256的博客 1224

Elasticsearch索引全生命周期管理一网打尽

Elasticsearch提供了Index APIs用于Elasticsearch生命周期的管理,包括索引的创建、查询、删除和设置,索引的冻结和解冻、拆分和收缩等,掌握索引的管理是Elasticsearch开发、运维的基础能力,也有助于Elasticsearch的优化。

2145
上一篇: 集群环境中使用Redis实现分布式锁两种方式
下一篇: 集群环境中使用Zookeeper实现分布式幂等控制
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值