注: 部分概念介绍来源于网络
6.6 版本的发布,Index Lifecycle Management(索引生命周期管理,后文简称 ILM );
ILM 可以将索引生命周期分为四个阶段(Phase)(具体几个阶段可以根据实际情况设定);
Hot 阶段:索引数据正在活跃的更新和查询,由于该阶段需要进行大量的数据读写,因此需要高配置的节点,也就是我们通常说的热数据,为保证性能数据通常都是在内存中或者SSD上;
Warm 阶段:索引数据不再被更新,但是仍被查询,由于该阶段主要负责数据的读取,中等配置的节点即可满足需求,介于热和冷之间,数据来源于hot层,可以进行数据周期设置,shrink,forcemerge,reduce replica等操作,数据可以根据需求存在内存、硬盘以及SSD上;
Cold 阶段:索引已经不被更新且很少查询。但是索引数据的信息还需要被搜索,若被搜索则比较慢,由于该阶段只负责少量的数据读取工作,低等配置的节点即可满足要求,数据通常存储在大容量的磁盘上;数据来源于warm层,可以进行数据周期设置,freeze等操作;
Delete 阶段:索引按照设置的数据时间规则可被安全的删除。
ILM 将不同的生命周期管理策略称为 Policy,而所谓的 Policy 是由不同阶段(Phase)的不同动作(Action)组成的。
Action是一系列操作索引的动作,比如 Rollover、Shrink、Force Merge等,不同阶段可用的 Action 不同,详情如下:
Hot Phase
Rollover
滚动索引操作,可用在索引大小或者文档数达到某设定值时,创建一个新的写入索引,将旧的写入索引的别名去掉,并把别名赋给新的写入索引。所以便可以通过切换别名控制写入的索引是谁,用于数据读写,从而控制单个索引的大小。这里要注意的一点是,如果启用了 Rollover ,那么所有阶段的时间不再以索引创建时间为准,而是以该索引 Rollover 的时间为准。
Rollover可。它可用于Hot阶段。
Warm Phase
Allocate 设定副本数、修改分片分配规则(如将分片迁移到中等配置的节点上)等
Read-Onlly 设定当前索引为只读状态
Force Merge 合并 segment 操作,可触发一个索引分片的segment merge,同时释放掉被删除文档的占用空间
Shrink 缩小 shard 分片数,需要注意的是当shink完成后索引名会由原来的<origin-index-name>变为shrink-<origin-index-name>
Cold Phase
Allocate 设定副本数、修改分片分配规则(如将分片迁移到中等配置的节点上)等
Delete Phase
Delete 删除
如何应用到索引(Index)上面呢?
修改索引配置可以直接修改(PUT index_name/_settings)或者通过索引模板(Index Template)来实现。
使用滚动索引有几个注意事项:
索引命名最好以数值类型为结尾,比如 index-000001
索引必须设置index.lifecycle.rollover_alias为滚动的别名;
索还必须是别名的写入索引。
优先级设置
这个action等同于设置索引属性index.priority的值。具有较高优先级的索引将在节点重启后优先恢复。通常,热阶段的指数应具有最高值,而冷阶段的指数应具有最低值。未设置此值的指标的隐含默认优先级为1。索引的优先级。必须为0或更大。也可以设置为null以删除优先级。
{
"set_priority" : {
"priority": 50
}
}
强制合并
使用强制合并时,索引将变成只读。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"forcemerge" : {
"max_num_segments": 1 //合并后的shard里的lucene segments数,
}
}
}
}
}
}
收缩索引
使用收缩索引时,索引将变成只读。收缩索引API允许您将现有索引缩减为具有较少主分片的新索引。目标索引中请求的主分片数必须是源索引中分片数的一个因子。如果索引中的分片数是素数,则只能缩小为单个主分片。
新索引将有一个新名称:shrink-<origin-index-name>。因此,如果原始索引称为“logs”,则新索引将命名为“shrink-logs”。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"shrink" : {
"number_of_shards": 1
}
}
}
}
}
}
冻结索引
为了使索引可用且可查询更长时间但同时降低其硬件要求,它们可以转换为冻结状态。一旦索引被冻结,它的所有瞬态分片内存(除了映射和分析器)都会被移动到持久存储。
注意冻结一个索引会close并reopen,这会导致短时间内不可用,集群会变red,直到这个索引的分片分配完毕。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"cold": {
"actions": {
"freeze" : { }
}
}
}
}
}
索引生命周期操作:
Alias(重新别名)
Allocation(分配分片)
Close(关闭索引)
Cluster Routing(集群路由)
Create Index(创建索引)
Delete Snapshots(删除快照)
Forcemerge(段合并)
Index Settings(索引设置)
Open(打开索引)
Reindex(重新索引)
Replicas(副本分配)
Restore(重新存储)
Snapshot(索引快照)
allocate:将分片移动到具有不同性能特征的节点上,并减少副本的数量。
delete:永久移除索引。
force merge:减少索引段的数量并清除已删除的文档。使索引为只读。
freeze:冻结索引以最大程度减少其内存的占用量。
read only:阻止对索引的写操作。
rollover:删除索引作为过渡别名的写索引,然后开始索引到新索引。(滚动索引)
set priority:降低索引在生命周期中的优先级,以确保首先恢复热索引。
shrink:通过将索引缩小为新索引来减少主分片的数量。(收缩索引)
unfollow:将关注者索引转换为常规索引。在进行滚动或收缩操作之前自动执行。
wait for snapshot:删除索引之前,确保快照存在。
创建 ILM Policy
索引名以 index 为前缀,索引的创建时间最大为1小时,索引的最大大小不超过50G,索引的最大文档数不超过1个
Rollover 后 2 小时转为 Warm 阶段
Rollover 后 3 小时转为 Cold 阶段
Rollover 后 4 小时删除
1.创建一个索引策略
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
//rollover前距离索引的创建时间最大为1小时
"max_age": "1h",
//rollover前索引的最大大小不超过50G
"max_size": "50G",
//rollover前索引的最大文档数不超过2个
"max_docs": 2,
}
}
},
"warm": {
//rollover之后进入warm阶段的时间不小于2小时
"min_age": "2h",
"actions": {
"forcemerge": {
//强制分片merge到segment为1
"max_num_segments": 1
},
"shrink": {
//收缩分片数为1
"number_of_shards": 1
},
"allocate": {
//副本数为1
"number_of_replicas": 1
}
}
},
"cold": {
//rollover之后进入cold阶段的时间不小于3小时
"min_age": "3h",
"actions": {
"allocate": {
"require": {
//分配到cold 节点,ES可根据机器资源配置不同类型的节点
"type": "cold"
}
}
}
},
"delete": {
//rollover之后进入cold阶段的时间不小于4小时
"min_age": "4小时",
"actions": {
"delete": {}
}
}
}
}
}
2.创建一个索引模版,指定使用的索引策略
PUT _template/my_template
{
//索引模版匹配的索引名以"index-"开头
"index_patterns": ["index-*"],
"settings": {
//索引分片数为2
"number_of_shards":2 ,
//索引副本数为2
"number_of_replicas": 2,
//索引使用的索引策略为 my_policy
"index.lifecycle.name": "my_policy",
//索引rollover后切换的索引别名为 myindex
"index.lifecycle.rollover_alias": "myindex"
}
}
3.创建一个符合上述索引模版的索引
PUT index-000001
{
"aliases": {
"myindex":{ //别名为 myindex
//允许索引被写入数据
"is_write_index": true
}
}
}
4.修改 ILM Polling Interval
ILM Service 会在后台轮询执行 Policy,默认间隔时间为 10 分钟,为了更快地看到效果,我们将其修改为 1 秒。
PUT _cluster/settings
{
"persistent": {
"indices.lifecycle.poll_interval":"1s"
}
}
5.手动应用生命周期策略
你可以在创建索引的时候指定一个策略,也可以直接将策略应用到一个已经存在的索引上。一旦你应用了策略,ILM立即会开始管理该索引。
PUT test-index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "my_police"
}
}
6.将策略应用于多个索引
PUT test-index-*/_settings
{
"index": {
"lifecycle": {
"name": "my_policy"
}
}
}
7.索引策略执行失败
首先我们先看一下失败的原因是什么,可以用API查看一下:
GET /myindex/_ilm/explain
返回信息中step_info就是失败原因,假设是索引策略设置的有问题,比如说Shrink的主分片数设置的比模版的都大,我们只需要更新索引策略,解决问题。然后在重试让ILM继续执行下一步就好。
POST /myindex/_ilm/retry
8.索引策略的更新
每次更新索引策略的版本都会增加,对于还没有开始创建的索引,更新索引策略显然能够生效。对于已经存在的策略生效的索引,当前阶段是不会按照最新版本的策略执行的,必须等到变为下一个阶段了,才会按照最新版本的策略执行。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "25GB"
}
}
},
"delete": {
"min_age": "4h",
"actions": {
"delete": {}
}
}
}
}
}
9.切换索引使用的索引策略:
PUT myindex/_settings
{
"lifecycle.name": "my_other_policy"
}
10.ILM的启用禁用
ILM的状态查看:
GET _ilm/status
{
"operation_mode": "RUNNING"
}
开启和关闭:
POST _ilm/start
POST _ilm/stop