本文介绍在阿里云Elasticsearch集群上,通过生命周期管理ILM(Index Lifecycle Management)功能,实现冷热数据分离的实践流程。通过本实践,您既可以实现在保证集群读写性能的基础上,自动维护集群上的冷热数据,又能通过优化集群架构,降低企业生产成本。
背景信息
阶段 | 描述 |
---|---|
hot | 热数据阶段。主要处理时序数据的实时写入,可根据索引的文档数、大小、时长决定是否调用rollover API来滚动更新索引。 |
warm | warm阶段。索引不再写入,主要用来提供查询。 |
cold | 冷数据阶段。索引不再更新,查询很少,查询速度会变慢。 |
delete | 删除数据阶段。索引将被删除。 |
您可以通过两种方式为索引添加生命周期管理策略:
- 为索引模板添加生命周期管理策略:将策略应用到整个别名覆盖的索引下,本文以此为例。
- 为单个索引添加生命周期管理策略:只能覆盖当前索引,新滚动的索引不再受策略影响。
在时序和冷热数据场景上应用ILM,可以大幅度节约存储成本。本文以冷热数据场景为例,介绍如何使用ILM功能。配置场景如下:
- 将索引数据实时写入Elasticsearch。当索引数据增加到一定量时,数据自动写入新索引。
- 旧索引在hot阶段停留30分钟,进入warm阶段。
- warm阶段完成Merge及Shrink操作后,索引等待1小时(从滚动更新时算起),进入cold阶段。
- cold阶段将热节点数据迁移到冷节点,实现冷热数据分离后,索引会在2个小时(从滚动更新时算起)后被删除。
注意事项
- Elasticsearch索引生命周期策略需密切贴近业务模型。例如,对多个不同结构的索引进行生命周期管理,建议各个索引配置独立的别名和生命周期策略,以便于管理。
- 使用rollover滚动索引,初始索引应以自增数字结尾(-000001),否则策略不生效,长度要求为6。例如,定义初始索引为myindex-000001,则rollover后的索引是myindex-000002,以此类推进行递增。如果集群中索引名不符合规范,建议进行索引重建。
- hot阶段主要处理数据写入。业务中需保证数据是按照时间顺序写入的,处于warm和cold阶段的索引不建议进行数据写入。例如,在warm阶段配置actions为shrink或read only,那么索引进入warm阶段后将处于只读状态,数据无法写入。
操作流程
步骤一:创建冷热集群并查看节点的冷热属性
冷热集群是指在集群中包含冷、热两种属性的节点,可以提高Elasticsearch的处理性能和服务稳定性。两者区别如下。
节点类型 | 存储数据要求 | 读写性能要求 | 规格要求 | 存储要求 |
---|---|---|---|---|
热节点(hot) | 近期数据,例如最近2天的日志数据。 | 高 | 高,例如32核64 GB | 建议使用SSD云盘存储数据,存储空间大小需根据数据大小进行设置。 |
冷节点(warm) | 历史数据,例如2天之前的日志数据。 | 低 | 低,例如8核32 GB |
建议使用高效云盘存储数据,存储空间大小需根据数据大小进行设置。 |
步骤二:为索引配置生命周期管理策略
步骤三:验证数据分布
步骤四:更新ILM策略
步骤五:切换ILM策略
常见问题
Q:如何设置ILM策略周期?
A:由于索引生命周期策略默认是10分钟检查一次符合策略的索引,因此在这10分钟内索引中的数据可能会超出指定的阈值。例如在步骤二:为索引配置生命周期管理策略时,设置max_docs为1000,但doc数量在超过1000后才触发索引滚动更新,此时可通过修改indices.lifecycle.poll_interval参数来控制检查频率,使索引在阈值范围内滚动更新。
注意 请慎重修改该参数值,避免时间间隔太短给节点增加不必要的负载,本测试中将其改成了1m。
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval":"1m"
}
}