hbase不睡覺書重點

簡介

特點

  • 優點:
    • 大容量存儲。支持P級別數據。
    • 高ops。單節點1w+,集羣可達百萬+。
    • 列擴展方便。
      • client直接新增列即可,列爲空不佔存儲空間。
      • mysql需要執行ddl,並佔默認空間。
    • 擴容方便。新增節點後執行rebalance即可。
  • 缺點:
    • 不支持複雜查詢。kv型,需要rowkey查詢。
    • 單點恢復時間較長。分鐘級,保證CP。
    • 長尾。受gc影響,999線是avg 20 倍左右。
    • 部署較複雜。
  • 對比關係型數據庫:
    • 關係型數據庫:行的各個列都是不可分割的,存儲在一起。
    • Hbase:行是抽象的概念,每一列是離散的,不同列可在不同機器上。

使用場景

  • 數據量超過千萬。
  • 數據分析需求弱,複雜查詢少。
  • 實時性要求不高。

CP

  • 運行時強一致:對於每一個region同時只有一個region server提供服務。
  • 故障時犧牲可用性:region server宕機,遷到其他region server,新region需要根據WAL來redo,這期間region不可用的,從而提高一致性。

存儲架構

  • 191009.row.png
  • namespace:
  • table:創建時定義列族。
  • rowkey: 不重複的字符串,決定行存儲順序(字典序)的唯一憑證。
  • 列族:建表時確定,過期時間、緩存塊大小等都是定義在列族上的,同一列族的列會盡量放在一臺服務器上。
  • :字段。
  • 單元格:一個列的一個版本的值,版本號默認爲寫入的時間戳。

部署架構

典型部署

  • 5節點zk集羣+1主2備master+n個regionserver(每個2T容量)。
    191016.regionserver.png

概念

  • region serverregion 的容器。
  • region ,一段數據的集合,或者說多個行的集合:
    • 不能跨服務器,一個region server上有多個region。
    • 在數據量大的時候會分裂,負載均衡是也會在region server之間遷移。
    • 基於HDFS,數據存取操作基於HDFS客戶端接口。
    • 用預拆分初始化和自動拆分管理region,大量刪除數據後用online_merge合併region。
  • master 負責跨region server 的操作,如建表、移動region、合併region等。
  • zk 管理所有的region server,包括meta節點的地址。
    • client和zk通信後直連region server,降低對master的依賴。

region server

  • 191022.regionserver.png
  • WAL:Write-Ahead Log,存在HDFS上。
    • 環狀滾動日誌:寫入效果最高、空間不會變大。
    • 滾動條件:1、WAL所在的block快滿;2、WAL空間大於block的閾值。
    • WAL創建在/hbase/.log下,歸檔到/hbase/.oldlogs下。
    • 刪除條件:當WAL不需要作爲用來恢復數據的備份,即沒有任何引用指向這個WAL文件。引用分類:
      • TTL進程引用:超時時間(默認10min)。
      • 進羣備份引用:如開啓replication,該進程在所有集羣備份前引用。

store

  • 191018.store.png
  • 一個store存放一個列族的數據。
  • Memstore:一個store中一個memstore,內存存儲對象,滿了之後刷到HFile。
    • 實現LSM樹的組件:儘量保證數據是順序存儲到磁盤上,並有頻率的整理,確保順序性。從而在頻繁的數據變動下保持系統讀取的穩定性。
  • HFile:MemStore滿了之後生成新的HFile,由塊組成,每個塊包括:
    • Data:數據塊。
      • BlockType:數據塊等。
      • 多個Cell:KeyValue鍵值對。
    • Meta:元數據塊,文件關閉時寫入。
    • FileInfo:文件信息,比如最後一個key,文件關閉時寫入。
    • DataIndex:數據塊的索引。
    • MetaIndex:元數據塊索引。
    • Trailer:各個塊的偏移值。

HDFS上的文件只能創建、刪除、追加,不能修改

WAL按照寫入順序排序,經過Memstore按照rowkey順序排序。

訪問流程

增刪改實質

  • 寫入順序WAL->Memstore->HFile
  • 新增Cell,在HDFS上新增一條數據。
  • 修改Cell,新增版本號更大(自定義版本號)的一條數據。
  • 刪除Cell,新增一條Delete類型的數據,即墓碑標記,相當於邏輯刪除。

寫入順序

  1. WAL:基於HDFS,雖然已經持久化,但是時暫存日誌,不區分store,不能直接讀取。
  2. Memstore:整理成LSM樹。
    1. 刷寫(定時任務)之前,memstore容量如果到達阻塞閾值會暫停memstore的寫入,可通過調大JVM堆解決。
  3. HFile:memstore達到尺寸上限或者刷寫間隔,刷到HDFS
    1. Minor Compaction:store中的多個HFile合併爲一個,達到TTL的數據會被移除。
    2. Major Compaction:store中的所有HFile合併爲一個,達到TTL的和手動刪除的數據會被移除。

查詢架構

  • 191022.query.png
  1. 從zk上查有hbase:meta表的region server (meta節點)。
  2. 連接meta節點獲取所有region的行鍵範圍,並且緩存該meta信息。
  3. 直連包含目標rowkey的region server操作。

查詢順序

  1. BlockCache:緩存block塊。一個region server只有一個blockCache
  2. Memstore
  3. HFile

部分API

  • checkAndPut:CAS的應用,Hbase保證原子性。
  • append:value後面增加字節組。
  • increment:long類型value+1。
  • RowMutations:組合多個操作爲原子操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章