HBase 預寫日誌 WAL

2021-08-31 22:01:22 字數 2154 閱讀 3706

wal

最重要的作用是災難恢復,一旦伺服器崩潰,通過重放

log,我們可以恢復崩潰之前的資料。如果寫入

wal失敗,整個操作也將認為失敗。

圖6wal

基本流程:首先,客戶端初始化乙個可能對資料改動的操作,如put(put),delete(delete) 和incrementcolumnvalue()。這些操作將被封裝在乙個keyvalue物件例項中,傳送給hregionserver。一旦達到一定大小,hregionserver 將其傳送給hregion。這個過程中,資料會首先會被寫入wal,之後將被寫到實際存放資料的memstore中。

hlog是實現wal的類。乙個hregionserver對應乙個hlog例項。當hregion初始化時,hlog將作為乙個引數傳給hregion的建構函式。

wal中幾個重要的類:

1.

hlog

出於效能考慮,put(), delete() 和incrementcolumnvalue()可通過開關函式setwritetowal (boolean) 禁用wal。執行mapreduce job時,可通過關閉wal獲得效能提公升。

hlog

另乙個重要特性是將通過

sequence number

追蹤資料改變。它內部使用

atomiclong

保證執行緒安全。

2.

hlogkey

上一部分的儲存格式中有提到,hlogkey包含的一些主要變數,主要用於記錄key/value對的歸屬資訊。

3.

logflusher

資料以keyvalue形式到達hregionserver,將寫入wal,之後寫入乙個sequencefile。由於資料流在寫入檔案時經常會快取以提高效能,因此,有時資料實際儲存在記憶體中。

logflusher呼叫hlog.optionalsync(),後者根據hbase. regionserver. optionallogflushinterval (預設10秒)定期呼叫hlog.sync()。hlog.dowrite()也根據hbase.regionserver.flushlogentries(預設100秒)定期呼叫hlog.sync()。sync() 本身呼叫hlog.writer.sync(),它由sequencefilelogwriter實現。

4.

logroller

log的大小通過$hbase_home/conf/hbase-site.xml 的hbase.regionserver.logroll.period限制,預設是乙個小時。所以每60分鐘,會開啟乙個新的log檔案。久而久之,會有一大堆的檔案需要維護。logroller主要完成日誌的清理。

首先,logroller呼叫hlog.rollwriter(),定時滾動日誌,之後,利用hlog.cleanoldlogs()可以清除舊的日誌。它首先取得儲存檔案中的最大的sequence number,之後檢查是否存在乙個log所有的條目的」sequence number」均低於這個值,如果存在,將刪除這個log。

5.

replay

舊日誌往往由

regionserver 

崩潰產生。當

hmaster

啟動或者檢測到

regionserver 

崩潰,它將日誌檔案拆分為多份檔案,儲存在

region

所屬的資料夾。之後,將日誌重放。

重放過程:

hregionserver

啟動,開啟所管轄的

region

,檢查是否存在剩餘的

log檔案,如果存在,呼叫

store.doreconstructionlog()

。重放乙個日誌只是簡單地讀入乙個日誌,將日誌中的條目加入到

memstore

中。最後,

flush

操作將memstore

中資料flush

到硬碟中。

HBase 預寫日誌 WAL

wal 最重要的作用是災難恢復,一旦伺服器崩潰,通過重放 log,我們可以恢復崩潰之前的資料。如果寫入 wal失敗,整個操作也將認為失敗。圖6 wal 基本流程 首先,客戶端初始化乙個可能對資料改動的操作,如put put delete delete 和 incrementcolumnvalue 這...

HBase 預寫日誌 WAL

wal最重要的作用是災難恢復,一旦伺服器崩潰,通過重放 log,我們可以恢復崩潰之前的資料。如果寫入 wal失敗,整個操作也將認為失敗。圖6wal 基本流程 首先,客戶端初始化乙個可能對資料改動的操作,如 put put delete delete 和incrementcolumnvalue 這些操...

預寫日誌 WAL 介紹

預寫日誌 wal,write ahead log 是關係型資料庫中用於實現事務性和永續性的一系列技術。簡單來說就是,做乙個操作之前先講這件事情記錄下來。為什麼要使用wal呢?比如你的備忘錄裡面有如下記錄 2015.12.25 理髮 2015.12.28 整容 2015.12.31 修指甲 別亂想,博...