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
hlog
最核心的是呼叫
dowrite
的方法,任何對資料改動的操作都就將首先呼叫這個方法。
出於效能考慮,
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 修指甲 別亂想,博...