The requested URL was not found on this server. 不管你信不信,反正我是没找到

如何深入理解ES ILM

Elasticsearch | 作者 Charele | 发布于2022年05月16日 | 阅读数:418

ILM,索引生命周期管理,
这个包里面其实有两个功能,ILM,SLM
这里只谈ILM,  不涉及SLM。
一个管理索引,一个管理(索引的)快照。

 你也许会说:“你说的这些垃圾,对我跟本没用,因为我跟本用不着”
那告辞!道不同,不相为谋。
 
  废话不多话,先上一个策略的定义,下面就是围绕这个来讲的:
111.png
已邀请:

Charele

赞同来自:

1
https://elasticsearch.cn/question/12617
 这个贴子里提到,一个ilm策略,就是
phase ---> action ---> step 这么一个3层架构,
(策略里包括phase, phase里面包含action, action里面包含step)
  其中,phase和action就是你在定义一个策略里定义的那些(不完全相等,下面会提及)
  而ILM的执行单元,step,不是用户自己定义的,是由ES自已产生的。
 
最终,这个策略会“扁平化”,会形成一个step列表,
ilm的执行,就是围绕这个列表来执行的,
从表头到表尾,一个一个执行,,,
 那这么列表究竟长啥样呢?拿上面那个策略来讲:

222.png


里面的标识,意义各有不同,下面我会一一分析,
 

Charele

赞同来自:

2
说起step,首先得了解step的分类,
这个问题非常重要!!!
 
只有先知道了这些,才能理解ILM的执行流程,才不致于迷失方向

  从上面的图中,我标识出了具体step属于哪类,(PhaseCompleteStep除外)

111.png

总体来说,可以分成4大类(和3个特别的)
 1> 绿色的,异步动作
就是通常的执行,没啥特别的
2> 红色的,异步等待,
它会等待某些条件,成功了则下一步,否则会一直等
3> 紫色的,CS动作
它会改变CS,从一个CS变化到另外一个CS(ClusterState是什么,就不多啰嗦了)
4> 黄色的,CS等待
它会等待CS符合某些条件,而做出不同的选择,和2类似
5> 其他类型的,黑框框里面的

Charele

赞同来自:

3
重新贴下这个图,稍微讨论一下。
这是重点,但不是难点。
 
111.png

1> 这里面分了3个phase(红框里面)
phase0,是第1个phase(叫啥无所谓,只序号上区分的)
这个phase,是ES手工加上去的。不管什么策略,ES都会加这个
这步的作用是设置索引的一些参数
 
2> phase1和phase2就是你在定义一个策略时,定义的两个
用红线划出来的3个,就是实际起作用的,你要做的事情。
比如DeleteStep,就是真正删除索引,
 
其中phase1里面,有两个action,为什么有两个呢?
明明在hot里面只定义了一个rollover动作,
这是ES自己加上去的
(就是紫框框里面的那些,啥时加的,为什么要加,后面谈)
 
3> 每个phase最后,肯定会有一个"PhaseComleStep",(绿框框里面)
标记这个phase结束,要么进入下一个phase,
要么没有下一个phase了,就全部完成了
 
4> 一共20个step,整个ilm执行,就是取1,执行1,
取2,执行2,,,,一直到执行完最后一个
(只是形式上可以这么理解,实际情况可能有点复杂) 
另外:黑框框里面的,有点特殊,后面会谈到

Charele

赞同来自:

4
为了对上面我说的,有个直观的认识,我挑一段代码来说明一下下
111.png

 
如果当前step是PhaseCompleteStep,说明一个phase结束了。
如果没有下一步了,就说明所有的结束了,就返回了。绿框里的。
 
如果有一下步(比如上面的第2个step或者第16个step),
要进行一下判断(黄框里的),
为真就进入下一步(也是下一个phase)
 
  这里的判断是什么呢? 就是那个你在定义策略时定义"min_age"时间
(注意:红框里的,这里传入的是“下一个步的phase的”名字!因为当前是本phase的最后一步,
所以这里也就是下一个phase的名字)

Charele

赞同来自:

5
网上文章,好像有人对"min_age"这个参数好像有一些困惑,什么它究竟是增量还是啥量,有人还各种测试。
其实这很简单:
 
接上楼,isReadyToTransitionToThisPhase()这个方法,

111.png

 
其实就是判断一下,
红色的,就是索引的创建时间,
(要说明了下,如果你是执行了rollover, 001 -> 002,
这里指的还是索引001,这不应该有疑问)
 
绿色的,就是你定义的这个phase的"min_age"
结论:如果你想进入这个phase,就取出这个phase的min_age,这样比较一下
(索引的创建时间是不变的),跟其他phase的min_age设置没有任何关系。
就是这么简单。
 
  接上楼的话题,如果是true了,就进入这个phase,
如果就不是,不进入下一步,返回:就是等待,

Charele

赞同来自:

6
有了上面的一些铺垫,就可以进入正题了:如何一步一步执行ILM的流程。
虽然还有其他一些问题,
比如那个后台定时过程是怎么启动的,比如ILM策略是保存在哪的等等,
但这些都不是重点,可以暂时略过

111.png

ilm的执行,有两个地方,
1> 每次CS发生变化时,这是不定时的,
2> 就是"indices.lifecycle.poll_interval"这个参数定义的间隔时间,这是定时的
两个地方会执行同一个方法,
只是这个boolean fromClusterStateChange的参数,传入的值不一样,
情况1时,传true
情况2时,传入的是false
 

要回复问题请先登录注册