elasticsearch-ILM-索引生命周期管理探微
索引生命周期管理将会是 es 维护管理中重要的一环,生产中已经有一个集群用的 7.x
版本,一直也没有使用自带的生命周期管理工具,今天就来研究一下,现在先通过简单的例子来理解这个功能以及用法。
# 1,快速体验
# 1,创建索引策略
我们可以在 kibana 设置的图形界面里配置索引策略,但是使用工具来进行管理维护显得更加方便便捷。
PUT _ilm/policy/eryajf_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover":{
"max_age":"30s"
}
}
},
"delete": {
"min_age": "90s",
"actions": {
"delete": {}
}
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
这里为了演示方便,定义了索引在hot
节点保留10s
,然后就会触发滚动策略到delete
阶段,到delete
阶段之后,保留60s
左右,就会删除,在这个过程中,我们能够比较清晰地看到索引在声明周期中的变化。
# 2,创建索引模板
PUT _template/template_eryajf
{
"index_patterns": ["eryajf*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "eryajf_policy",
"index.lifecycle.rollover_alias": "eryajf"
}
}
2
3
4
5
6
7
8
9
10
index_patterns
: 索引以eryajf
开头的自动采用settings
的配置,事实上这里还可以加入 mapping 等的的配置,不是本文重点,不再赘述。index.lifecycle.name
:表示采用eryajf_policy
这个策略index.lifecycle.rollover_alias
:表示索引滚动策略基于eryajf
这个别名进行管理,注意,这个别名相当重要。
# 3,创建索引
此处需要注意的是,创建的索引后缀需要带有数字并以中横杠分割,否则在策略应用的时候会报如下错误:
illegal_argument_exception: index name [liql-test] does not match pattern '^.*-\d+$'
,至少在我当前使用的版本当中,是有这样一个限制的,亦即:索引必须以中横杠分割且以数字结尾
。
PUT eryajf-1
{
"aliases": {
"eryajf": {
"is_write_index": true
}
}
}
2
3
4
5
6
7
8
# 4,配置 lifecycle 检测时间
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval": "10s"
}
}
2
3
4
5
6
默认策略轮询时间间隔为十分钟
,这里改成 10 秒,是为了方便观察滚动效果。
# 5,功能验证
实际操作之前,首先来描述下将要操作与验证的流程:
- 查看当前情况。
- 往索引写入 3 条数据,间隙赶忙观察索引状态变化。
- 看到索引已经成功轮替之后,再往索引写入 6 条数据,注意数据落点在何处。
- 然后再多观察几轮,就能大概体会生命周期管理的意义了。
验证之前,可以先看一下当前索引状况:
然后批量写入几条数据,注意这个地方,写数据的索引是 eryajf
,也就是上边配置的别名
。实际生产当中,也应该往这个别名里写内容,而非其他。
PUT /eryajf/_doc/_bulk
{"index":{}}
{"message":"hello-01"}
{"index":{}}
{"message":"hello-02"}
{"index":{}}
{"message":"hello-03"}
2
3
4
5
6
7
此时通过如下命令进行观测:
GET eryajf-*/_ilm/explain
记得及时观测变化情况,重点是数据落脚点,此时落到了新的滚动索引 eryajf-000002
上。
稍微等一下,看到再次滚动之后,再写入 6 条数据:
PUT /eryajf/_doc/_bulk
{"index":{}}
{"message":"hello-01"}
{"index":{}}
{"message":"hello-02"}
{"index":{}}
{"message":"hello-03"}
{"index":{}}
{"message":"hello-04"}
{"index":{}}
{"message":"hello-05"}
{"index":{}}
{"message":"hello-06"}
2
3
4
5
6
7
8
9
10
11
12
13
然后观测数据落脚点,可以看到落到了新的轮替索引上了,就是如此轮替的一个方案。
大概经过 15 秒之后,可以看到索引名称更新了,新的索引名叫 然后再过 30 秒左右,数据也就被删除了。
# 2,索引策略详解
- 策略可以定义四个阶段
- hot
- warm
- cold
- delete
- 滚动的依据有三种情况
max_age
:在当前阶段索引保留最长时间(以索引创建时间为准)max_size
:在当前阶段索引保留最大大小max_docs
:在当前阶段索引保留最多文档数
一个相对完整的索引策略如下:
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "7d", //rollover前距离索引的创建时间最大为7天
"max_size": "50G", //rollover前索引的最大大小不超过50G
"max_docs": 1, //rollover前索引的最大文档数不超过1个(测试用)
}
}
},
"warm": {
"min_age": "30d", //rollover之后进入warm阶段的时间不小于30天
"actions": {
"forcemerge": {
"max_num_segments": 1 //强制分片merge到segment为1
},
"shrink": {
"number_of_shards": 1 //收缩分片数为1
},
"allocate": {
"number_of_replicas": 2 //副本数为2
}
}
},
"cold": {
"min_age": "60d", //rollover之后进入cold阶段的时间不小于60天
"actions": {
"allocate": {
"require": {
"type": "cold" //分配到cold 节点,ES可根据机器资源配置不同类型的节点
}
}
}
},
"delete": {
"min_age": "90d", //rollover之后进入cold阶段的时间不小于60天
"actions": {
"delete": {}
}
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
可根据实际情况进行调整配置。
# 3,正式应用
操作流程大概应该如下,先创建索引策略,然后创建索引模板,接着创建一个索引,然后往索引模板中定义的别名写数据就可以了。
# 1,创建索引策略
PUT _ilm/policy/shop-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover":{
"max_age":"30d"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
这里定义了两个阶段,hot 阶段保留 30 天,然后进入 delete 再保留 30 天。亦即索引保留 60 天。
# 2,创建索引模板
PUT _template/template_shop
{
"index_patterns": ["shop*"],
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.lifecycle.name": "shop-policy",
"index.lifecycle.rollover_alias": "shop"
}
}
2
3
4
5
6
7
8
9
10
# 3,创建索引
PUT shop-1
{
"aliases": {
"shop": {
"is_write_index": true
}
}
}
2
3
4
5
6
7
8
需要注意这个索引并非最终写入端使用的索引,别名才是,这个索引只是为了滚动所需。注意命名要求。
因为别名是匹配的,因此会自动应用上前边创建的策略,此时写入方指定的索引名为 shop
,对,就是上边定义的索引别名。
在这个索引创建 30 天之后,就会触发rollover
,将老的数据定义到delete
阶段,然后新建一个索引,名字应该为:shop-000002
,再过 30 天之后,shop-000002
会进入 delete 阶段,并生成shop-000003
,然后 shop-1
会被删除,如此循环往复下去。
之前被别名以及索引绕来绕去,快整晕了,目前来看,至少当前这种思路是可行可用的。如果你有更好的思路,可以分享一下哦。
# 4,参考
- https://elasticsearch.cn/article/6358