HDFS SnapShot原理
【簡介】
HDFS快照簡單地說就是對某個文件夾進行備份,創建了快照的文件夾本身不能被刪除,但是文件夾里面的文件和文件夾都是可以被刪除的。在對一個文件夾創建快照之前,需先允許該文件夾可以創建快照
允許快照
hdfs dfsadmin -allowSnapshot <path>
創建快照
hdfs dfs -createSnapshot <path> [<snapshotName>]
其中snapshotName是快照名,可選參數,不填的話會自動生成一個快照名,命名規則類似:s20180118-174044.492,創建快照后,會在文件夾下看到.snapshot目錄,該目錄存放所有的快照
查看所有的snapshottable
hdfs lsSnapshottableDir
恢復快照
hdfs dfs -cp <snapshotpath> <path>
刪除快照
hdfs dfs -deleteSnapshot <path> <snapshotName>
取消快照
hdfs dfsadmin -disallowSnapshot <path>
取消快照之前,需先刪掉所有的快照
快照對比
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
HDFS中可以對目錄創建Snapshot,創建之后不管后續目錄發生什么變化,都可以通過snapshot找回原來的文件和目錄結構。
為了啟用這種功能,首先需要啟用目標目錄的snapshot功能,可以通過下面的命令來執行:
hdfs dfsadmin -allowSnapshot <path> 啟用snapshot功能后,并不會自動進行snapshot保存,還需要先創建snapshot, 通過下面的命令來執行:
hdfs dfs -createSnapshot <path> [<snapshotName>]
可以為相同的目錄創建多個snapshot, 不同的snapshot通過名字來區分,默認是syyyyMMdd-HHmmss.SSS,例如/storage/WALs/.snapshot/s20140515-084657.639
【實現原理】
實現上是通過在每個目標節點下面創建snapshot節點,后續任何子節點的變化都會同步記錄到snapshot上。例如刪除子節點下面的文件,并不是直接文件元信息以及數據刪除,而是將他們移動到snapshot下面。這樣后續還能夠恢復回來。另外snapshot保存是一個完全的現場,不僅是刪除的文件還能找到,新創建的文件也無法看到。后一種效果的實現是通過在snapshot中記錄哪些文件是新創建的,查看列表的時候將這些文件排除在外。
在HDFS中INode表示一個節點,其中INodeFile表示文件,INodeDirectory表示目錄。INodeFileWithSnapshot表示帶有快照的文件,INodeDirectoryWithSnapshot表示帶有快照的目錄, (INodeDirectorySnapshottable表示可以創建快照的目錄,INodeDirectoryWithSnapshot不能創建新的快照,只能將目錄的變化記錄到現有的快照里面)相關的類結構如下:
?
圖中紅線表示的是關鍵類的引用關系,其中最重要的是DirectoryDiffList,里面保存了一些快照和當前目錄的差別。每一個DirectoryDiff中包含快照以及兒子變化,是實現快照功能的核心。ChilderenDiff中created list保存的是從快照時間之后新創建的節點,deteled list保存的新刪除的節點。snapshot中的root節點保存了snapshot的name,可以通過這個找到對應的快照。
【例子分析】
我們通過一個例子來分析整個snapshot的實現細節:
1. 文件目錄樹如下圖所示,并且我們已經通過命令啟動了a的snapshot功能,結構如下圖所示:
圖中.snapshot是虛擬節點,保存了所有的snapshot列表,其中diff中還保存當前節點下面的變化,一個snapshot對應于一個diff.要注意的是snapshot中可以被多個目錄的diff引用,后續會進行說明。
2. 當我們執行createSnapshot命令時,結果如下:
?
?
3. 當刪除文件e的時候
不論是刪除一個文件還是一個目錄,只要是直接子節點,都會將節點轉換為快照版本.例如e會變成INodeFileWithSnapshot,在a的DirectoryDiff中ChildDiff中deleted列表中將會包含e,而在a的正常節點下會被刪除。目錄節點的處理同樣。
?
4. 刪除孫子節點是的情況
處理這種節點的原則是:先將孫子節點轉變為Snapshot版本,然后將父節點變為snapshot版本,同時將孫子節點版本加入到直接父節點的diff列表中。為了能夠通過同一個snapshot找到當時的文件,需要將新的diff指向到老的snapshot版本上。圖中d節點是INodeDirectoryWithSnapshot(不是INodeDiretorySnapshottable, 本身不允許在d上創建snapshot)
?
?
一、snapshot的定義:?
snapshot是hdfs的整個文件系統,或者某個目錄在某個時刻的鏡像。該鏡像并不會隨著源目錄的改變而進行動態的更新。?
二、使用snapshot可以解決的問題?
(1)防止用戶的誤操作?
管理員可以通過滾動的方式來對重要的目錄進行創建snapshot的操作,這樣在系統中就存在針對某個目錄的多個快照版本。當用戶誤刪除掉某個文件時,可以通過最新的snapshot來進行相關的恢復操作。?
(2)備份集群或者重要目錄?
管理員可以使用snapshot來進行整個集群,或者某些目錄、文件的備份。管理員以某個時刻的snapshot做為備份的起始結點,然后通過比較不同備份之間差異性,來進行增量備份。?
(3)在原始數據上進行測試或者實驗?
經常有業務部門需要在某些重要數據上不斷的進行某些測試或者實驗,某些程序的bug可能會直接將原始的數據破壞掉,所以為了防止這種情況的發生,管理員可以臨時的為用戶針對要操作的數據來創建一個snapshot,然后讓用戶在對應的snapshot上進行相關的實驗和測試,從而避免對原始數據的破壞。?
(4)災難的備份?
可以將集群某個時刻的snapshot拷貝到遠程的備份集群,從而實現遠程的災難備份。
三、與snapshot相關的主要操作:?
1、為某個目錄打開snapshot的功能?
sudo -u hdfs hdfs dfsadmin -allowSnapshot /tmp/important_dir?
2、查看已經開啟了snapshot的目錄列表?
sudo -u hdfs hdfs lsSnapshottableDir?
3、為開啟了snapshot功能的目錄創建一個snapshot?
sudo -u hdfs hdfs dfs -createSnapshot /tmp/important_dir important_dir_snapshot?
4、對開啟了snapshot功能的目錄執行刪除操作,會出現下面的錯誤提示,即不允許刪除已經開啟了snapshot功能的目錄?
sudo -u hdfs hdfs dfs -rmr /tmp/important_dir?
錯誤提示:?
rmr: Failed to move to trash: hdfs://ptmind-cluster/tmp/important_dir: The directory /tmp/important_dir cannot be deleted since /tmp/important_dir is snapshottable and already has snapshots?
5、刪除開啟了snapshot功能的目錄下的文件?
sudo -u hdfs hdfs dfs -rm /tmp/important_dir/important_file.txt?
文件被成功的刪除掉,那如果是誤刪除了此文件呢?該如何進行恢復呢?
6、恢復已經被誤刪除的文件?
查看.snapshot子目錄下,是否包含已經被刪除的文件?發現包含被誤刪除的文件。?
sudo -u hdfs hdfs dfs -ls /tmp/important_dir/.snapshot/important_dir_snapshot?
將誤刪除的文件從.snapshot子目錄拷貝到之前的目錄下?
sudo -u hdfs hdfs dfs -cp /tmp/important_dir/.snapshot/important_dir_snapshot/important_file.txt /tmp/important_dir?
至此,被誤刪除的文件被成功的恢復了
7、比較兩個snapshot之間的差異性?
重新創建一個snapshot?
sudo -u hdfs hdfs dfs -createSnapshot /tmp/important_dir important_dir_snapshot_2?
hdfs snapshotDiff /tmp/important_dir important_dir_snapshot important_dir_snapshot_2?
可以使用 “.”來代表目錄的當前最新狀態
結果的解釋:?
+ The file/directory has been created.?
- The file/directory has been deleted.?
M The file/directory has been modified.?
R The file/directory has been renamed.
其他相關操作:?
1、對snapshot進行重命名?
hdfs dfs -renameSnapshot?
2、刪除snapshot?
hdfs dfs -deleteSnapshot?
3、禁止某個目錄的snapshot特性?
hdfs dfsadmin -disallowSnapshot
注意:?
snapshot只是保存了某個目錄在某個時刻的快照,如果在執行完createSnapshot 的操作之后,又往之前的目錄下新添加了文件,那么此時在.snapshot目錄下并不會存在新添加的文件。
對于snapshot內部是如何工作的,會單獨的再寫一篇文章來進行說明。
?
?
?
總結
以上是生活随笔為你收集整理的HDFS SnapShot原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Altium Designer -- P
- 下一篇: Linux系统调用及用户编程接口(API