【ElasticSearch】索引生命周期管理(一)
作者:互联网
背景
产品为保证合规,大量的的数据和IM聊天消息需要进行审核,数据结构比较复杂,有较多的数据嵌套,设计上选择使用ElasticSearch作为数据库,随着时间的增长,单个索引的历史数据变得越来越大,占用内存和磁盘的空间也越来越多,单个索引查询效率也较低
这里主要有两个需求点
1.需要对ElasticSearch 索引 进行拆分(最初的想法是类似ShardingJdbc那样进行分库分表)
2.删除旧数据(这里与产品沟通后确认,确认仅保留半年的数据)
3.ElasticSearch 索引的设计,解决嵌套数据的查询问题
调研后发现ElasticSearch 的索引的rollover 和 生命周期管理功能 能满足以上第1,2点需求,使用ElasticSearch Nest类型的字段能解决嵌套数据的问题
ElasticSearch 版本号: 6.8.x
实现
索引 生命周期管理
这里可以看到 ElasticSearch 官方文档对于索引生命周期的介绍
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/index-lifecycle-management.html
索引生命周期管理 (ILM) API使您能够随着时间的推移自动化管理索引的方式。您可以根据分片大小和性能要求等其他因素,而不是简单地按照设定的时间表对索引执行管理操作。
您可以通过将生命周期策略附加到用于创建索引的索引模板来控制索引在老化时的处理方式。您可以更新策略以修改新索引和现有索引的生命周期。
对于时间序列索引,索引生命周期中有四个阶段:
- Hot——索引正在被积极更新和查询。
- Warm——索引不再被更新,但仍在被查询。
- Cold——索引不再更新并且很少被查询。信息仍然需要可搜索,但如果这些查询速度较慢也没关系。
- Delete——不再需要索引,可以安全地删除。
生命周期策略控制索引如何通过这些阶段以及在每个阶段对索引执行的操作。该策略可以指定:
- 您希望滚动到新索引的最大大小或年龄。
- 索引不再更新并且可以减少主分片数量的点。
- 何时强制合并以永久删除标记为删除的文档。
- 可以将索引移动到性能较低的硬件的点。
- 可用性不那么关键并且可以减少副本数量的点。
- 何时可以安全删除索引。
例如,如果您要将 ATM 机群中的指标数据索引到 Elasticsearch 中,您可以定义一个策略:
- 当索引达到 50GB 时,翻转到新索引。
- 将旧索引移动到暖阶段,将其标记为只读,然后将其缩小为单个分片。
- 7 天后,将索引移至冷阶段并将其移至较便宜的硬件。
- 达到所需的 30 天保留期后,删除索引。
生命周期相关的API
1.创建生命周期策略
PUT _ilm/policy/datastream_policy #创建 datastream_policy 的索引生命周期管理策略 { "policy": { "phases": { # 阶段 hot warm cold delete "hot": { "actions": { # 达到该阶段时,将会执行的操作 "rollover": { # Rollover创建新索引 满足任意条件 条件1:索引大小达到50GB 条件2:索引自从创建起过了30天 "max_size": "50GB", "max_age": "30d" } } }, "delete": { "min_age": "90d", # 进入delete阶段最少需要90天 "actions": { # 达到delete阶段时,执行索引删除操作 "delete": {} } } } } }
2.应用生命周期管理策略
应用生命周期策略,有两种方式 第一种,使用索引模板配置生命周期管理策略 第二种,为单独索引配置生命周期管理策略
这里主要阶段第一种方式
第一种:使用索引模板配置生命周期管理策略
创建索引模板
PUT _template/datastream_template # 创建索引模板 { "index_patterns": ["datastream-*"], # 适配改模板的索引 "settings": { # 模板相关的配置 "number_of_shards": 1, "number_of_replicas": 1, "index.lifecycle.name": "datastream_policy", # 为模板绑定生命周期策略 "index.lifecycle.rollover_alias": "datastream" # 注意这里很重要:生命周期策略中索引发生rollover时,创建新索引后,新索引自动设置别名 datastream 发生rollover时,索引别名会自动转换为只读 } }
创建索引
这里创建了索引的同时,指定索引的别名,同时指定通过该别名可以写入
目的是配合在索引发生rollover时,由于创建新索引产生的新索引名,这里统一使用别名进行读/写的操作
PUT datastream-000001 # 创建索引 { "aliases": { # 指定索引别名为datestream ,并且指定可以通过改索引别名进行写入(默认使用别名只能进行查询) "datastream": { "is_write_index": true } } }
查询生命周期状态
GET datastream-*/_ilm/explain
返回结果
{ "indices": { "datastream-000001": { "index": "datastream-000001", "managed": true, # 索引正在被生命周期管理 "policy": "datastream_policy", # 策略 "lifecycle_date_millis": 1538475653281, "phase": "hot", # 当前索引所处的生命周期阶段 "phase_time_millis": 1538475653317, "action": "rollover", # 索引在当前阶段预期要执行的操作 "action_time_millis": 1538475653317, "step": "attempt-rollover", # 索引在当前阶段正在执行的操作 "step_time_millis": 1538475653317, "phase_execution": { "policy": "datastream_policy", "phase_definition": { # 索引在当前阶段的配置信息 "min_age": "0ms", "actions": { "rollover": { "max_size": "50gb", "max_age": "30d" } } }, "version": 1, "modified_date_in_millis": 1539609701576 } } } }
至此,这里索引的生命管理已经满足了上述需求的第1点和第二点
落地
图片审核索引:创建索引生命周期策略
PUT _ilm/policy/image_audit_ilm_policy { "policy": { "phases": { "hot": { "min_age": "0ms", "actions": { "rollover": { "max_size": "50gb", "max_docs": 10000000, "max_age": "30d" }, "set_priority": { "priority": 100 } } }, "delete": { "min_age": "90d", "actions": { "delete": {} } } } } }
图片审核索引:创建模板
PUT _template/image_audit_template { "mappings" : { "image_audit_type" : { "_source" : { "enabled" : true # 注意:这里是个坑点 如果设置了enabled 为false 则写入的数据和查询的数据都为null,不知道是不是6.8版本的一个坑 }, "properties" : { "appId" : { "type" : "keyword" }, "bizType" : { "type" : "keyword" }, "content" : { "type" : "keyword" }, "createTime" : { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis" }, "detailResult" : { "type" : "nested", "properties" : { "label" : { "type" : "keyword" }, "score" : { "type" : "long" } } }, "keywords" : { "type" : "keyword" }, "label" : { "type" : "keyword" }, "reqChannel" : { "type" : "integer" }, "requestId" : { "type" : "keyword" }, "score" : { "type" : "long" }, "suggestion" : { "type" : "keyword" }, "type" : { "type" : "integer" }, "userId" : { "type" : "long" }, "nnNumber" : { "type" : "long" }, "nickName" : { "type" : "text" } } } }, "index_patterns": ["image-audit*"], "settings": { "number_of_shards": 1, "number_of_replicas": 0, "index.lifecycle.name": "image_audit_ilm_policy", "index.lifecycle.rollover_alias": "image-audit" } }
创建索引 指定别名
PUT image-audit-1 { "aliases": { "image-audit": { "is_write_index":true } } }
标签:datastream,生命周期,索引,ElasticSearch,policy,rollover,type 来源: https://www.cnblogs.com/july-sunny/p/16197303.html