總結一下HBase各種級別的鎖以及對讀寫的阻塞

2021-06-23 05:41:44 字數 1403 閱讀 1691

**:

為了保證併發操作時資料的一致性和效能,hbase中應用了各種各樣高效的可重入鎖,包括行級別的rowlock、mvcc,region級別的讀寫鎖,store級別的讀寫鎖,memstore級別的讀寫鎖等等。

1、  行級別的鎖rowlock

hbase中為了解決行級別在併發操作中的一致性問題,採用了rowlock機制。保證只有同乙個執行緒同時對該行做操作。當然rowlock有lease租約的概念,超過期限,自動釋放該行鎖

2、  mvcc

處於併發效能的考慮,rowlock只在write資料時採用,對於讀寫併發操作,hbase採用了mvcc解決方案。

基本原理是writer操作會經過wal、memstore等一系列過程,首先在rowlock操作後,立即分配乙個writer number,每個cf column cell在store中都會帶上這個writer number,在寫操作結束即release lock前,會標記writer number已經結束;每個讀操作在開始時(readpoint)會分配最大的處於結束的writer number,即最新的處於結束的writer number(memstore中的值可用存在寫操作未結束的,這些值不可以讀,所以在flush cache的時候必須等待memstore中所有的值都是寫結束的)。詳細的mvcc分析可以參見以前寫的blog:

3、  region級別的鎖

在做更新操作時,需要判斷資源是否滿足要求,如果到達臨界點,則申請進行flush操作,等待直到資源滿足要求(參見region中的checkresource)

region update更新鎖(updateslock),在internalflushcache時加寫鎖,導致在做put、delete、increment操作時候阻塞(這些操作加的是讀鎖)。

region close保護鎖(lock),在region close或者split操作的時(加寫鎖),阻塞對region的其他操作(加讀鎖),比如compact、flush、scan和其他寫操作。

4、  store級別的鎖

flush過程包括,

a 、prepare(基於memstore做snapshot)

b、flushcache(基於snapshot生成臨時檔案)

c、commit(確認flush操作完成,rename臨時檔案為正式檔名稱,清除mem中的snapshot)

其中在flush過程的commit階段,compact過程的completecompaction階段(rename臨時compact檔名、清理舊的檔案),close store(關閉store),bulkloadhfile,會阻塞對store的寫操作。

5、  memstore級別的鎖

對store的寫操作會呼叫memstore的相關操作,在對memstore做snapshot以及清除snapshot的時候會阻塞其他操作(如add、delete、getnextrow)。

總結一下各種0 5px的線

在pc端用1px的邊框線,看起來還好,但在手機端看起來就很難看了,而0.5px的分割線會有種精緻的感覺。用普通寫法border solid 0.5px red iphone可以正常顯示,android下幾乎所有的瀏覽器都會把0.5識別為0,即無邊框狀態.原理就是給需要加邊框的元素插入乙個偽類,偽類採...

稍微總結一下

其實整個程式16日的時候應該已經搞得差不多,文件也已經比較詳細。但是由於這個禮拜又是筆試又是面試,所以都沒有時間review整個程式。今天看了一下,改了一些輸出檔案的位置,基本上完成了所有任務了。程式放在 http xiao 81 svn auto testing 下。其中包括三個可執行指令碼 1....

總結一下模板

二叉樹的各種操作 include include include includetypedef struct node tree void createbitree tree p 建樹 return void xpreorder tree p 輸出先序 void zpreorder tree p 輸...