1. 程式人生 > >Hbase 寫入機制詳解與MVCC機制

Hbase 寫入機制詳解與MVCC機制

內存 不能 comm mysq walk 數據 事務 xid 繼續

Hregion.doMiniBatchMutation 內部實現

1.獲取相關的鎖,由於HBase要確保行一級的原子性,所以獲取鎖的時候獲取的是整個rowkey的鎖而不是單個cell的鎖;也只有當至少獲取一個鎖的時候,這個方法才會繼續,否則直接返回。

2.更新cell中的時間戳(timestamp)以及獲取mvcc相關參數,其中timestamp(也可以叫做version)可以在客戶端自己手動指定,所以在一致性上不能用來做參考,也許正是因此才會引入一個叫做sequenceId的概念(當然更多的用途是為了保證修改操作在HLog裏面的順序)來完成mvcc,最後會介紹一下mvcc以及在這裏HBase是如何處理mvcc的。

3.將這些put操作寫入memstore,雖然數據庫系統中寫日誌永遠比寫數據重要,但是這裏可以認為當前“事務”尚未提交,即使現在掛了沒有日誌恢復也不要緊,因為這個“事務”是沒有提交的。

4.構建walEdit,這一步主要是為了構建WALEdit類型的walEdit變量,這個變量主要是以list的形式聚合了很多HBase裏面cell的概念,以後會寫入到HLog中。

5.追加剛才構建好的walEdit:首先構造一個walKey,註意這裏的walKey的sequenceId為默認值-1,到後面才會修改為跟region掛鉤的唯一遞增id;接著調用wal的append方法並返回一個遞增數值(txid),用來表示這個追加到wal內存中日誌條目的編號,在第七步中這個數值將會作為參數傳入,確保該數值之前的日誌信息都被寫入到HLog日誌文件中,而且在append方法中會保證walKey的sequenceId變成了region的sequenceId(也是一個遞增序列)。

6.釋放獲取的鎖。

7.將wal寫入磁盤,正如第五步所說,這裏保證txid以及之前的日誌條目都被寫入到日誌文件中了,一旦寫完便可以認為這個“事務”成功了,這裏跟MySQL裏面的auto commit很像。

8.提交本次操作,讓put操作對讀可見,核心步驟就是增加對應memstore的readpoint,使得以前講的MemStoreScanner可以看見put過來的數據,這根後面講的mvcc有關。

Hbase 寫入機制詳解與MVCC機制