一、索引生命周期管理
1.1、介绍
ILM(Information Lifecycle Management)即信息生命周期管理,是一个涵盖信息在其整个生命周期中各个阶段的管理概念,ILM是指从一个信息系统数据及其相关元数据产生和初始储存阶段到最后过时被删除时的一套综合管理方法。
创建并应用索引生命周期管理(ILM)策略,以根据性能、弹性和保留要求自动管理索引。
- 索引生命周期策略可以触发以下操作,例如:
- 滚动(Rollover):当现有索引达到一定的时间、文档数量或大小时,将别名重定向以开始写入新索引。
- 收缩(Shrink):减少索引中的主分片数量。
- 强制合并(Force merge):手动触发合并以减少索引中每个分片中的段数,并释放被删除文档占用的空间。
- 冻结(Freeze):使索引变为只读并最小化其内存占用。
- 删除(Delete):永久删除索引,包括所有数据和元数据。
ilm在hot-warm-cold结构中,使管理索引变得更加简单,这种结构在处理时间序列数据(如日志和指标)时很常见。
可以在ilm中指定:
- 希望滚动到新索引时的最大分片大小、文档数量或时间。
- 索引不再更新且可以减少主分片数量的时间点。
- 何时强制合并以永久删除标记为删除的文档。
- 索引可以移动到性能较低的硬件的时间点。
- 可用性不那么关键且可以减少副本数量的时间点。
- 可以安全删除索引的时间点。
例如,如果正在将来自一系列ATM机的指标数据索引到Elasticsearch中,可以定义这样一个策略:
- 当索引达到50GB时,滚动到新索引。
- 将旧索引移入温阶段,将其标记为只读,并将其缩减为单个分片。
- 7天后,将索引移入冷阶段并将其移至成本较低的硬件。
- 在达到所需的30天保留期后删除索引。
1.2、阶段
ILM定义了四个索引生命周期阶段:
- Hot(热):索引正在被积极更新和查询。
- Warm(温):索引不再被更新但仍然被查询。
- Cold(冷):索引不再被更新且很少被查询。信息仍然需要可被搜索,但如果这些查询稍微慢一些也没关系。
- Delete(删除):索引不再需要并且可以安全地移除。
一个索引的生命周期策略指定了哪些阶段适用,每个阶段执行哪些操作,以及索引在不同阶段之间何时转换。
可以在创建索引时手动应用一个生命周期策略。对于时间序列索引,需要将生命周期策略与用于创建系列中新索引的索引模板相关联。当索引滚动时,手动应用的策略不会自动应用于新索引。
1.3、阶段转换
ILM根据索引的age将它们通过生命周期移动。为了控制这些转换的时间,你为每个阶段设置一个最小age。为了将索引移动到下一个阶段,当前阶段的所有操作必须完成,并且索引必须比下一个阶段的最小age更老。
最小age默认设置为零,这会导致ILM在当前阶段的所有操作完成后立即将索引移动到下一个阶段。
如果索引有未分配的分片且集群健康状态为黄色,索引仍然可以根据其索引生命周期管理策略转换到下一个阶段。然而,由于Elasticsearch只能在绿色集群上执行某些清理任务,因此可能会出现意外的副作用。
为了避免增加的磁盘使用和可靠性问题,请及时解决任何集群健康问题。
1.4、阶段执行
ILM 控制一个阶段中操作的执行顺序,以及执行每个操作所需的必要索引步骤。
当索引进入一个阶段时,ILM 会在索引元数据中缓存该阶段的定义。这确保了策略更新不会将索引置于无法退出该阶段的状态。如果更改可以安全地应用,ILM 会更新缓存的阶段定义。如果无法应用,则使用缓存的定义继续执行阶段。
ILM 会定期运行,检查索引是否符合策略标准,并执行所需的任何步骤。为了避免竞态条件,ILM 可能需要运行多次以执行完成一个操作所需的所有步骤。例如,如果 ILM 确定一个索引已达到滚动标准,它将开始执行完成滚动操作所需的步骤。如果它达到一个不能安全进入下一步的点,执行将停止。下次 ILM 运行时,它将从上次停止的地方继续执行。这意味着,即使将 indices.lifecycle.poll_interval
设置为 10 分钟,并且索引满足滚动标准,也可能需要 20 分钟才能完成滚动。
1.5、阶段操作
ILM 支持在每个阶段执行以下操作。
Hot(热)
设置优先级 (Set Priority)
取消跟踪 (Unfollow)
滚动 (Rollover)
Warm(温)
设置优先级 (Set Priority)
取消跟踪 (Unfollow)
只读 (Read-Only)
分配 (Allocate)
收缩 (Shrink)
强制合并 (Force Merge)
Cold(冷)
设置优先级 (Set Priority)
取消跟踪 (Unfollow)
分配 (Allocate)
冻结 (Freeze)
Delete(删除)
等待快照 (Wait For Snapshot)
删除 (Delete)
二、生命周期策略示例
es可以用来存储日志,一般日志存储只是短期保存,超过一定时间日志要是能自动删除最好,这样保证索引文档不会过多,查询时效性也能得到保证。
索引的生命周期分为四个阶段:HOT->WARM->COLD->DELETE
。
上面除了HOT为必须的阶段外,其他为非必须阶段,可以任意选择配置。因为日志索引只要满足自己删除功能,所以下文只配置了HOT与DELETE阶段。
三步实现完成es生命周期管理:
配置策略(policy)、索引模版(template)、索引(index)
1、配置策略(policy)
PUT _ilm/policy/datastream_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover":{
"max_docs":1
}
}
},
"delete": {
"min_age": "30s",
"actions": {
"delete": {}
}
}
}
}
}
创建了一个 datastream_policy
策略,策略含义是:当hot阶段索引文档超过一条,就会发生rollover。便于测试,delete阶段,超过30s执行删除动作。
还可以选择其它维度控制,索引大小,索引时间:
"max_size": "50GB"
"max_age": "30d"
2、索引模版(template)
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"
}
}
创建了一个索引模板,"index_patterns": ["datastream-*"]
,索引以datastream-
开头的则自动采用setting的配置;
"index.lifecycle.name": "datastream_policy"
, 采用”datastream_policy“的策略;
"index.lifecycle.rollover_alias": "datastream"
,创建使用该模版创建的索引统一用”datastream“的别名进行管理。
3、索引(index)
PUT datastream-000001
{
"aliases": {
"datastream": {
"is_write_index": true
}
}
}
创建一个初始索引,并设置索引可写入。
配置完成,下面进行验证过程。
4、配置lifecycle检测时间
PUT /_cluster/settings{
"transient": {
"indices.lifecycle.poll_interval": "10s"
}
}
默认十分钟,便于测试,改为10s。
5、验证
POST datastream/_doc
{
"message":"hello world"
}
通常对外暴露别名,所以索引采用别名写入数据,因为,别名"datastream"匹配index_patterns,写入后,es根据配置的策略"datastream_policy"
进行rollover。
用以下命令查看索引rollover进度。
GET datastream-*/_ilm/explain
等待30秒后,返回的数据如下:
{
"indices" : {
"datastream-000002" : {
"index" : "datastream-000002",
"managed" : true,
"policy" : "datastream_policy",
"lifecycle_date_millis" : 1596442291089,
"age" : "43.77s",
"phase" : "hot",
"phase_time_millis" : 1596442292420,
"action" : "rollover",
"action_time_millis" : 1596442301555,
"step" : "check-rollover-ready",
"step_time_millis" : 1596442301555,
"phase_execution" : {
"policy" : "datastream_policy",
"phase_definition" : {
"min_age" : "0ms",
"actions" : {
"rollover" : {
"max_docs" : 1
}
}
},
"version" : 1,
"modified_date_in_millis" : 1596441845846
}
},
"datastream-000001" : {
"index" : "datastream-000001",
"managed" : true,
"policy" : "datastream_policy",
"lifecycle_date_millis" : 1596442291025,
"age" : "43.83s",
"phase" : "delete",
"phase_time_millis" : 1596442330859,
"action" : "delete",
"action_time_millis" : 1596442330859,
"step" : "wait-for-shard-history-leases",
"step_time_millis" : 1596442330859,
"phase_execution" : {
"policy" : "datastream_policy",
"phase_definition" : {
"min_age" : "30s",
"actions" : {
"delete" : { }
}
},
"version" : 1,
"modified_date_in_millis" : 1596441845846
}
}
}
}
索引自动创建了一个新的datastream-000002
,旧的索引datastream-000001
action变成DELETE。
再过一段时间再次查看索引:
GET datastream-*/_ilm/explain
结果如下:
{
"indices" : {
"datastream-000002" : {
"index" : "datastream-000002",
"managed" : true,
"policy" : "datastream_policy",
"lifecycle_date_millis" : 1596442291089,
"age" : "1.45m",
"phase" : "hot",
"phase_time_millis" : 1596442292420,
"action" : "rollover",
"action_time_millis" : 1596442301555,
"step" : "check-rollover-ready",
"step_time_millis" : 1596442301555,
"phase_execution" : {
"policy" : "datastream_policy",
"phase_definition" : {
"min_age" : "0ms",
"actions" : {
"rollover" : {
"max_docs" : 1
}
}
},
"version" : 1,
"modified_date_in_millis" : 1596441845846
}
}
}
}
旧的索引已经删除,在做日志查询时,我们只需要使用别名 datastream
进行日志查询即可,es便可无感知完成日志存储删除动作。
三、实际使用
实际工作中的使用,供参考。
1、配置策略(policy)
PUT _ilm/policy/ehr_prod_log_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "30gb"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
两个阶段,hot和delete;索引超过30G,则执滚动;delete阶段,超过30天执行删除动作。
2、索引模版(template)
PUT _template/ehr_prod_log_template
{
"index_patterns": ["ehr-prod-log-rollover-*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "ehr_prod_log_policy",
"index.lifecycle.rollover_alias": "ehr-prod-log-rollover"
}
}
kafka中topic名称ehr-prod-log,这里对应定义别名“ehr-prod-log-rollover”,logstash配置会用到。
3、索引(index)
PUT ehr-prod-log-rollover-00000001
{
"aliases": {
"ehr-prod-log-rollover": {
"is_write_index": true
}
}
}
4、Logstash配置
output {
elasticsearch {
hosts => ["**"]
index => "ehr-prod-log-rollover"
user => "ehr-prod"
password => "***"
}
}
评论