Elasticsearch数据冷热分离
1. 节点属性配置
在 Elasticsearch 的每个节点的配置文件(elasticsearch.yml
)中,为节点分配自定义属性:
# 热节点(性能较高的节点)
node.attr.data_tier: hot
# 温节点(性能适中的节点)
node.attr.data_tier: warm
# 冷节点(性能较低的节点,用于索引归档)
node.attr.data_tier: cold
2. 配置 ILM
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": {}
}
}
}
}
}
这个策略分为四个阶段:
- 热(hot)阶段:索引会在热节点上存储,支持高频访问。
- 温(warm)阶段:1 天后,索引被迁移到温节点,减少资源消耗。
- 冷(cold)阶段:7 天后,迁移到冷节点,冻结索引,仅用于低频访问。
- 删除(delete)阶段:30 天后,删除索引以释放存储空间。
3.创建索引模板并绑定 ILM 策略
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
操作:
- 设置为30天后删除数据,防止数据积累过多。可以调整
min_age
来控制删除数据的时间窗口。