如何配置Elasticsearch仅备份热索引,避免全量快照占用过多存储?
解决方案
一、解决每次新建仓库全量备份的问题
你每次备份全量的根本原因是ES的快照增量复用能力仅支持同一个快照仓库内的历史快照,跨不同仓库无法共享已备份的段文件,再加上如果你之前执行的是全集群备份,自然会每次把所有历史索引都重新备份一遍。
调整方案非常简单:
- 每次执行快照前,先通过ES API筛选出创建时间在过去24小时内的新增索引,命令参考:
# 筛选过去24小时创建的业务索引,输出索引名列表 curl -s "http://<ES集群地址>:9200/_cat/indices?h=index,creation.date.string" | awk '$2 >= "'$(date -d "-24 hours" +%Y-%m-%dT%H:%M:%S)'" {print $1}' | grep -v "\." > today_indices.txt
- 备份时仅指定上述筛选出的当日新增索引作为备份目标,不需要备份全集群。这样就算是新建的独立快照仓库,也只会备份当日的5个新增索引,不会拉取历史索引的数据,完全避免无效的全量备份。
二、冷热分层架构实现自动区分备份范围
完全可以通过冷热分层+索引生命周期管理(ILM)实现你要的24小时自动流转、仅热索引备份的需求,配置步骤如下:
- 节点打标签
修改集群节点的elasticsearch.yml配置:
- 热数据节点增加配置:
node.attr.data: hot - 暖数据节点增加配置:
node.attr.data: warm
修改完成后滚动重启集群生效。
- 配置ILM生命周期策略
创建索引生命周期策略,核心规则:
- 热阶段:索引创建后默认进入热阶段,保持可写状态,留存在热节点,
min_age设置为24小时 - 暖阶段:索引创建满24小时后自动转入暖阶段,分片自动迁移到暖节点,可设置为只读、合并小段降低存储空间占用
- 关联索引模板
把上述ILM策略关联到你支付日志的索引模板,后续所有新生成的日志索引会自动套用该策略,不需要人工干预。
后续你每日备份时,可以直接筛选处于热阶段的索引作为备份目标,和按创建时间筛选的效果完全一致,还能避免因索引生成时间偏移导致的漏备问题。
三、额外优化建议
结合你已经验证的gzip压缩效果,还可以做以下优化降低存储占用、提升可靠性:
- 每日归档打包时,同步生成压缩包的sha256校验值单独存储,恢复前先校验包完整性,避免NFS故障导致的损坏包无法恢复的问题
- 你当前的每日独立归档模式天然隔离了不同日期的备份,单份备份损坏不会影响全量备份池,容错性远高于之前共用单个仓库的方案
- 留存的归档包建议按年/月目录分类存储,方便后续审计检索,2年留存期的总存储量预计在30~40TB左右,完全可以满足存储需求
内容的提问来源于stack exchange,提问作者noze_potato
相关产品推荐
相关产品推荐

