這篇文章將為大家詳細講解有關(guān)HBase快照有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計、網(wǎng)站制作與策劃設(shè)計,蒸湘網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:蒸湘等地區(qū)。蒸湘做網(wǎng)站價格咨詢:18982081108
什么是快照
快照就是一份元信息的合集,允許管理員恢復到表的先前狀態(tài),快照不是表的復制而是一個文件名稱列表,因而不會復制數(shù)據(jù)。
完全快照恢復是指恢復到之前的“表結(jié)構(gòu)”以及當時的數(shù)據(jù),快照之后發(fā)生的數(shù)據(jù)不會恢復??煺站褪且幌盗性獢?shù)據(jù)信息集合,能夠允許管理員將表恢復至生成快照時的狀態(tài)。快照不是表的復制,最簡單的方式就是把它想象成為了追蹤元數(shù)據(jù)(表信息和域)和數(shù)據(jù)(HFiles, 內(nèi)存存儲, WALs)一系列操作的集合,在生成快照操作中沒有執(zhí)行任何復制數(shù)據(jù)的動作。
離線快照:討論快照的最簡單的場景就是當一張表被關(guān)閉了。關(guān)閉一張表意味著所有的數(shù)據(jù)都寫入了磁盤,而且不允許任何讀寫操作。在這種情況下,生成快照僅僅就是獲取表元數(shù)據(jù)并且與磁盤中的HFiles保持關(guān)聯(lián)。主節(jié)點執(zhí)行操作需要的時間,主要取決于HDFS的namenode提供文件列表需要的時間。
在線快照:在大部分情況下,表都是開啟的,而且每個域服務(wù)器都不斷的處理put和get請求。在這種情況下,主節(jié)點接收到快照請求并要求每個域服務(wù)器都為其負責的域生成一份快照。
主節(jié)點和域服務(wù)器之間的通信是通過Apache ZooKeeper的,使用了類似兩階段提交事務(wù)。主節(jié)點建立一個“準備快照”的znode。每個域服務(wù)器會處理請求,并且為指定的表在其負責范圍內(nèi)的域準備快照。一旦準備完成,就會在準備請求的znode下建立一個子節(jié)點,意味著“準備完成”。
一旦所有域服務(wù)器都回報了他們的狀態(tài),主節(jié)點就建立另一個znode表示“提交快照”;每個域服務(wù)器會完成快照并在加入節(jié)點前報告狀態(tài)。一旦所有域服務(wù)器都回報完成,主節(jié)點會完成快照并標記操作完成。若某個域服務(wù)器報告失敗,主節(jié)點會新建znode來廣播放棄信息。當域服務(wù)器繼續(xù)處理新請求時,不同的用例情況下可能需要不同的一致性模型。例如有人可能對不包含內(nèi)存中最新數(shù)據(jù)的不完全的快照感興趣,而有的人希望鎖定寫操作來獲得一份完全保證一致性的快照以及其他可能性。
因此在域服務(wù)器上生成快照的程序是可拔插的?,F(xiàn)在唯一的實現(xiàn)是“Flush Snapshot”,就是在生成快照之前進行寫入操作(flush)來保證列一致性,其他的使用不同的一致性策略的程序可能會在未來實現(xiàn)。在線生成快照需要的時間取決于實施快照操作并且將成功狀態(tài)回報給主節(jié)點最慢的域服務(wù)器,這樣的操作差不多在數(shù)秒之內(nèi)完成。
快照的作用
HBase中存在的備份或克隆表的方法就是使用復制/導出表或者在關(guān)閉表之后拷貝HDFS中的所有HFile。復制或?qū)С鍪峭ㄟ^一系列工具調(diào)用MapReduce來掃描并復制表,這樣會對RegionServer有直接的影響。關(guān)閉表會停止所有的讀寫操作,實際環(huán)境中往往無法接受。
相比之下HBase快照允許管理員不拷貝數(shù)據(jù),而直接克隆一張表,這對域服務(wù)器產(chǎn)生的影響最小。將快照導出至其他集群不會直接影響到任何服務(wù)器;導出只是帶有一些額外邏輯的群間數(shù)據(jù)同步。
快照優(yōu)勢
導出快照與復制/導出表除了更好地保持一致性外,主要的不同在于導出快照是在HDFS的層面操作的。這意味著HMaster和域服務(wù)器與操作無關(guān)。因此不需要為不必要的數(shù)據(jù)創(chuàng)建緩存空間,也不會有掃描過程。因為大量對象創(chuàng)建引起的GC暫停,對于HBase 來說主要性能影響就是DataNode額外的網(wǎng)絡(luò)和磁盤負載。
應(yīng)用場景
從用戶/應(yīng)用異常中還原
從一個已知的安全狀態(tài)恢復/還原
查看之前的快照并有選擇性的合并不同寫入產(chǎn)品環(huán)境
當主應(yīng)用程序升級或改版時保存快照。
在指定時間審查和/或報告數(shù)據(jù)。
按照規(guī)定捕獲月度數(shù)據(jù)
生成日終/月末/季末報告
應(yīng)用測試
通過快照模擬生產(chǎn)環(huán)境下結(jié)構(gòu)或應(yīng)用發(fā)生的變化,測試完成即可丟棄。例如:生成快照,利用快照中內(nèi)容構(gòu)建新表(原有結(jié)構(gòu)+數(shù)據(jù))并且修改新表的結(jié)構(gòu),添加或刪除列之類。(原始表、快照和新表保持相互獨立)
減少工作壓力
生成快照,導入到其他集群,然后運行MapReduce jobs。因為導出的快照是HDFS級別,所以不會像復制表那樣降低HBase主集群的效率。
理解HBase表
HBase表包含一系列元數(shù)據(jù)信息和鍵值對集合。
表信息:一份描述“設(shè)置”的清單文件,如列族,壓縮類型與編碼,布隆(bloom)過濾器類型等。
域:表“分區(qū)”稱之為域。每個域都通過定義起始鍵和終止鍵來負責管理一份連續(xù)的鍵值集合。
WALs/MemStore:在數(shù)據(jù)寫入磁盤之前,put會先寫到寫前日志(Write Ahead Log – WAL)然后保存在內(nèi)存中,直到內(nèi)存壓力觸發(fā)寫入磁盤。WAL為恢復那些因為異常沒有寫入磁盤的put操作提供了一個簡單的方式。
HFiles:某些時候所有數(shù)據(jù)都寫入了磁盤。HFile就是HBase存儲鍵值對的文件格式,HFile是不變的,但是當合并或域刪除時可以被刪除掉。
快照操作
生成快照:
本操作嘗試對指定表生成快照。如果集群在執(zhí)行數(shù)據(jù)均衡、分隔或合并等操作時,可能會引起操作失敗。
克隆快照:
本操作使用與指定快照相同的結(jié)構(gòu)數(shù)據(jù)構(gòu)建一張新表。操作結(jié)果會生成一張有完整功能的表,對該表的任意修改不會對原表或快照產(chǎn)生影響。
還原快照:
本操作將表結(jié)構(gòu)和數(shù)據(jù)恢復到生成快照時的狀態(tài)。(注意:本操作會舍棄快照生成后任何改變)。
刪除快照:
本操作將系統(tǒng)中的快照刪除,釋放未共享的磁盤空間, 而且不會影響其他克隆或快照。
導出快照:
本操作將快照數(shù)據(jù)和元數(shù)據(jù)復制到其他集群。操作只會涉及HDFS,不會與HMaster或RegionServer產(chǎn)生任何聯(lián)系,因此HBase集群可以關(guān)閉。
目前的限制
快照需要依賴一些條件,目前有一些工具還沒有很好的整合新特性:
合并引用快照的集群會引起快照和克隆表的數(shù)據(jù)丟失。
當復制開啟時還原一個表,會造成兩個集群不同步,表不會在復制集上還原。
通過檢查hbase-site.xml中的hbase.snapshot.enabled是否設(shè)置為true確認打開了快照許可。HBase以往數(shù)據(jù)的備份基于distcp或者copyTable等工具,這些備份機制或多或少對當前的online數(shù)據(jù)讀寫存在一定的影響,snapshot提供了一種快速的數(shù)據(jù)備份方式,無需進行數(shù)據(jù)copy。
Snapshot操作類型包括在線和離線的
離線方式是disabletable,由HBase Master遍歷HDFS中的table metadata和hfiles,建立對他們的引用。
基于snapshot文件,可以做clone一個新表,restore,export到另外一個集群中操作;其中clone生成的新表只是增加元數(shù)據(jù),相關(guān)的數(shù)據(jù)文件還是復用snapshot指定的數(shù)據(jù)文件。參見clone新表操作示意圖:
snapshot參考指令
1、獲取指定表的快照使用snapshot命令(不產(chǎn)生文件復制)
hbase>snapshot 'tableName','snapshotName'
2、列出所有的快照,使用list_snapshot命令。會展示出快照名稱,源表,以及創(chuàng)建日期和時間
hbase>list_snapshots
3、刪除快照使用deleted_snapshot命令。刪除快照不會影響到克隆表或者之后生成的快照。
hbase>delete_snapshot 'snapshotName'
4、使用clone_snapshot命令從指定的快照生成新表(克隆)。由于不會產(chǎn)生數(shù)據(jù)復制,所以最終用到的數(shù)據(jù)不會是之前的兩倍。
hbsse>clone_snapshot 'snapshotName','newTableName'
5、使用restore_snapshot命令將指定快照內(nèi)容替換當前表結(jié)構(gòu)或數(shù)據(jù);
hbase>restore_snapshot 'snapshotName'
用快照恢復數(shù)據(jù),它需要先禁用表,再進行恢復
hbase>disable 'myTable'
hbase>restore_snapshot 'myTableSnapshot-122112'
提示:因為備份(replication)是系統(tǒng)日志級別的,而快照是文件系統(tǒng)級別的,當使用快照恢復之后,副本會和master出于不同的狀態(tài),如果你需要使用恢復的話,你要停止備份,并且重置bootstrap。如果是因為不正確的客戶端行為導致數(shù)據(jù)丟失,全表恢復又需要表被禁用,可以采用快照生成一個新表,然后從新表中把需要的數(shù)據(jù)用map-reduce拷貝到主表當中。
6、使用ExportSnapshot工具將現(xiàn)有快照導出至其他集群。導出工具不會影響到域服務(wù)器負載,只是工作在HDFS層面,所以需要指定HDFS路徑(其他集群的hbase根目錄)。該操作要用hbase的賬戶執(zhí)行,并且在hdfs當中要有hbase的賬戶建立的臨時目錄(hbase.tmp.dir參數(shù)控制)
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshotName -copy-to hdfs :///hbfreeoa2:8082/hbase
采用16個mappers來把一個名為MySnapshot的快照復制到一個名為hbfreeoa2的集群當中
hbase class org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://hbfreeoa2:8020/hbase -mappers 16
零復制快照、恢復、克隆
快照和復制/導出表之間的主要差異是快照操作只寫入元數(shù)據(jù),不涉及海量數(shù)據(jù)。HBase的主要設(shè)計原則之一就是一旦文件寫入就不再修改。文件不可變意味著快照只需保持對快照產(chǎn)生時存在的文件追蹤,并且在壓縮時負責提示系統(tǒng)該文件不應(yīng)刪除而是應(yīng)當歸檔保存。
同樣的原則也適用于克隆和恢復操作。因為文件是不變的,新建一個表只需要通過快照“鏈接”到文件引用即可。導出快照是唯一需要復制數(shù)據(jù)的操作,因為其他集群沒有數(shù)據(jù)文件。
導出快照與復制/導出表
導出快照與復制/導出表除了更好地保持一致性外,主要的不同在于導出快照是在HDFS的層面操作的。這意味這Master和域服務(wù)器與操作無關(guān)。因此不需要為不必要的數(shù)據(jù)創(chuàng)建緩存空間,也不會有掃描過程因為大量對象創(chuàng)建引起的GC暫停。對于HBase來說主要性能影響就是DataNode額外的網(wǎng)絡(luò)和磁盤負載。
從快照中克隆表
當管理員執(zhí)行克隆操作時,按快照中的表結(jié)構(gòu)建立了新表并按快照域信息中的開始/結(jié)束鍵分割。一旦表元數(shù)據(jù)建立,能夠像快照使用的方式一樣而不用拷入數(shù)據(jù)。因為HFiles是不可變的只是對建立的源文件的引用,這樣就避免了數(shù)據(jù)拷貝并允許克隆能夠修改而不影響源表或鏡像??寺〔僮魇怯芍鞴?jié)點執(zhí)行的。
從快照中恢復表
恢復操作與克隆操作相似。你可以把它想象成時刪除表之后再從快照中克隆出來。恢復操作會恢復快照中的老數(shù)據(jù)并刪除快照中不存在的數(shù)據(jù),表結(jié)構(gòu)也會恢復到與快照相同。在底層,恢復操作時通過比較表狀態(tài)與快照間不同來實現(xiàn)的,移除快照中不存在的文件并加上快照中有而當前表狀態(tài)中沒有的文件關(guān)聯(lián)。同樣的表結(jié)構(gòu)也被修改至快照生成時刻的狀態(tài)?;謴筒僮魇怯芍鞴?jié)點執(zhí)行并且表要處于關(guān)閉狀態(tài)。
關(guān)于“HBase快照有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。