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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
idea运行报Error running ‘XApplication‘_ Command line is too long. Shorten command line for XApplication
文章目录 SpringBoot项目启动报错 解決办法 SpringBoot项目启动报错 10:54 Error running 'xxxApplication': Command line is too long. Shorten command line for xxxApplication or also for Application default configuration. 报错翻译 10:54 运行“xxxApplication”时出错:命令行太长。缩短 xxxApplication 或应用
共饮一杯无
2022/11/24
5120
idea运行报Error running ‘XApplication‘_ Command line is too long. Shorten command line for XApplication
IDE 运行出现Error running 'ReadKafkaWriteKafka': Command line is too long.
Command line is too long. 一般是因为项目需要打印的环境变量太长,超过了限制,需要你缩短命令行来解决问题
码农GT038527
2024/11/25
1180
IDE 运行出现Error running 'ReadKafkaWriteKafka': Command line is too long.
解决Intellij IDEA 编译运行时出现Error running xxxApplication Command line is too long
打开程序的运行配置,把Shorten command line改为JAR manifest或classpath file,如图所示:
joshua317
2021/09/10
8000
解决Intellij IDEA 编译运行时出现Error running xxxApplication Command line is too long
IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...
目录 前言 版本约定 正文 控制台首行路径 首行路径内容 为何启动抛错Command line is too long 原因分析 IDEA老版本方案 IDEA新版本方案:命令行缩短器 jar
YourBatman
2020/11/24
10K0
IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...
IDEA命令行缩短器助你解决此问题:Command line is too long.
生命太短暂,不要去做一些根本没有人想要的东西。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以免费学习。关注公众号【BAT的乌托邦】逐个击破,深入掌握,拒绝浅尝辄止。 [2020071809515896.png] 前言 各位小伙伴大家好,我是A哥。最近遇到两个问题,都是关于IDEA的(言外之意和代码无关),很是让我“生气”呀(关键是浪费时间)。在痛定思痛后,我决定写此专栏,来专门分享/记录使用IntelliJ
YourBatman
2020/07/18
2.3K0
IDEA命令行缩短器助你解决此问题:Command line is too long.
解决:Command line is too long. In order to reduce its length classpath file can be used.
修改项目下 .idea\workspace.xml,找到标签 <component name="PropertiesComponent"> , 在标签里加一行 <property name="dynamic.classpath" value="true" />
微风-- 轻许--
2020/04/08
1.1K0
解决:Command line is too long. In order to reduce its length classpath file can be used.
Error running JeecgSystemCloudApplication: Command line is too long. Shorten command line for Jeecg
目录 解决方法 解决方法 解决办法: 修改项目下 .idea/workspace.xml,找到标签 <component name="PropertiesComponent"> , 在标签里 加一行 <property name="dynamic.classpath" value="true" />
一写代码就开心
2022/05/09
9780
IDEA跑StringBoot项目启动失败问题「建议收藏」
idea解决Command line is too long. Shorten command line for ServiceStarter or also for Application报错
全栈程序员站长
2022/09/23
3460
IDEA跑StringBoot项目启动失败问题「建议收藏」
command too long
这里有两种处理方式 第一种是在.idea->workspace.xml的<component name="PropertiesComponent">标签中添加<property name="dynamic.classpath" value="true" />
阿超
2022/08/16
3740
command too long
Error running Application. Command line is too long.
今天由于业务需要,下载了一个开源项目想要在本地运行,处理完部分报错信息后,开始启动项目,启动项目然后报错,报错信息
六月的雨在Tencent
2024/04/08
1.3K0
Error running Application. Command line is too long.
IDEA提示CreateProcess error=206, 文件名或扩展名太长。
引起这个错误的主要原因是java启动时带的启动参数超过了window的最大长度限制导致的,
JQ实验室
2022/10/17
3.7K0
你们要的Intellij IDEA 插件开发秘籍,来了!
王昭霞,软件开发工程师,先后从事脚本工具编写、工具开发、Android基础模块开发等工作。
京东技术
2018/09/28
57.1K13
你们要的Intellij IDEA 插件开发秘籍,来了!
高性能微服务架构设计模式@霞落满天
菜单栏:View—>Tool Windows—>Structure或者Alt+7(注意不是Alt+F7)
Java架构师必看
2021/07/13
7040
IDEA DEBUG 启动慢,启动卡死,本地IDEA环境,千万千万不要在方法上打断点!太坑了!
点击 IDEA 里面的下面这个图标,View Breakpoints,它会弹出一个框。
猫头虎
2024/04/08
4.1K3
IDEA DEBUG 启动慢,启动卡死,本地IDEA环境,千万千万不要在方法上打断点!太坑了!
TestNG官方文档中文版(4)-运行TestNG
4 - 运行TestNG TestNG可以以不同的方式调用:     * Command line     * ant     * Eclipse     * IntelliJ's IDEA 1) 命令行 假设你已经将TestNG加入到class path,调用TestNG最简单的方法事下面的:
流柯
2018/08/30
2K0
超详细图解从0搭建SSM框架【intellij idea】
文章链接:http://blog.csdn.net/w8897282/article/details/71215591
Java团长
2018/08/06
5.1K0
万法归宗之Hadoop编程无界限
记录下,散仙今天的工作以及遇到的问题和解决方案,俗话说,好记性不如烂笔头,写出来文章,供大家参考,学习和点评,进步,才是王道 ,废话不多说,下面切入主题: 先介绍下需求: 散仙要处理多个类似表的txt数据,当然只有值,列名什么的全部在xml里配置了,然后加工这些每个表的每一行数据,生成特定的格式基于ASCII码1和ASCII码2作为分隔符的一行数据,ASCII2作为字段名和字段值的分隔符,ASCII1作为字段和字段之间的分隔符,每解析一个txt文件时,都要获取文件名,然后与xml中的schema信息
我是攻城师
2018/05/11
8200
手把手教你用idea搭建ssm项目并实现简单demo(超详细)
我们要手动的在main下面去创建java文件夹以及resources文件夹,当我们创建好对应的文件夹后会发现,一般的ssm项目在idea中的java文件夹和resources的文件夹是有特殊的颜色的,这时候我们需要点击file->project structure然后选择Modules,我这里的结构:
全栈程序员站长
2022/07/04
2.9K0
手把手教你用idea搭建ssm项目并实现简单demo(超详细)
Spring高手之路2——深入理解注解驱动配置与XML配置的融合与区别
XML配置中,我们通常采用ClassPathXmlApplicationContext,它能够加载类路径下的XML配置文件来初始化Spring应用上下文。然而,在注解驱动的配置中,我们则使用以Annotation开头和ApplicationContext结尾的类,如AnnotationConfigApplicationContext。AnnotationConfigApplicationContext是Spring容器的一种,它实现了ApplicationContext接口。
砖业洋__
2023/06/06
1.1K0
Spring高手之路2——深入理解注解驱动配置与XML配置的融合与区别
IDEA 搭建简单 ssm 框架最详细最简单教程
为开发一个测试程序,特搭建一个简单的ssm框架,因为网上看到很多都是比较老旧的教程,很多包都不能用了,eclipes搭建并且其中还附带了很多的其他东西,所以特此记录一下mac中idea搭建过程。
好好学java
2019/10/16
2.7K0
IDEA 搭建简单 ssm 框架最详细最简单教程
推荐阅读
相关推荐
idea运行报Error running ‘XApplication‘_ Command line is too long. Shorten command line for XApplication
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验