1. 程式人生 > >HDFS的快照原理和Hbase基於快照的表修復

HDFS的快照原理和Hbase基於快照的表修復

才會 vertical 根據 註意 efault 失敗 機制 soft hot

前一篇文章《HDFS和Hbase誤刪數據恢復》主要講了hdfs的回收站機制和Hbase的刪除策略。根據hbase的刪除策略進行hbase的數據表恢復。本文主要介紹了hdfs的快照原理和根據快照進行的數據恢復。

1.Hdfs的快照原理

1.1 快照原理

Hdfs的快照(snapshot)是在某一時間點對指定文件系統拷貝,快照采用只讀模式,可以對重要數據進行恢復、防止用戶錯誤性的操作。

快照分兩種:一種是建立文件系統的索引,每次更新文件不會真正的改變文件,而是新開辟一個空間用來保存更改的文件,一種是拷貝所有的文件系統。Hdfs屬於前者。

Hdfs的快照的特征如下:

1. 快照的創建是瞬間的,代價為O(1),取決於子節點掃描文件目錄的時間。

2. 當且僅當做快照的文件目錄下有文件更新時才會占用小部分內存,占用內存的大小為O(M),其中M為更改文件或者目錄的數量;

3. 新建快照的時候,Datanode中的block不會被復制,快照中只是記錄了文件塊的列表和大小信息。

4. 快照不會影響正常的hdfs的操作。對做快照之後的數據進行的更改將會按照時間順序逆序的記錄下來,用戶訪問的還是當前最新的數據,快照裏的內容為快照創建的時間點時文件的內容減去當前文件的內容。

每個快照最高限額為65536個文件或者文件夾,在快照的子文件夾中不允許在創建新的快照。

技術分享

建快照前需要用allowSnapShot命令指定允許做快照的目錄:

技術分享

這個目錄下有一個文件:

技術分享

開始新建快照,取名為clcshot1:

技術分享

在目錄下有一個.snapshot的文件夾,裏面有針對該目錄的所有快照,每個目錄下都存有當前快照的目錄:

技術分享

往一個文件裏append數據,更改文件的內容:

技術分享

文件大小發生了更改:

技術分享

快照文件夾中還是原始大小,說明hdfs為更改文件開辟了新的空間。

技術分享

嘗試刪除創建快照的目錄:

技術分享

刪除失敗,想要刪除該目錄,需要將快照都刪除。

再創建一個snapshot:

技術分享

在namenode首頁上可以看到整個hdfssnapshot的信息:

技術分享

比較同一個目錄下不同版本快照的區別,用命令snapshotDiff:

技術分享

1.2 快照數據恢復

清空/tmp/caolch/中的數據,可以用任何一個快照版本進行恢復。

恢復命令就是簡單的cp。

首先清空/tmp/caolch下的所有文件。

技術分享

然後將快照中的數據cp到需要恢復的目錄。

技術分享

註意,mv命令和del命令是不允許的,因為快照是只讀的。

2.Hbase的基於快照的表修復

Hdfs的快照同樣適用於hbase表的恢復。在hbase的數據表目錄/hbase/data/default/(default為默認namespace空間)中新建快照,就會在該目錄下生成.snapshot的文件夾,裏面放著針對該目錄的所有快照。

技術分享

如果存在用戶誤刪hbase表,

技術分享

將快照中保存的數據表文件夾cp到/hbase/data/default下,然後執行如下命令,修復元數據即可。

技術分享

註意:cp到/hbase/data/default目錄下的數據表文件夾的權限要修改成hbase:hbase。

否則修改元數據的命令會失敗。

技術分享

上面是對整個hbase的namespace空間進行的快照備份,如果在某一個表目錄下建快照,那麽這個表目錄就會變成只讀,在hbase shell中執行disable+drop <tablename>不會將表刪除,在建快照之後新增的表數據也不會丟失。

雖然數據不會丟失但是元數據會被drop命令刪除,還得用repair命令進行修復。

技術分享

修復完之後,再enable這個表,就ok了。


來源: http://lib.csdn.net/article/hbase/43748

HDFS的快照原理和Hbase基於快照的表修復