在 Elasticsearch 的每个节点的配置文件(elasticsearch.yml
)中,为节点分配自定义属性:
# 热节点(性能较高的节点)
node.attr.data_tier: hot
# 温节点(性能适中的节点)
node.attr.data_tier: warm
# 冷节点(性能较低的节点,用于索引归档)
node.attr.data_tier: cold
ILM 可以自动管理数据的生命周期,包括将索引从热节点迁移到温节点、冷节点,或最终删除。
创建一个生命周期策略:
PUT _ilm/policy/log_data_policy
{
"policy": {
"description": "Hot-Warm-Cold ILM",
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_age": "1d",
"max_size": "50gb"
}
}
},
"warm": {
"min_age": "1d",
"actions": {
"allocate": {
"require": {
"data_tier": "warm"
}
},
"forcemerge": {
"max_num_segments": 1
}
}
},
"cold": {
"min_age": "7d",
"actions": {
"allocate": {
"require": {
"data_tier": "cold"
}
},
"forcemerge": {
"max_num_segments": 1
},
"freeze": {}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
这个策略分为四个阶段:
PUT _template/log_template
{
"index_patterns": [
"*-log-data-*"
],
"order": 0,
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.routing.allocation.require.data_tier": "hot",
"index.lifecycle.name": "log_data_policy",
"index.lifecycle.rollover_alias": "log_alias"
},
"aliases": {
"app_log": {}
},
"mappings": {
"dynamic": false,
"properties": {
"@timestamp": {
"type": "date"
},
"application": {
"type": "keyword",
"ignore_above": 30
},
"class": {
"type": "keyword",
"index": false,
"ignore_above": 256
},
"client_ip": {
"type": "ip"
},
"original_ip": {
"type": "ip"
},
"level": {
"type": "keyword",
"ignore_above": 10
},
"message": {
"type": "text",
"analyzer": "standard"
},
"response_time": {
"type": "integer",
"index": false
},
"servlet_path": {
"type": "keyword",
"ignore_above": 50
},
"status": {
"type": "integer"
},
"thread": {
"type": "keyword",
"index": false,
"ignore_above": 30
},
"logtime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss.SSS"
}
}
}
}
热阶段(hot phase):
min_age: "0ms"
表示索引刚创建时就进入热阶段,存储当天的数据。rollover
操作:当索引达到 max_age: "1d"
或者 max_size: "50gb"
时,会触发索引的滚动,创建新的索引并继续写入数据。max_age: "1d"
确保热节点只存储当天的索引。温阶段(warm phase):
min_age: "1d"
表示数据在热阶段存储 1 天后转到温阶段,存储1天外至7天内的数据。allocate
操作:将索引迁移到标记为 warm
的节点上,可以在温节点上做段合并(forcemerge
),提高查询效率。冷阶段(cold phase):
min_age: "7d"
表示数据在7天后进入冷阶段,存储7天外至30天内的数据。allocate
操作:将索引迁移到标记为 cold
的节点上。freeze
操作:将冷数据冻结,这会显著减少存储需求,但会降低查询性能,因为冻结后的索引不能被写入,只能读取。删除阶段(delete phase):
min_age: "30d"
表示在数据存储超过30天后将其删除,防止过期数据占用过多存储空间。freeze
操作:
freeze
操作将索引冻结。冻结索引在读取时更节省空间,但不能进行写入或更新操作。适用于存储不再活跃、且访问频率低的历史数据。forcemerge
操作:
delete
操作:
min_age
来控制删除数据的时间窗口。