[原]HBase Snapshot- 2 -Snapshot源碼分析

作者:clark010
出處:http://www.lxweimin.com/u/f9af3f199145
版權:本文版權歸作者所有
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任


Snapshot過程不涉及到底層數據文件的移動和拷貝,中間只會對當前snapshot所引用的文件做meta記錄,生成對應的data.manifest文件,并且SnapshotFileCache會通過freshCache更新被snapshot引用的文件到cache中,這樣后臺的清理線程就不會將hfile清理掉,以便于后面restore恢復。
因為涉及到對一個表的所有region做snapshot操作,本質上是一個分布式操作,HBase底層實現了一套Procedure機制支持分布式任務(包括snapshot、balance、mem flush等)??蛻舳苏埱驧aster對某一個表做snapshot,Master通發布snapshot任務到zk上并等待所有RS完成,RS接受并處理請求到最終完成請求,Master收集結果并返回最終結果給客戶端。
下面會分別分析一下Client、Master、RegionServer的代碼實現


Client

  1. Client調用HBaseAdmin的snapshot接口發起snapshot請求
    • SnapshotDescription數據結構中最主要的是snapshot_name/table_name/type,其中type為enum類型,有三個常量:DISABLED/FLUSH/SKIPFLUSH,指定三種做snapshot的方式,第一個是對disabled的表做snapshot,后兩個是對enable的表的操作,FLUSH是snapshot之前先flush內存,SKIPFLUSH不需要flush內存
  • 調用taskSnapshotAsync,向master異步提交一個snapshot請求
  • 拿到response,循環等待snapshot完成,如果超過最大的timeout時間則拋SnapshotCreationException異常并退出,但是實際上snapshot可能還在做,并最終成功

Master

  1. master端接收到client端的snapshot rpc請求,調用snapshotManagertakeSnapshot實際處理snapshot請求,taskSnapshot也是異步的處理邏輯,所以很快返回
  • 再看SnapshotManagertakeSnapshot中的邏輯
    • 判斷是否已經做過snapshot


    • 觸發pre snapshot coprocessor邏輯


    • 判斷是enabled的表還是disabled的表,對于disabled的表直接通過master做snapshot,而enabled的表則需要有RS實際完成snapshot過程,下面分別看一下兩個路徑的實現


      • disabled表snapshot
        • 首先prepareToTabkeSnapshot,判斷是否正在做snapshot或者在restore過程,如果是則直接異常退出,否的話繼續。然后清理并創建workingDir(/<hbase-root>/.hbase-snapshot/.tmp/<snapshot-name>)
        • 重置SnapshotDescription的type為DISABLED
        • 構造TableSnapshotHandler,其中創建SnapshotManifest對象以及snapshot表的寫鎖(在prepare中aquire)
        • 調用snapshotTable
          • handler prepare,對表加寫鎖,加載table的description信息
          • 將handler提交線程池分配線程執行
          • 將handler加入到snapshotHandler
        • ok再進入table snapshot handler中看一下process執行邏輯
          • 首先創建了兩個文件,.inprogress標志文件、.snapshot-info寫入本次Snapshot的desc信息


          • 請求得到表的所有region信息,并對所有region進行同步的snapshot(snapshotRegions接口邏輯在[Enabled|Disabled]TableSnapshotHandler中實現)
            • 進入DisabledTableSnapshotHandler中看一下snapshotRegions的接口實現
            • 實際通過snapshotManifest調用了region的snapshot,每個region也會在workingDir下臨時生成每個region的manifest文件
            • manifest addRegion
              1. 創建ManifestBuilder
              2. 將region信息寫入manfiest
              3. 將family信息寫入manifest
              4. 將當前region的所有store file寫入manifest
              5. 最終調用regionClose將manifest內容寫出到文件中
            • 看一下store file寫入manifest的邏輯,主要保存了file的name和size,如果是reference文件,則set reference標志
              • reference文件會在split過程產生,在實際hfile沒有split完成時邏輯表示一個region的hfile
          • 所有region的snapshot結束后,做了三件事
            • snapshotManifest內容寫出到data.manifest文件
            • 驗證region snapshot(防止region的遷移等情況),如果不一致需要failed掉
            • 將snapshot數據從.tmp路徑移動到正式路徑(.hbase-snapshot)下


          • 到這里disabled表的snapshot流程就完成了
      • enabled表snapshot
        • enabled表的snapshot過程的代碼調用路徑和disabled的情況基本一致,只是在TableSnapshotHandlersnapshotRegions接口的實現不一樣,下面直接從這個函數入口分析一下enabled table,對于其他的流程調用參考disabled的情況
        • 可以看到enabled表通過ProcedureCoordinator提交了一個Procedure任務,然后就waitForCompleted
        • 在這里不具體講Procedure的邏輯,我們只需要大概的知道,hbase master通過zk和region server做交互(具體對應ZKProcedureCoordinatorRpcs實現),master在zk上創建具體任務的aquire根節點,并對table所有Region的RegionServer創建一個對應的znode節點并watch此node,而RegionServer上有對應的watcher(ZKProcedureMemberRpcs)發現有任務就領取,處理結束后通過zk通知完成

RegionServer

通過前面的代碼分析,我們知道disabled表的snapshot直接在master端完成,而enabled表的snapshot需要RS參與并實際執行snapshot邏輯,下面分析一下snapshot在RS端的實現邏輯,同樣Procedure部分的代碼部分省略

  • 首先RS接收到任務后,會先create一個SubProcedure

  • 判斷type類型是否需要flush內存,但是貌似flush和skipflush的代碼一樣,具體在FlushSnapshotSubprocedure中判斷
  • 進入FlushSnapshotSubprocedurecall方法,首先調用region的startRegionOperation方法,對region加鎖防止數據的更新,然后判斷是否需要flush內存,最后調用HRegion的addRegionToSnapshot方法執行實際的邏輯
  • 進入addRegionToSnapshot方法,發現最后處理邏輯也是調用了SnapshotManifest的addRegion方法,這和Disabled表的邏輯就匯合一致了,其實EnabledTableSnapshot要分布式的通過RS完成還是為了對region加鎖的一個操作……

結語

OK,到這里基本Snapshot的整個流程就分析完了,雖然沒有詳細到分析到具體data.manifest文件的格式,但是主要把握住大的邏輯,小邏輯就靠后面細細的看代碼了,也許后面有精力也會單獨加一章分析data.manifest的格式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容