一、收缩索引

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 入门到高手的成长阶梯-索引的基本操作(2)-索引的收缩和拆分相关推荐

  1. Elasticsearch 入门到高手的成长阶梯-索引的基本操作(1)

    1. 创建索引 Elasticsearch中索引的名称,必须符合以下要求: 字母只能够是小写字母 不能够包含特殊字符,如\, /, *, ?, ", <, >, |, ` ` , ...

  2. Elasticsearch 入门到高手的成长阶梯-Elasticsearch集成中文分词IK

    ​​​​​​1.IK的介绍 Elasticsearch IK分析器插件是国内非常著名的开源中文分析器插件,它是基于国人所开发的另一款基于Luence 的IK分词器做的扩展,以达到对Elasticsea ...

  3. ElasticSearch 入门教程笔记

    视频教程:[狂神说Java]ElasticSearch7.6.x最新完整教程通俗易懂 视频地址:https://www.bilibili.com/video/BV17a4y1x7zq 拒绝白嫖,感谢狂 ...

  4. Elasticsearch系列-索引的基本操作

    Elasticsearch索引的基本操作 前言 索引基本操作 创建索引 常用数据类型 keyword text 数值类型 boolean date 数组类型 对象类型 nested 地理类型:geo_ ...

  5. Python 测试开发从入门到高手成长之路

    > 文末领取测试开发进阶指南和福利! 在" **质量第一,效率为王** "的移动互联网和大数据时代,互联网 IT 技术团队为了应对产品快速迭代要求,就必须具备持续交付的能力. ...

  6. ElasticSearch入门教程-索引

    ElasticSearch入门教程-索引 在本节中,我们将向Elasticsearch添加一些索引,映射和数据.此数据将用于本教程中说明的示例中. 创建索引 PUT http://localhost: ...

  7. Elasticsearch 入门(1):基本概念,安装教程,索引的创建,查询,删除,主键查询,修改,添加,聚合查询,条件查询

    Elasticsearch 入门 基本概念 The Elastic Stack, 包括 Elasticsearch.Kibana.Beats 和 Logstash(也称为 ELK Stack).能够安 ...

  8. ElasticSearch入门系列(三)文档,索引,搜索和聚合

    一.文档 在实际使用中的对象往往拥有复杂的数据结构 Elasticsearch是面向文档的,这意味着他可以存储整个对象或文档,然而他不仅仅是存储,还会索引每个文档的内容使之可以被搜索,在Elastic ...

  9. ElasticSearch入门一(索引CRD和文档的CRUD)

    文章目录 说明 索引的常用操作 1. 查询所有的索引信息 2. 创建索引 3. 删除索引 文档的常用操作 1. 新增文档 2. 查询文档 3. 替换文档 4. 删除文档 5. 更新文档 6. 批量查询 ...

最新文章

  1. 易宝典文章——如何将PST文件导入到Exchange 2010 的邮箱
  2. iOS开发UI篇—简单介绍静态单元格的使用
  3. InetAddress相关笔记
  4. [转载]实际举例C#引用类型和值类型的区别
  5. esp32外部中断_玩转 ESP32 + Arduino (四) 电容按键 霍尔传感器 外部中断 延时 脉冲检测...
  6. Java-基本运算符
  7. 关于jsp页面转换成excel格式下载遇到问题及解决
  8. err-disabled
  9. php中购物车功能,php如何实现购物车功能
  10. win8信息服务器不可用怎么办,win8系统下开机提示OneDrive选项此服务现在不可用请稍后再试怎么办...
  11. php导入跟引入的区别,PHP7 引入的“??” 和“?:”的区别
  12. STM32F103单片机生成16路PWM波
  13. c++语言 xml数据绑定技术简介
  14. 淘宝开源网络框架tbnet之buffer
  15. sm框架 访问局域网mysql_ssm框架搭建之sm框架整合
  16. 百度面试题--度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同,度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?
  17. mate桌面暗色调超好看的配置
  18. 【SpringCloud】SpringCloud简介
  19. 苹果系统虚拟机无usb服务器,苹果电脑Mac系统中VMware虚拟机无法识别USB Key如何解决...
  20. 计算机知识太多了记不住,背得滚瓜烂熟的知识点 为什么一上考场全忘了?这样做事半功倍...

热门文章

  1. CSDN Markdown编辑器语法、颜色规则(含常用内容补充)
  2. 2020-11-19 南京途牛前端现场面试
  3. 什么样的工程师才能被称为资深,又如何成为资深Java工程师呢?
  4. Spring - ApplicationContextInitializer 扩展接口
  5. docker 利用docker拉取Nvidia/cuda官方镜像,部署深度学习环境
  6. 防火防盗防闺蜜——linux系统安全及应用
  7. java计算机毕业设计vue.js开发红酒网站MyBatis+系统+LW文档+源码+调试部署
  8. 提升团队能力的真正利器不是培训而是复盘,
  9. dnf服务器预更新状态,预更新 | 手游网游页游攻略大全
  10. Word文档中插入心形特殊符号