HBase1.x進階:數據表(不只數據)誤刪除,快速恢復(已生產實踐)

如果您覺得“大數據開發運維架構”對你有幫助,歡迎轉發朋友圈



作為Hadoop集群維護人員,經常誤操作直接將HBase表數據誤刪除,生產數據肯定是不能直接刪除的,下面我詳細給大家演示下,如何快速恢復誤刪除的表:


為方便大家理解,我先講一下HBase在hdfs上的目錄結構,先看下面這張圖:

HBase1.x進階:數據表(不只數據)誤刪除,快速恢復(已生產實踐)

一共9個目錄和2個文件:

目錄:

1.hbase-snapshot

如果hbase開啟了快照,用戶對一個數據表建立快照table_snapshot1,則hbase會在這個目錄下新建一個文件夾table_snapshot1。

2. .hbck

這個hbase hbck 相關的集群修復命令的一個臨時緩存目錄。

3. .tmp

臨時目錄,用戶創建、刪除表的時候的,會用到這個臨時目錄4.MasterProcWALs

目錄下有一個狀態文件,記錄管理操作日誌記錄文件,比如解決衝突的服務器,表創建和其它DDLs等操作到它的WAL文件中,這個WALs存儲在MasterProcWALs目錄下,它不像RegionServer的WALs,HMaster的WAL也支持彈性操作,就是如果Master服務器掛了,其它的Master接管的時候繼續操作這個文件。

5.WALs

HLog預寫日誌文件

6.archive

存儲表的歸檔和快照,HBase 在做 Split或者 compact 操作完成之後,會將 HFile 移到archive 目錄中,然後將之前的 hfile 刪除掉,該目錄由 HMaster 上的一個定時任務定期去清理。

7.corrupt

損壞的日誌文件

8.data

HBase表數據

9.oldWALs

當WALs中的日誌文件不再需要時,會先放到這個目錄下,等待清理。

文件:

  1. hbase.id它是一個文件,存儲集群唯一的 cluster id 號,是一個 uuid。
  2. hbase.versionhbase.version記錄了hbase的版本,是一個二進制文件。


1.直接刪除HBase表數據在HDFS上的目錄

如果你直接從hdfs上刪除了數據,由於hdfs每個用戶都有個回收站目錄:/user/$/.Trash/,刪除後可從回收站直接恢復即可,這個比較簡單。

HBase1.x進階:數據表(不只數據)誤刪除,快速恢復(已生產實踐)

hadoop的回收站是在我們刪除數據後能恢復的目錄,但是我們並不希望在回收站保存太久的數據,我們可以使用如下參數進行配置。


參數介紹:

1).fs.trash.interval=0

以分鐘為單位的垃圾回收時間,垃圾站中數據超過此時間,會被刪除。如果是0,垃圾回收機制關閉。

可以配置在服務器端和客戶端。

如果在服務器端配置trash無效,會檢查客戶端配置。如果服務器端配置有效,客戶端配置會忽略。

建議開啟,建議4320(3天)

垃圾回收站,如有同名文件被刪除,會給文件順序編號,例如:a.txt,a.txt(1)


2).fs.trash.checkpoint.interval=0


以分鐘為單位的垃圾回收檢查間隔。應該小於或等於fs.trash.interval。如果是0,值等同於fs.trash.interval。每次檢查器運行,會創建新的檢查點。


建議設置為60(1小時)


2.通過disable+drop刪除了HBase的數據表


這裡用表testTable1演示數據恢復過程:


a).登錄hbase shell中查看錶中有兩條數據:

<code>hbase(main):004:0> scan 'testTable1'ROW                                    COLUMN+CELL                                                                                                     row001                                column=info1:col1, timestamp=1581149494656, value=value1                                                        row001                                column=info1:col2, timestamp=1581149504948, value=value2                                                       1 row(s) in 0.0330 seconds/<code>

原來表的存儲目錄是:/apps/hbase/data/data/default/testTable1


b).用disable+drop刪除表

<code>hbase(main):005:0* disable 'testTable1'0 row(s) in 2.3000 seconds​hbase(main):006:0> drop 'testTable1'0 row(s) in 1.2510 seconds/<code>

c).在hbase的歸檔目錄archive下可查看已刪除的數據

<code>[hbase@master98 ~]$ hadoop fs -ls /apps/hbase/data/archive/data/defaultFound 2 itemsdrwxr-xr-x   - hbase hdfs          0 2019-11-10 15:34 /apps/hbase/data/archive/data/default/test12drwxr-xr-x   - hbase hdfs          0 2020-02-08 15:47 /apps/hbase/data/archive/data/default/testTable1/<code>

d).由於這個數據是有保存時間的(這個保存時間恢復完數據後下面我專門講解),先將已刪除額testTable1的數據拷貝到/tmp下備份,以防hbase自身定時任務清理掉。

<code>[hbase@master98 ~]$ hadoop fs -ls /tmp/defaultFound 2 itemsdrwxr-xr-x   - hbase hdfs          0 2020-02-08 15:51 /tmp/default/test12drwxr-xr-x   - hbase hdfs          0 2020-02-08 15:51 /tmp/default/testTable1/<code>

e).新建同名、同列族的表testTable1,這時testTable1會在hdfs上重新有一個目錄,下面共3個子目錄:

<code>hbase(main):002:0> ^C[hbase@master98 ~]$ hadoop fs -ls  /apps/hbase/data/data/default/testTable1Found 3 itemsdrwxr-xr-x   - hbase hdfs          0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/.tabledescdrwxr-xr-x   - hbase hdfs          0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/.tmpdrwxr-xr-x   - hbase hdfs          0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/7688ca7556d73db2d8ba69128da544f8/<code>


f).將備份的數據拷貝到新的testTable1表在hbase的存儲目錄下,不要拷貝整個目錄,只拷貝/tmp/testTable1/*下的region數據目錄,這時新testTable1表下面就會多了一個region數目目錄,這時共4個子目錄,如下:

<code>#拷貝命令一定不要出錯[hbase@master98 ~]$ hadoop fs -cp /tmp/testTable1/dd4adf04aea66bd5912275e577f2ef6a  /apps/hbase/data/data/default/testTable1/​[hbase@master98 ~]$ hadoop fs -ls  /apps/hbase/data/data/default/testTable1Found 4 itemsdrwxr-xr-x   - hbase hdfs          0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/.tabledescdrwxr-xr-x   - hbase hdfs          0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/.tmpdrwxr-xr-x   - hbase hdfs          0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/7688ca7556d73db2d8ba69128da544f8drwxr-xr-x   - hbase hdfs          0 2020-02-08 16:20 /apps/hbase/data/data/default/testTable1/dd4adf04aea66bd5912275e577f2ef6a/<code>

h).這時候你去查詢hbase數據的時候是看不到數據的,因為在hbase的元數據表.meta中並沒有原來那個region的元數據信息,需要進行修復:

<code>hbase(main):001:0> scan 'testTable1'ROW                                    COLUMN+CELL                                                                                                    0 row(s) in 0.2490 seconds/<code>


i).表修復,切換到hbase管理員用戶:su - hbase,執行hbase hbck相關命令進行修復,具體該執行哪個命令要根據hbase hbck的報錯信息進行修復,hbse hbck修復命令:

<code>1. 檢查輸出所以ERROR信息,每個ERROR都會說明錯誤信息。hbase hbck2. 先修復tableinfo缺失問題,根據內存cache或者hdfs table 目錄結構,重新生成tableinfo文件。hbase hbck -fixTableOrphans3. 修復regioninfo缺失問題,根據region目錄下的hfile重新生成regioninfo文件hbase hbck -fixHdfsOrphans4. 修復region重疊問題,merge重疊的region為一個region目錄,並從新生成一個regioninfohbase hbck -fixHdfsOverlaps5. 修復region缺失,利用缺失的rowkey範圍邊界,生成新的region目錄以及regioninfo填補這個空洞。hbase hbck -fixHdfsHoles6.修復meta表信息,利用regioninfo信息,重新生成對應meta row填寫到meta表中,併為其填寫默認的分配regionserverhbase hbck -fixMeta7. 把這些offline的region觸發上線,當region開始重新open 上線的時候,會被重新分配到真實的RegionServer上 , 並更新meta表上對應的行信息。hbase hbck -fixAssignments/<code> 


我首先執行了hbase hbck檢查了集群整體狀態,報錯表testTable1缺少元數據信息,需要執行hbase hbck -fixMeta 進行修復,如果修復失敗,可依次嘗試fixHdfsOrphans,fixTableOrphans,fixMeta,fixAssignments參數進行修復:

HBase1.x進階:數據表(不只數據)誤刪除,快速恢復(已生產實踐)


修復多執行幾次,直到再次執行hbase hbck顯示下圖時,說明修復成功,表數據可查詢:

<code>0 inconsistencies detected.Status: OK/<code>

去hbase shell中驗證一把,數據可查詢,至此修復成功:

<code>​hbase(main):001:0> scan 'testTable1'ROW                                    COLUMN+CELL                                                                                                     row001                                column=info1:col1, timestamp=1581149494656, value=value1                                                        row001                                column=info1:col2, timestamp=1581149504948, value=value2                                                       1 row(s) in 0.3030 seconds/<code>


上面涉及到了幾個知識點,我再給大家詳細說一下:


HBase的數據主要存儲在分佈式文件系統HFile和HLog兩類文件中。Compaction操作會將合併完的不用的小Hfile移動到<.archive>文件夾,並設置ttl過期時間。HLog文件在數據完全flush到hfile中時便會過期,被移動到.oldlog文件夾中。/<.archive>

HMaster上的定時線程HFileCleaner/LogCleaner週期性掃描.archive目錄和.oldlog目錄, 判斷目錄下的HFile或者HLog是否可以被刪除,如果可以,就直接刪除文件。


關於hfile文件和hlog文件的過期時間,其中涉及到兩個參數:

(1)hbase.master.logcleaner.ttl

HLog在.oldlogdir目錄中生存的最長時間,過期則被Master的線程清理,默認是600000(ms);

(2)hbase.master.hfilecleaner.plugins:

HFile的清理插件列表,逗號分隔,被HFileService調用,可以自定義,默認org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner。


(3) hbase.master.logcleaner.ttl:

默認hfile的失效時間是5分鐘,在主region發生compaction之後,被compact掉的文件會放入Archieve文件夾內,超過hbase.master.hfilecleaner.ttl時間後,文件就會被從HDFS刪除掉。而此時,可能replica region正在讀取這個文件,這會造成用戶的讀取拋錯返回。如果不想要這種情況發生,就可以把這個參數設為一個很大的值,比如說3600000(一小時),總沒有讀操作需要讀一個小時了吧?


實際在測試的過程中,刪除一個hbase表,在hbase的hdfs目錄下的archive文件夾中,會立即發現刪除表的所有region數據(不包含regioninfo、tabledesc等元數據文件),等待不到6分鐘所有數據消失,說明所有數據生命週期結束,被刪除。在hfile聲明週期結束到被發現刪除中間間隔不到一分鐘。


分享到:


相關文章: