ElasticSearch之索引模板滚动索引实现详解
作者:AntBlack
一. 前言
文章合集 : 🎁 https://zhannei.baidu.com/cse/site?q=ElasticSearch&click=1&cc=jb51.net&s=&nsid=
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
ES 最近有需求涉及到滚动索引方面的概念,但是这一块一直没有太系统的了解。这一篇索性把相关的节点进行深度的学习。
针对版本 :ES 7
吐槽一下 : ES 通病,每次更新后会改来改去。你像MySQL , 更新后 SQL 至少不会有什么减少,ES每次更新,就像重做了一下,API变了不说,各种Maven版本还不能互相适配
二. 索引
在ES中,数据存储在索引中。索引是一种类似于数据库中表的数据结构,它包含了一系列的文档,每个文档有一个唯一的标识符,称为文档ID
通常一个索引包含 :分片 , 映射, 分析器等多个部分组成。我们可以通过 API 创建一个索引 :
PUT /my_index { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "title": { "type": "text" } } } }
建立索引的时候可以为其配置很多 Setting 和 properties , 这些配置可以帮助我们更好的使用索引。
但是这衍生一个问题 ,如果索引特别多或者需要滚动索引的时候,每一次都需要配置,这个时候就需要我们使用索引模板了》》》
三. 索引模板
作用
索引模板定义了设置和映射,你可以在创建新索引时自动应用。Elasticsearch根据与索引名称相匹配的索引模式,将模板应用于新的索引。
索引模板只在创建索引时应用。对索引模板的改变不影响现有的索引。在创建索引的API请求中指定的设置和映射会覆盖索引模板中指定的任何设置或映射
3.1 索引模板的创建
PUT _template/test_template { "order": 0, "index_patterns": [ "test_*" ], "settings": { "index": { // 分片数量 "number_of_shards": "6", // 刷新间隔 "refresh_interval": "10s" } }, "mappings": { "properties": { "createTime": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "requestId": { "type": "keyword" }, "title": { "type": "text", // 分词器 "analyzer": "standard", "fields": { "keyword": { "type": "keyword" } } } } }, "aliases": {} }
在上面的例子中,my_template
是索引模板的名称,my_index_*
是新创建的索引的名称,number_of_shards
是设置每个新索引的分片数,timestamp
是要插入的时间戳字段。
其他核心的字段 :
template
: 匹配模板名称的模式,可以使用通配符来匹配多个模板。order
: 定义模板的匹配顺序。较低的数字优先匹配。settings
: 指定模板的索引设置,例如副本数量、分片数量和分配策略。mappings
: 指定模板的索引映射,即文档类型和字段。aliases
: 定义与索引相关联的别名。version
: 定义模板的版本号,用于在更新模板时进行冲突检测。index_patterns
: 指定要应用模板的索引模式,支持使用通配符指定多个索引。composed_of
: 定义其他_template
API 模板的组合。priority
: 定义模板的优先级。较高的数字优先匹配。metadata
: 定义模板的任意元数据。
Create or update index template API | Elasticsearch Guide [8.6] | Elastic
3.2 索引模板 Setting
setting 用于定义策略,包括分片,刷新等等 ,它拥有如下核心配置 :
- index.number_of_shards:设置每个新创建索引的主分片数量。默认为 1
- index.number_of_replicas:设置每个新创建索引的副本分片数量。默认为 1
- index.codec:设置新创建索引所使用的编解码器
- index.routing.allocation.total_shards_per_node:设置每个节点最多可以容纳的主分片和副本分片总数
- index.routing.allocation.require:设置新创建索引需要符合的节点筛选条件
- index.lifecycle.name:设置新创建索引要使用的生命周期策略
- index.refresh_interval:设置新创建索引的刷新间隔时间
- index.max_result_window:设置新创建索引可返回的最大搜索结果数
- index.mapping.ignore_malformed:设置是否忽略在文档中出现的字段映射错误
- index.analysis.analyzer:设置新创建索引中的分析器
- index.analysis.filter:设置新创建索引中的分析过滤器
3.3 索引映射 :mapping
type
:指定字段的数据类型index
:指定字段是否索引,可以是 analyzed、not_analyzed、no 或 falsestore
:指定字段是否存储,可以是 true 或 falseanalyzer
:指定字段分析器的名称,可以是内置分析器或自定义分析器search_analyzer
:指定查询时使用的分析器名称,可以是内置分析器或自定义分析器normalizer
:指定字段规范化器的名称,用于在查询和聚合时规范化字段值copy_to
:指定一个或多个字段,将该字段的内容复制到指定的字段中,以便在查询和聚合时使用fields
:为字段定义多个属性,例如不同的分析器、不同的索引设置等format
:指定日期类型的格式化方式
注意 :还是由于版本的问题,导致每个版本的写法不一样,可能有的还会过时删除!!
四. 业务功能
4.1 创建滚动索引
背景 : ES 记录业务审计日志,每天生成大量的记录,导致单个索引过大
前置知识点 :
// 索引别名 : 指向一个或多个索引的可读写名称,它们可以被用来代替实际的索引名称
- 帮助实现索引的无缝切换,同时也可以减少修改客户端查询的需要
- 切换集群,切换测试时都可以快速修改// ES Rollover 特性
- 允许你在索引到达一定大小或者时间上限时自动滚动到一个新的索引中
- 新索引可以是一个完全相同的结构,也可以是不同的
- 可以是在同一个 Elasticsearch 集群中的不同节点上,也可以是在不同的集群上
创建流程 :
- S1 : 创建一个索引模板 , 为模板定义一个 index_patterns
- S2 : 创建一个索引,并且为索引定义一个别名
- S3 : 触发索引的滚动,同时通过别名进行业务操作
// S1 : 创建模板 - 创建 :此处略,创建方式就是上面的模板创建案例 - 查看创建的模板 : GET _template/test_template // S2 : 索引创建过程 (这里的实际格式为 <test-{now/d}-000001>) PUT %3Ctest_%7Bnow%2Fd%7D-000001%3E { "aliases": { "test_rollover": { "is_write_index": true } } } GET %3Ctest_%7Bnow%2Fd%7D-000001%3E // S3: 为其触发手动滚动规则 (此处是有3条文档则滚动一次,此处没有数据,所以无法滚动) POST /test_rollover/_rollover { "conditions": { "max_docs": 3 } } // S4 : 插入文档 POST /test_rollover/_doc { "businessInfo":"123" } // S5 : 查询当前文档数 (这里创建后已经有了多条,但是索引只有一个) GET /test_rollover/_doc/_search POST /test_rollover/_rollover { "conditions": { "max_docs": 3 } } >> 再次触发滚动后,发现已经创建了新的
核心重点
- is_write_index 很重要,他将决定翻滚之后的旧索引是否还能被查询到
- 未配置 :别名会指向新索引,并从旧索引中移除别名 ,通过别名无法查询到旧的索引
- 配置为 true : 别名会同时指向新旧索引 , 旧索引上的别名is_write_index会被设置为 false,仅可读
- conditions 有哪些
max_docs
: 索引中文档的最大数量,超过该数量将触发rollovermax_age
: 索引的最大存储时间,超过该时间将触发rollover(30d / 12h 等)max_size
: 索引的最大存储大小,超过该大小将触发rollover(5gb / 100mb 等)max_primary_shard_size
: 主分片的最大存储大小,超过该大小将触发rollovermax_num_segments
: 索引的最大段数,超过该数量将触发rollovermin_index_age
: 索引的最小存储时间,必须等待一段时间后才能rollovermin_doc_count
: 索引中文档的最小数量,必须达到一定数量后才能rollover
- 自动化
- 通过 _rollover 手动触发
- 通过 Index Lifecycle Management 做生命周期控制
4.2 创建和绑定策略
可以通过控制台绑定,也可以通过接口
PUT _ilm/policy/my_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_docs": 3 } } }, "delete": { "min_age": "30d", "actions": { "delete": {} } } } } } // 创建模板时进行绑定 "settings": { "lifecycle": { "name": "my_policy", "rollover_alias" : "test_rollover" } }
总结
ES 这东西真的难受,之前用的好好的版本,换了一个版本啥也用不了,笔记白做,以上记录不能保证其他版本可用。
ES 索引模板可以帮助我们基于当前ES集群的情况和业务场景,规划出一套性能更优,场景更符合的配置。
基于滚动索引和策略(不论是脚本调用或者自动策略),都能实现按计划滚动索引,避免索引过多。
这东西现在只可意会,不可照抄!!
以上就是ElasticSearch之索引模板滚动索引实现详解的详细内容,更多关于ElasticSearch索引模板滚动索引的资料请关注脚本之家其它相关文章!