ElasticSearch的增量快照浅析

前言

ES的官方文档中关于增量快照的说明是:
你的第一个快照会是一个数据的完整拷贝,但是所有后续的快照会保留的是已存快照和新数据之间的差异。
看到这个解释后,脑海中产生出些许疑问:
  1. 删除历史快照会对新的快照造成影响吗?
  2. 如果每次保存的都是差异,那我的快照数据量是不是会越来越大?
  3. 恢复完整数据的时候要如何恢复?需要从第一个快照开始一个一个恢复吗?
经过一番搜索和思考,总结一下我对这些问题的理解。
 

基础知识

首先,有一些关键知识点需要了解一下:
  • ES 的底层使用了 Lucene, ES 快照实际上是对 Lucene 快照文件的一次保存。
  • Lucene 快照包含了当前时间点上与需要快照的索引相关的全部文件。
  • Lucene 的索引是由多个分段文件组成的,且分段文件是不能被修改的,只会新增和删除。
  • 只有两种情况下会产生新的分段文件:1、新增、修改、删除索引内的数据 2、将已存在的分段文件合并
  • 快照删除时仅删除没有被任何快照引用的文件
 

快照过程梳理

首次快照示意图,快照名称记为:快照 A
与快照 A 关联的文件列表为:1、2、3
然后我们对ES中的数据做了一些修改,导致Lucene文件发生了一些变化。由于Lucene索引分段文件的特性,只会新增和删除而不会修改,因此此时的Lucene中文件可能如下
然后进行第二次快照,快照名称记为:快照 B
与快照 B 关联的文件列表为:2、3、4
然后删除快照 A
因为
与快照 A 关联的文件是:1、2、3
与快照 B 关联的文件是:2、3、4
所以 只有文件 1 可以被删除。
 

疑问解答

1、删除历史快照会对新的快照造成影响吗?
答:不会的,以上面的流程为例,只会清理不被任何快照关联的文件。而每个快照关联的文件列表都能还原当时的全量数据。
 
2、如果每次保存的都是差异,那我的快照数据量是不是会越来越大?
答:如果定期清理历史的快照,那么快照的数据量是不会越来越大的。虽然每次都保存的是差异,但这个差异并不是绝对的新增数据,而是对历史数据做了修改后的一个局部全量数据。也就是说,新文件和旧文件之间是有重叠数据的,所以清理历史文件即可。
 
3、恢复完整数据的时候要如何恢复?需要从第一个快照开始一个一个恢复吗?
答:不需要,只需恢复指定时间点的快照即可,因为每个快照都保留了那个时间点的全量数据。
 
参考文档:

备份你的集群-ES官方文档

 

 
 
 
posted @ 2021-09-02 19:34  Mr..D  阅读(2026)  评论(0编辑  收藏  举报