Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何用shrink与rolloverAPI管理您的ES索引?

如何用shrink与rolloverAPI管理您的ES索引?

原创
作者头像
雨夜v1
修改于 2021-07-13 03:25:56
修改于 2021-07-13 03:25:56
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

简介

众所周知,Elasticsearch的分片数是固定的,从确定下来就不可以改变了(除非reindex),但是在一些场景,比如存储 metric 的 TSDB、小数据量的日志存储,人们会期望在多分片快速写入数据以后,把老数据合并存储,节约过多的 cluster state 容量。从 5.0 版本开始,Elasticsearch 新提供了 shrink 接口,可以成倍数的合并分片数。至于rollover也是ES5.0后的一个重要功能,这个功能可以说取代了curator,实现了ES本身的生命周期管理。今天我们就好好讲讲这两个重要功能。

Shrink Index

Shrink API允许你将一个现有的索引缩减为一个具有较少主分片的新索引。目标索引中要求的主分片数量必须是源索引中分片数量的一个因素。例如,一个有8个主分片的索引可以缩减为4、2或1个主分片,或者一个有15个主分片的索引可以缩减为5、3或1。如果索引中的分片数量是一个质数,它只能被缩减为一个主分片。在缩减之前,索引中每个分片的(主分片或副本)副本必须存在于同一个节点上。

Shrink工作的原理主要如下:

  1. 它创建一个新的目标索引,其定义与源索引相同,但是主分片的数量较少。
  2. 它把源索引中的分片硬链接到目标索引中。如果文件系统不支持硬链接,那么所有的分片都被复制到新的索引中,这是一个更耗时的过程)。另外,如果使用多个数据路径,不同数据路径上的分片如果不在同一个磁盘上,就需要完整地复制段文件,因为硬链接在不同的磁盘上不起作用)
  3. 它恢复了目标索引,就像它是一个刚刚被重新打开的封闭索引一样。
  4. 这一步官当并没有提及,可选处理。可以将索引副本恢复为2,打开数据重均衡。

说了原理大家也要知道shrink需要注意的事项具体可以参考官当如下:

Shrink Index需要注意的事项
Shrink Index需要注意的事项

以下三点需要特别注意:

  • 分片必须只读;
  • 所有shrink的索引都必须在同一个节点;
  • 集群必须是green;

下面我们进行实际的操作,操作环境为1 hot,1warm,1 cold。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET _cat/nodeattrs?v
node  host            ip              attr            value
node3 192.168.248.117 192.168.248.117 rack            rack3
node3 192.168.248.117 192.168.248.117 xpack.installed true
node3 192.168.248.117 192.168.248.117 box_type        warm
node1 192.168.248.115 192.168.248.115 rack            rack1
node1 192.168.248.115 192.168.248.115 xpack.installed true
node1 192.168.248.115 192.168.248.115 box_type        cold
node2 192.168.248.116 192.168.248.116 rack            rack2
node2 192.168.248.116 192.168.248.116 xpack.installed true
node2 192.168.248.116 192.168.248.116 box_type        hot

Shrink Index 实验步骤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.删除源和目标索引
DELETE my_source_index
DELETE my_target_index
2.创建源索引
PUT my_source_index
{
 "settings": {
   "number_of_shards": 6,
   "number_of_replicas": 0
 }
}

PUT my_source_index/_doc/1
{
  "key":"yuyev1"
}

GET _cat/shards/my_source_index

# 分片数5,会失败
POST my_source_index/_shrink/my_target_index
{
  "settings": {
    "index.number_of_replicas": 0,
    "index.number_of_shards": 5,
    "index.codec": "best_compression"
  },
  "aliases": {
    "my_search_indices": {}
  }
}



# 报错,因为没有置成 readonly
POST my_source_index/_shrink/my_target_index
{
  "settings": {
    "index.number_of_replicas": 0,
    "index.number_of_shards": 2,
    "index.codec": "best_compression"
  },
  "aliases": {
    "my_search_indices": {}
  }
}

#将 my_source_index 设置为只读
PUT /my_source_index/_settings
{
  "settings": {
    "index.blocks.write": true
  }
}
# 报错,必须都在一个节点
POST my_source_index/_shrink/my_target_index
{
  "settings": {
    "index.number_of_replicas": 0,
    "index.number_of_shards": 2,
    "index.codec": "best_compression"
  },
  "aliases": {
    "my_search_indices": {}
  }
}

DELETE my_source_index
## 确保分片都在 hot
PUT my_source_index
{
 "settings": {
   "number_of_shards": 6,
   "number_of_replicas": 0,
   "index.routing.allocation.include.box_type":"hot"
 }
}

PUT my_source_index/_doc/1
{
  "key":"yuyev1"
}

GET _cat/shards/my_source_index

#设置为只读
PUT /my_source_index/_settings
{
  "settings": {
    "index.blocks.write": true
  }
}

#成功
POST my_source_index/_shrink/my_target_index
{
  "settings": {
    "index.number_of_replicas": 0,
    "index.number_of_shards": 2,
    "index.codec": "best_compression"
  },
  "aliases": {
    "my_search_indices": {}
  }
}


GET _cat/shards/my_target_index

# My target_index状态为也只读
PUT my_target_index/_doc/1
{
  "key":"yuyev1"
}

Split 索引实验步骤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE  my_target_index
POST my_source_index/_split/my_target_index
{
  "settings": {
    "index.number_of_shards": 12,
    "index.number_of_replicas":0
  }
}

GET _cat/shards/my_target_index



# write block
PUT my_target_index/_doc/1
{
  "key":"yuyev1"
}

小结一下,shrink Index和Split可以快速帮你为你的索引扩容或者缩容分片,但是对于源索引的话有:1.分片必须可读,2.所有的shrink或者split的索引分片必须在一个节点上;3.集群必须为green。同时得到的目标索引也是只读索引。

Rollover Index

当现有的索引满足你提供的条件时,rollover index API将一个别名滚动到一个新的索引。你可以使用这个API来清退一个变得太大或者太旧的索引。简单来说rollover可以根据三个条件进行对索引进行滚动,1.索引的存活时间,2.索引的最大文档数,3.最大的文件尺寸。

应用场景主要有以下三种:

1.索引文档数过大或者文件太大需要进行新索引创建和别名切换,比如我们公司的索引单个索引会按照前一天的业务量制定后一天的索引分片数,单个分片为25GB,当索引的所有分片都达到25gb的时候就会自动切换到下一个新的索引。

2.结合Index LifeCycle Management Policies一起使用。这一部分主要是ES不会自动去监控索引,只有调用rollover API才会进行进一步的监测。

下面我们进行进一步的实验说明,具体如下:

Rollover Index实验步骤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Rollover API
DELETE nginx-logs*
# 不设定 is_write_true
# 名字符合命名规范
PUT /nginx-logs-000001
{
  "aliases": {
    "nginx_logs_write": {}
  }
}

# 6次写入文档
POST nginx_logs_write/_doc
{
  "log":"something"
}


POST /nginx_logs_write/_rollover
{
  "conditions": {
    "max_age":   "1d",
    "max_docs":  5,
    "max_size":  "5gb"
  }
}

GET /nginx_logs_write/_count   --数据量变成了新索引的数据量
# 查看 Alias信息
GET /nginx_logs_write
# 对应别名切换到了另一个索引
{
  "nginx-logs-000002" : {
    "aliases" : {
      "nginx_logs_write" : { }
    },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1625843145356",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "weIJFbKGRpm23tqlriuZMQ",
        "version" : {
          "created" : "7020199"
        },
        "provided_name" : "nginx-logs-000002"
      }
    }
  }
}



#将别名切换的指定的索引中
DELETE apache-logs*


# 设置 is_write_index
PUT apache-logs1
{
  "aliases": {
    "apache_logs": {
      "is_write_index":true
    }
  }
}
POST apache_logs/_count

POST apache_logs/_doc
{
  "key":"value"
}

# 需要指定 target 的名字
POST /apache_logs/_rollover/apache-logs2
{
  "conditions": {
    "max_age":   "1d",
    "max_docs":  1,
    "max_size":  "5gb"
  }
}


# 查看 Alias信息
GET /apache_logs

第二种方式切换后读写情况如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "apache-logs1": {
    "aliases": {
      "apache_logs": { "is_write_index": true }
    }
  },
  "apache-logs2": {
    "aliases": {
      "apache_logs": { "is_write_index" : false }
    }
  }
}

小结一下,rollover在设置is_write_index为true的时候,不仅会保留老的索引也会保留新的索引数据,同时rollover之后还会将老的索引的is_write_index改为false,这种方式是比较推荐的。

总结

本文主要通过例子和原理讲解了Shrink,Split以及Rollover对ES索引的管理,通过本文的讲解可以让大家在生产中对ES索引管理自如。

参考

https://www.elastic.co/guide/en/elasticsearch/reference/7.1/indices-shrink-index.html#indices-shrink-index

https://www.elastic.co/guide/en/elasticsearch/reference/7.1/indices-rollover-index.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
介绍几个实际生产中常用的API
本文将介绍几个ES集群生产运维中用得比较多的API,方便大家操作维护日常的运维问题。
南非骆驼说大数据
2021/01/03
1.5K0
Elasticsearch 缩减索引的分片个数「Index Shrink」
本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。
岳涛
2024/08/31
2130
Elasticsearch 缩减索引的分片个数「Index Shrink」
干货 | Elasticsearch 索引生命周期管理 ILM 实战指南
关于人生,有人这么说:“人,生来一个人,死去一个人,所以,人生就是一个人生老病死的简称。”
铭毅天下
2021/06/25
7.3K1
干货 | Elasticsearch 索引生命周期管理 ILM 实战指南
ElasticSearch最全详细使用教程:入门、索引管理、映射详解
墨墨导读:本文介绍了ElasticSearch的必备知识:从入门、索引管理到映射详解。
数据和云
2019/08/12
3.2K0
ElasticSearch最全详细使用教程:入门、索引管理、映射详解
让Elasticsearch飞起来!百亿级实时查询优化实战
经过对 Elasticsearch 多方调研和超过几百亿条数据的插入和聚合查询的验证之后,我们总结出以下几种能够有效提升性能和解决这一问题的方案:
猿天地
2019/06/18
1.7K0
使用索引拆分(Split)和索引收缩(shrink )对Elasticsearch进行优化
在Elasticsearch集群部署的初期我们可能评估不到位,导致分配的主分片数量太少,单分片的数据量太大,导致搜索时性能下降,这时我们可以使用Elasticsearch提供的Split功能对当前的分片进行拆分,拆分到具有更多主分片的新索引。
MCNU云原生
2023/03/17
1.9K0
使用索引拆分(Split)和索引收缩(shrink )对Elasticsearch进行优化
Elasticsearch从入门到放弃:索引基本使用方法
前文我们提到,Elasticsearch的数据都存储在索引中,也就是说,索引相当于是MySQL中的数据库。是最基础的概念。今天分享的也是关于索引的一些常用的操作。
Jackeyzhe
2020/03/11
9530
白话Elasticsearch73_ES生产集群中的索引管理01
Index APIs: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html
小小工匠
2021/08/17
4370
腾讯云Elasticsearch索引生命周期管理原理及实践
本文将从三个方面介绍Elasticsearch索引生命周期管理的特性,首先会介绍ES索引生命周期管理的基本原理,其次会通过一个常见的日志场景来一步步配置索引生命周期管理,最后向大家介绍在日常的ES运维工作中遇到的关于索引生命周期管理常见的问题及解决方法。
吴容
2021/12/04
4.5K0
腾讯云Elasticsearch索引生命周期管理原理及实践
Elasticsearch ILM 索引生命周期管理 - ES 必备技能
假设有三个索引,my-index-001, my-index-002, my-index-003, 全部绑定到别名 my-alias, 并且 my-index-003 设置了 "is_write_index": true。这意味着对 my-alias 查询可以查询到以上所有三个索引的数据,而对 my-alias 写入数据只会写入到 my-index-003。
sir5kong
2023/07/20
1K0
ES 索引模板(Index Template)详解
在创建索引之前可以先配置模板,这样在创建索引(手动创建索引或通过对文档建立索引)时,模板设置将用作创建索引的基础。
Linux运维技术之路
2024/02/29
2.3K0
ES 索引模板(Index Template)详解
Elasticsearch索引全生命周期一网打尽
索引(Index)是Elasticsearch中最重要的概念之一,也是整个Elasticsearch操作的基础,它是相互关联的文档的一个集合。在Elasticsearch种,数据存储为 JSON 文档,每个文档将一组键(字段或属性的名称)与其对应的值(字符串、数字、布尔值、日期、地理位置或其他类型的数据)相关联,Elasticsearch 使用一种称为倒排索引的数据结构,旨在实现非常快速的全文搜索。倒排索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。
MCNU云原生
2023/03/17
1.1K0
Elasticsearch索引全生命周期一网打尽
Elasticsearch探索:rollover API
rollover API 使你可以根据索引大小,文档数或使用期限自动过渡到新索引。 当 rollover 触发后,将创建新索引,写别名(write alias) 将更新为指向新索引,所有后续更新都将写入新索引。
HLee
2021/01/11
8991
Elasticsearch探索:rollover API
Elasticsearch之索引管理API(Index management)
代码@1:索引的配置属性。请详细参考如下博文: 代码@2:定义映射,有点类似于关系型数据库中的定义表结构,详情请参考:Elasticsearch Mapping parameters(主要参数一览)、Elasticsearch Mapping类型映射概述与元字段详解 代码@3:为索引指定别名设置。
丁威
2019/06/11
3K0
Elasticsearch之索引管理API(Index management)
一步一步理解ES中的索引管理逻辑,从手动_rollover到ILM
在早期的版本中,索引中的数据增长到一定量之后,如何实现无感切换,答案是通过定时任务和_rollover api,注意_rollover api只能应用于别名,并且应用切换条件。
周银辉
2024/07/19
3920
【操作实践】使用JuiceFS降低Elasticsearch存储成本
本文更偏向于实践操作方向,主要介绍在部署和使用JuiceFS时候的过程记录,以及如何将JuiceFS作为Elasticsearch的冷存储介质。
用户5252199
2022/11/22
8220
《Elasticsearch 源码解析与优化实战》第17章:Shrink原理分析
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-shrink-index.html
HLee
2021/08/16
1.1K0
《Elasticsearch 源码解析与优化实战》第17章:Shrink原理分析
ElasticSearch Java 高级客户端索引操作~
继续 Es 客户端~今天我们来看看 high level rest client ~
江南一点雨
2021/01/28
7650
ES7.5 下动态扩大索引的shard数量
在老版本的ES(例如2.3版本)中, index的shard数量定好后,就不能再修改,除非重建数据才能实现。
保持热爱奔赴山海
2020/02/14
2.5K2
Elastic Stack 实战教程 2:ILM 索引生命周期管理
索引生命周期管理 (Index Lifecycle Management, ILM) 是在 Elasticsearch 在 6.6(公测版)首次引入并在 6.7 版正式推出的一项功能。ILM 旨在帮助用户更方便地管理时序数据(例如日志,指标等)。时序数据有如下几个典型的特点:
Se7en258
2023/02/26
6840
Elastic Stack 实战教程 2:ILM 索引生命周期管理
推荐阅读
相关推荐
介绍几个实际生产中常用的API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验