ElasticSearch生命周期冷热问题

集群的 SSD 磁盘满了,elasticsearch hot 节点的数据没有自动迁移到 warm 节点,导致写入数据失败,集群变红,问题很严重。

临时解决

只留最新的那个索引保持hot状态,其他的hot节点手动改成warm

1
2
3
4
5
6
7
8
9
10
11
12
PUT data-flow-000001/_settings
{
"index": {
"routing": {
"allocation": {
"require": {
"data_type" : "warm"
}
}
}
}
}

通过执行查看分片命令GET _cat/shards/data-flow-000001,可以看到数据正在节点之间迁移

1
2
3
4
data-flow-000001 8  r RELOCATING 834716   6gb 10.11.10.10 es-d01 -> 10.11.10.21 uysX9r9oRsKkaFFQMLbDPw es-d11
data-flow-000001 8 p RELOCATING 834716 6gb 10.11.10.11 es-d02 -> 10.11.10.22 GyGJx-iJS0S_VEaxlWXlLg es-d12
data-flow-000001 5 p RELOCATING 832768 6gb 10.11.10.12 es-d03 -> 10.11.10.23 uysX9r9oRsKkaFFQMLbDPw es-d13
...

数据迁移需要时间,在SSD释放一部分空间之后,集群很快就会变绿。

问题溯源

手动解决之后,就要来看一下之前定的生命周期策略为什么没有生效了。在kabana上,虽然开启了hot配置,但是在选择节点属性来控制分片分配处,并没有做出正确的选择,导致虽然看似开启了hot -> warm的配置,其实没有起到作用。

image-20210804175832490

经测试,正确的选择是

image-20210804175909528

调整后的生命周期文件如下:

1
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
PUT _ilm/policy/my_lifecycle
{
"policy": {
"phases": {
"hot": {
"min_age": "1m",
"actions": {
"rollover": {
"max_age": "180d",
"max_size": "240gb",
"max_docs": 10000000
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"actions": {
"allocate": {
"require": {
"data_type": "warm"
}
}
}
}
}
}
}