前言
ES的官方文檔中關於增量快照的說明是:
你的第一個快照會是一個數據的完整拷貝,但是所有后續的快照會保留的是已存快照和新數據之間的差異。
看到這個解釋后,腦海中產生出些許疑問:
- 刪除歷史快照會對新的快照造成影響嗎?
- 如果每次保存的都是差異,那我的快照數據量是不是會越來越大?
- 恢復完整數據的時候要如何恢復?需要從第一個快照開始一個一個恢復嗎?
經過一番搜索和思考,總結一下我對這些問題的理解。
基礎知識
首先,有一些關鍵知識點需要了解一下:
- 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、恢復完整數據的時候要如何恢復?需要從第一個快照開始一個一個恢復嗎?
答:不需要,只需恢復指定時間點的快照即可,因為每個快照都保留了那個時間點的全量數據。
參考文檔: