为 Elasticsearch 配置冷热分离架构(Hot-Warm Architecture) 是提升日志系统稳定性、性能和成本效益的关键策略。它通过将数据按访问频率分层存储,合理利用不同硬件资源,避免资源争抢,从而增强集群的鲁棒性。
✅ 一、什么是冷热分离架构?
Elasticsearch 冷热分离是一种基于 节点角色划分 + 数据生命周期管理 的架构模式:
| 层级 | 用途 | 硬件要求 | 访问频率 |
|---|---|---|---|
| Hot(热节点) | 接收实时写入、高频查询 | SSD、高 CPU/内存 | 极高 |
| Warm(温节点) | 存储只读历史数据、低频查询 | 普通磁盘、中等内存 | 中低 |
| Cold(冷节点,可选) | 存档极冷数据 | 大容量 HDD 或对象存储 | 极少 |
| Frozen(冻结节点,高级功能) | 超长期归档,按需解冻 | 对象存储 + 少量内存 | 几乎无 |
🎯 目标:让“热数据快如闪电,冷数据省如磐石”。
✅ 二、配置步骤详解
步骤 1:准备节点并分配角色
在每台 Elasticsearch 节点的 elasticsearch.yml 中设置节点角色:
# 热节点(hot)
node.roles: [ data_hot, ingest ]
path.data: /data/hot
# 温节点(warm)
node.roles: [ data_warm ]
path.data: /data/warm
# 冷节点(cold)
node.roles: [ data_cold ]
path.data: /data/cold
🔔 注意:
- 不要混用
data和具体角色(如data_hot),否则可能导致分配混乱。- 可结合
master、ingest等其他角色灵活部署。
步骤 2:创建索引模板(Index Template)
定义模板,确保新索引自动应用正确的设置:
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "logs-lifecycle-policy",
"index.routing.allocation.require.data": "hot"
},
"mappings": {
"@timestamp": { "type": "date" },
"message": { "type": "text" },
"service": { "type": "keyword" }
}
}
}
关键点:
- 初始分配到
hot节点:"index.routing.allocation.require.data": "hot" - 绑定 ILM 策略:
"index.lifecycle.name": "logs-lifecycle-policy"
步骤 3:创建 ILM 生命周期策略
PUT _ilm/policy/logs-lifecycle-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "1d"
}
}
},
"warm": {
"min_age": "1d",
"actions": {
"allocate": {
"require": {
"data": "warm"
},
"number_of_replicas": 1
},
"forcemerge": {
"max_num_segments": 1
},
"readonly": {}
}
},
"cold": {
"min_age": "7d",
"actions": {
"allocate": {
"require": {
"data": "cold"
}
},
"freeze": {}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
说明:
min_age: 从进入上一阶段开始计时forcemerge: 合并段文件,减少开销readonly: 防止意外写入freeze: 冻结索引以节省内存(需 Gold 许可)
步骤 4:创建 Data Stream 并写入数据
使用 Data Stream 自动管理时间序列索引:
POST /logs-write/_doc
{
"@timestamp": "2025-04-05T10:00:00Z",
"message": "User login failed",
"service": "auth-service",
"level": "error"
}
💡
logs-write是 alias,指向当前可写的 hot 索引。
步骤 5:验证数据流动
查看 ILM 执行状态:
GET _ilm/explain/logs-000001
输出示例:
{
"index": "logs-000001",
"phase": "warm",
"action": "allocate",
"step": "complete"
}
检查分片分配情况:
GET _cat/shards/logs-*?v&s=node
确认热索引在 hot 节点,温索引在 warm 节点。
✅ 三、硬件与资源配置建议
| 节点类型 | CPU | 内存 | 存储 | 实例示例 |
|---|---|---|---|---|
| Hot | 高主频 | 32–64GB | NVMe SSD | i3.2xlarge (AWS) |
| Warm | 普通 | 16–32GB | SATA SSD/HDD | m5.large + EBS |
| Cold | 低 | 8–16GB | HDD 或 S3 兼容存储 | t3.medium + Glacier |
📌 建议:Hot 节点不要放太多分片,控制单节点 < 1000 分片。
✅ 四、优势总结
| 优势 | 说明 |
|---|---|
| 写入稳定 | 热节点专注写入,不受历史数据影响 |
| 查询高效 | 热数据在高速存储,响应更快 |
| 成本节约 | 温/冷数据使用廉价磁盘,节省 50%+ 成本 |
| 运维简化 | ILM 自动流转,无需人工干预 |
| 故障隔离 | 某类节点宕机不影响整体服务 |
✅ 五、注意事项
- License 要求:
frozen阶段需要 Gold 或更高许可 - 监控必须到位:使用 Kibana Stack Monitoring 观察各节点负载
- 避免频繁迁移:
min_age设置过短会导致反复移动分片 - 备份不能少:即使有副本,也应定期 snapshot 到远程仓库
通过正确配置冷热分离架构,你的 Elastic LogDB 将具备更强的稳定性、可扩展性和经济性,真正实现生产级日志平台的目标。


1318

被折叠的 条评论
为什么被折叠?



