ES索引切分

简介: 在生产项目中,由于ElasticSearch单个索引数据量大,索引中部分数据不常用,在搜索和写入文档时,效率较低。为了减小单个索引的数据量,提升搜索和文档写入效率,将大索引根据一定的规则拆分为小的索引。
提示:对于一些日志类的数据,我们常用到es作为存储,数据量过大时,可能会用到索引切分,这里可以参考

ES索引切分


前言

在生产项目中,由于ElasticSearch单个索引数据量大,索引中部分数据不常用,在搜索和写入文档时,效率较低。为了减小单个索引的数据量,提升搜索和文档写入效率,将大索引根据一定的规则拆分为小的索引。


直接上干货,不多bb(记得点赞,收藏,是我最大的动力)

方案一:ES索引切分验证(policy策略)

配置ilm策略 (max_docs = 1 测试用)

  • Ilm策略和模板搭配使用,模板引用此策略
PUT _ilm/policy/das_v5_policy
{
  "policy":{
    "phases": {
      "hot": {
        "actions": {
          "set_priority": {
            "priority": 100
          },
          "rollover": {
            "max_age": "1d",
            "max_docs": 1,
            "max_size": "5gb"
          }
        }
      }
    }
  }
}

查询ilm策略

GET _ilm/policy

rollover检测索引策略默认10min - 配置为3s 测试

PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval":"3s"
  }
}

创建索引模板

说明:创建索引模板,具体的_mapping根据审计日志确定
das_v5_policy 为指定 策略名称
das_v5_index 滚动触发的别名

PUT _template/das_v5_template
{
  "index_patterns":["das_v5_*"],
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":0,
    "index.lifecycle.name":"das_v5_policy",
    "index.lifecycle.rollover_alias":"das_v5_index "
  }, 
  "mappings": {
    "properties": {
      "name":{
      "type":"keyword"
    },
    "age":{
      "type":"long"
    }
    }
  }
}

创建索引,指定别名

说明:创建索引,指定别名,允许索引写入数据

PUT das_v5_20210121-000001
{
  "aliases": {
    "das_v5_index": {
      "is_write_index":true
    }
  }
}

使用别名插入数据

说明:每次put数据,会产生一个新的索引

POST das_v5_index/_doc
{
  "name":"yxd",
  "age":17
}

第一次put数据
在这里插入图片描述
策略配置3秒检测一次,所以3秒后再次put结果:
在这里插入图片描述索引自动滚动,验证成功,由 03 变成 04

仔细研究,发现存在一个问题

  1. 使用策略进行维护管理索引,需要配置好模板- 模板和策略关联,必须使用别名
  2. 历史数据问题:

    • Rollover控制索引滚动,写入数据使用别名写入,那么使用别名写入时,无法向历史索引写入数据
    • 手动使用指定历史索引写入数据,不使用别名,那么索引无法自动进行切分,策略不会生效

在这里插入图片描述
如上图所示:

  1. 此时别名das_v5_index 已经滚动到das_v5_20200123_02索引上
  2. Write通过别名无法向索引das_v5_20200122_02写入数据

解决方案

多模板多别名同策略模式

① 创建日期模板 YYYYMM 日期替换

PUT _template/das_v5_template_YYYYMM
{
  "index_patterns":["das_v5_YYYYMM*"],
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":0,
    "index.lifecycle.name":"das_v5_policy",
    "index.lifecycle.rollover_alias":"das_v5_index_YYYYMM"
  }, 
  "mappings": {
    "properties": {
      "name":{
      "type":"keyword"
    },
    "age":{
      "type":"long"
    }
    }
  }
}

② 创建该日期符合索引模板的索引,并配置日期格式别名

PUT das_v5_YYYYMM-000001
{
  "aliases": {
    "das_v5_index_YYYYMM": {
      "is_write_index":true
    }
  }
}

③ 使用别名插入当天数据

POST das_v5_index_YYYYMM/_doc
{
  "name":"yxd",
  "age":17
}

④ 如果索引模板多了,可删除N天之前的模板

DELETE _Template/ das_v5_index_YYYYMM

备注:重复put索引,产生异常,可能导致策略无法维护索引,集群部署状态下,可能要考虑相关问题

方案二:多别名,rollover方式

该方案为:

  1. 创建一个独立公用的索引模板
  2. 使用日期滚动创建索引,并使用别名(一次可创建多个索引/别名,未来几天的)

       实现:可通过定时任务,每天凌晨执行,创建未来几天要用到的索引
    
  3. 代码每次提交写入es数据之后, Rollover 检测滚动一次

创建公共索引模板

代码如下(示例):

在这里插入图片描述

创建索引

说明:定时任务,执行创建日期-索引并使用日期别名,查询也可使用日期别名
在这里插入图片描述

数据插入

说明:程序插入数据,只需要使用日期别名,插入数据到es即可,历史数据使用历史当天日期的别名插入
在这里插入图片描述

索引切分

第一种
每次数据插入提交之后,可代码手动rollover一次

第二种
定时任务管理rollover,查询最近几天的索引,定时检测切分,可每10分钟一次(一二种,可同时用)
在这里插入图片描述


总结

推荐使用方案二:
优点

  1. 简单好用,不用担心集群部署等会出现的问题
  2. 查询也可使用别名
  3. 索引切分方式灵活,可靠
  4. 插入历史数据等,都可使用别名插入,不用做多余的开销维护
目录
相关文章
|
IDE Go 开发工具
Go开发IDE全览:GoLand vs VSCode全面解析
Go开发IDE全览:GoLand vs VSCode全面解析
1999 0
|
6月前
|
人工智能 自然语言处理 安全
牛B,登上GitHub Trending的国产神器:把RAG应用装进手机只要3行代码~~~
小华同学专注AI工具与开源技术,每日分享高效实战技巧。本文介绍阿里开源的嵌入式向量数据库ZVec:轻量、毫秒级检索、零部署,支持手机/IoT/浏览器等边缘场景,3行代码即可集成RAG,隐私安全、免费开箱即用!
947 10
|
设计模式 Java
Netty Pipeline详解!
本文深入剖析了 Netty 的管道(Pipeline)设计,Netty 是一个基于 Java NIO 的高性能网络应用框架。文章详细介绍了 Pipeline 的原理、源码及设计思维。Pipeline 作为事件处理链条,包含多个处理器,负责处理入站和出站事件。核心组件包括 `ChannelPipeline`、`ChannelHandler` 和 `ChannelHandlerContext`。Netty 通过链式结构和上下文管理实现了高效的事件传播机制,具备高吞吐量和低延迟的特点。本文还探讨了 Pipeline 的职责分离、链式处理、高内聚低耦合等设计原则,为高性能网络编程提供了宝贵的启示。
628 9
|
索引
利用滚动索引来管理海量Elasticsearch数据
利用滚动索引来管理海量Elasticsearch数据
602 3
|
API 索引
Elasticsearch索引迁移的四种方式
本文主要讲解Elasticsearch下实现索引迁移的几种方式。
10829 0
|
SQL 算法 关系型数据库
MySQL Online DDL原理解读
MySQL Online DDL原理解读
|
JSON 自然语言处理 开发工具
elasticsearch7.X学习笔记
elasticsearch7.X学习笔记
530 0
|
消息中间件 数据库 RocketMQ
Springboot+RocketMQ通过事务消息优雅的实现订单支付功能
RocketMQ的事务消息,是指发送消息事件和其他事件需要同时成功或同时失败。比如银行转账, A银行的某账户要转一万元到B银行的某账户。A银行发送“B银行账户增加一万元”这个消息,要和“从A银 行账户扣除一万元”这个操作同时成功或者同时失败。RocketMQ采用两阶段提交的方式实现事务消息。
895 0
|
安全 Java 程序员
38-Metaspace区域是如何因为类太多而发生内存溢出的?
永久代溢出,由于到了JDK8,已经完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Metaspace)来代替,因此后续我们不再说 方法区、永久代,直接使用Metspace元空间来称呼。
1949 0
38-Metaspace区域是如何因为类太多而发生内存溢出的?
|
Java
多线程必考的「生产者 - 消费者」模型,看齐姐这篇文章就够了
生产者 - 消费者模型 Producer-consumer problem 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见。也是面试中无论中美大厂都非常爱考的一个问题,对应届生问的要少一些,但是对于有工作经验的工程师来说,非常爱考。 这个问题有非常多的版本和解决方式,在本文我重点是和大家壹齐理清思路,由浅入深的思考问题,保证大家看完了都能有所收获。
2997 1
多线程必考的「生产者 - 消费者」模型,看齐姐这篇文章就够了