《Elasticsearch 集群》系列,共包含以下文章:
- 1?? 冷熱集群架構
- 2?? 合適的鍋炒合適的菜:性能與成本平衡原理公式解析
- 3?? ILM(Index Lifecycle Management)策略詳解
- 4?? Elasticsearch 跨機房部署
- 5?? 快照與恢復功能詳解
- 6?? Elasticsearch 快照恢復 API 參數詳解
- 7?? 安全地刪除快照倉庫、快照
- 8?? 快照生命周期管理 SLM(理論篇)
- 9?? 快照生命周期管理 SLM(實戰篇)
- 🔟 跨集群檢索(Cross-Cluster Search)
😊 如果您覺得這篇文章有用 ?? 的話,請給博主一個一鍵三連 🚀🚀🚀 吧 (點贊 🧡、關注 💛、收藏 💚)!!!您的支持 💖💖💖 將激勵 🔥 博主輸出更多優質內容!!!
安全地刪除快照倉庫、快照
- 1.刪除倉庫
- 2.刪除快照
在上一篇博文《【Elasticsearch】快照與恢復功能詳解》中,我們針對 Elasticsearch 的快照和恢復功能進行的講解。細心的同學可能會對以下的命令產生疑惑,直接刪除是安全的嗎?本文將會給你答案。
- 刪除倉庫:
DELETE /_snapshot/my_backup_repo
- 刪除快照:
DELETE /_snapshot/my_backup_repo/my_snapshot_20230720
1.刪除倉庫
當你執行 DELETE /_snapshot/my_backup_repo
這個命令時,你是在 Elasticsearch 集群中刪除 my_backup_repo
這個快照倉庫的注冊信息或定義。
關鍵點在于:
- 刪除的是“注冊信息”,不是物理數據:這個操作 不會 刪除存儲在實際后端存儲系統(比如 AWS S3 桶、Azure Blob 容器、NFS 共享目錄等)中的 任何快照文件或數據。
- 后果:
- Elasticsearch 集群將不再知道存在名為
my_backup_repo
的倉庫。 - 你無法再通過 Elasticsearch API 來 查看、創建、恢復或刪除 這個倉庫中的任何快照(因為集群不知道它了)。
- 你 無法再通過 Elasticsearch 管理 存儲在該位置的歷史快照。
- Elasticsearch 集群將不再知道存在名為
- 物理數據依然存在:你使用這個倉庫創建的所有快照文件(
my_snapshot_1
,my_snapshot_2
等)仍然 安全地躺在 你配置的 S3 桶、Azure 容器、共享文件系統路徑等地方。 - 為什么設計成這樣?這是一種安全機制。防止管理員在 Elasticsearch 中誤操作刪除倉庫命令時,導致寶貴的備份數據被物理刪除。真正的數據刪除需要直接操作底層存儲系統。
- 如何真正刪除快照數據?
- 如果你想 徹底刪除快照數據以釋放存儲空間,你必須在 刪除倉庫注冊信息之前,使用 Elasticsearch API 先刪除倉庫內的具體快照:
DELETE /_snapshot/my_backup_repo/my_snapshot_20230720
。這個命令會通知 Elasticsearch 去清理倉庫中該快照專用的、不再被其他快照引用的數據段。 - 或者,在 刪除了倉庫注冊信息之后,你只能 直接登錄到你的存儲系統(如 AWS S3 控制臺、Azure 門戶、NFS 服務器),手動找到對應的目錄/路徑并刪除里面的文件。這需要你非常清楚倉庫在存儲系統中的具體位置(比如 S3 桶里的
snapshots/prod_cluster
路徑)。
- 如果你想 徹底刪除快照數據以釋放存儲空間,你必須在 刪除倉庫注冊信息之前,使用 Elasticsearch API 先刪除倉庫內的具體快照:
簡單比喻:
想象你的快照倉庫是一個圖書館(物理存儲)。DELETE /_snapshot/my_backup_repo
這個操作相當于:
- 把圖書館的 地址登記簿 上關于
my_backup_repo
圖書館的那一頁 撕掉了。 - 圖書館管理員(Elasticsearch)忘記了這個圖書館的存在,再也不能幫你從里面借書(管理快照)。
- 但是,圖書館大樓本身和里面所有的書(你的快照數據)都完好無損地還在原地!只是管理員不知道它在哪里,也無法幫你管理里面的書了。
總結:執行 DELETE /_snapshot/my_backup_repo
只會移除 Elasticsearch 集群內部對這個倉庫的配置和認知,絕不會觸碰存儲在外部(如 S3、NAS)的實際快照數據文件。 要清理物理存儲空間,必須在刪除倉庫定義前通過 API 刪除快照,或在刪除倉庫定義后直接操作底層存儲系統。
2.刪除快照
DELETE /_snapshot/my_backup_repo/my_snapshot_20230720
- Elasticsearch 會清理 僅被該快照引用 的段文件。被其他快照共享的段文件不會被刪除。刪除是安全的操作。
上面這段話解釋了執行 DELETE /_snapshot/my_backup_repo/my_snapshot_20230720
命令刪除 單個快照 時,Elasticsearch 在 底層存儲層面 的智能行為和安全機制。核心是理解 “增量快照” 和 “段文件共享” 的原理。
解析:
DELETE /_snapshot/my_backup_repo/my_snapshot_20230720
- 這是刪除名為
my_backup_repo
的快照倉庫中,名為my_snapshot_20230720
的特定快照的命令。
- 這是刪除名為
- Elasticsearch 會清理僅被該快照引用的段文件
- 段文件(Segment Files):Elasticsearch(底層是 Lucene)將索引數據存儲在不可變的段文件中。寫入操作會產生新的段,后臺會合并小的段成大的段。
- 增量快照:快照是增量的。首次快照備份所有相關的段文件。后續快照只備份 自上次快照以來新創建或修改的段文件。舊的、未修改的段文件在倉庫中只有一份物理存儲,但會被多個快照邏輯引用。
- 僅被該快照引用:當刪除一個快照時,Elasticsearch 會檢查倉庫中哪些段文件 只有 這個即將被刪除的快照在使用(引用)。這些段文件不再被任何其他快照需要,因此是 “孤立” 的,可以安全地從物理存儲中刪除以釋放空間。
- 清理:指物理刪除這些不再被任何快照引用的段文件。
- 被其他快照共享的段文件不會被刪除
- 如果一個段文件存在于多個快照中(例如,它是一個在
my_snapshot_20230720
創建之前就存在且從未修改過的段,被my_snapshot_20230720
和更早的快照如my_snapshot_20230713
共同引用),那么刪除my_snapshot_20230720
不會 刪除這個共享的段文件。 - 因為其他快照(如
my_snapshot_20230713
)仍然需要它。只有該快照獨有的段文件才會被清理。
- 如果一個段文件存在于多個快照中(例如,它是一個在
- 刪除是安全的操作
- 不會誤刪共享數據:如上所述,被其他快照共享的基礎數據會被保留,確保其他快照的完整性和可恢復性。
- 精準釋放空間:只刪除真正不再需要的、孤立的段文件,有效釋放存儲空間。
- 不影響其他快照:刪除一個快照不會破壞或影響倉庫中其他快照的完整性。其他快照仍然可以正常恢復。
- 操作冪等性(通常):如果嘗試刪除一個不存在的快照,命令通常會返回一個錯誤(如
404
),不會造成意外后果。重復刪除同一個快照(如果第一次成功)通常也會報錯(404
),不會執行額外操作。
核心概念圖示:
想象快照倉庫里存儲的是樂高積木(段文件):
-
1?? 首次快照 → Snap1:備份了構建城堡 A 所需的所有積木(Block1、Block2、Block3)。
-
2?? 第二次快照 → Snap2:城堡 A 只在頂部加了一個新塔尖(Block4)。Snap2 只需備份新的 Block4。Snap2 的完整城堡由
[Block1, Block2, Block3 (引用自Snap1), Block4]
組成。 -
3?? 第三次快照 → Snap3:城堡 A 被改造成了飛船,替換了底座(Block5),保留了部分舊墻(Block2)。Snap3 備份新的 Block5 和修改過的 Block2(可能是一個新版本的 Block2)。Snap3 的飛船由
[Block2(新版本), Block3 (引用自Snap1), Block5]
組成。舊的 Block1 和 Block4 不再被引用。- 物理存儲:所有積木(Block1/2/3/4/5/2’)實際只存儲一份
- 邏輯引用:
- Snap1 → 引用基礎積木 Block1/2/3
- Snap2 → 引用共享積木 Block1/2/3 + 獨有 Block4
- Snap3 → 引用共享積木 Block3 + 新積木 Block2’/5
-
4?? 刪除 Snap2:
- Snap2 獨有的積木是 Block4(因為 Snap1 沒有它,Snap3 也不需要它)。
- Snap2 和其他快照 共享 的積木是
Block1, Block2(舊), Block3 (它們還被 Snap1 或 Snap3 引用)
。 - 結果:執行
DELETE /_snapshot/repo/Snap2
后,檢查引用計數:- Block4 僅被 Snap2 引用 → 刪除(物理刪除)
- Block1 還被 Snap1 引用 → 保留
- Block2(舊) 還被 Snap1 引用 → 保留
- Block3 被 Snap1/Snap3 引用 → 保留
- Snap1 和 Snap3 仍然完整可用。
總結理解的關鍵點在于:
- 增量性與共享:快照不是獨立的完整拷貝,它們共享未修改的底層數據段。
- 引用計數:Elasticsearch 內部維護著倉庫中段文件被哪些快照引用的信息。
- 智能清理:刪除快照時,只清理 引用計數降為 0(即不再被任何快照引用)的段文件。
- 安全保證:這種基于引用計數的清理機制確保了:
- 刪除一個快照不會破壞其他快照。
- 空間得到有效釋放(刪除孤立數據)。
- 操作不會導致意外數據丟失(只刪該刪的)。
因此,你可以放心地刪除舊的或不必要的快照來管理倉庫存儲空間,而不用擔心會破壞其他快照或丟失仍然需要的基礎數據。這就是 “刪除是安全的操作” 的含義。