hbase架构及读写流程

1. 整体架构

各角色之间的关系
集群部署架构

flowchart TB A[Master] & B[zookeeper] --> C[RegionServer] & D[RegionServer] & E[RegionServer]
  • zookeeper

    • 用于和客户端连接,存储hbase:meta表的位置。hbase:meta存储所有region的行键范围
    • 【实现master高可用】
  • master负责

    • 跨region的操作:建表,删表,alter,移动region,合并,拆分等
    • 【为HRegionServer分配Region,维护整个集群的负载均衡】
    • 【维护集群的元数据信息】
    • 【发现失效的Region,并将失效的Region分配到正常的HRegionServer上】
    • 清理过期的WAL(TTL, 备份集群)
  • RegionServer

    • 接收并处理客户端读写请求
    • 【负责管理Region】
    • 【切分在运?过程中变?的Region】

2. 数据模型层次图

flowchart LR A[RegionServer] --> B1[Region] A --> B2[Region] B1 --> C1[Store] B1 --> C2[Store] B2 --> C4[Store] B2 --> C5[Store] C1 --> D1[Hfile] C1 --> D2[Hfile] C1 --> D5[MemStore]

3. 写入流程

hbase架构及读写流程

WAL : WAL实例维护了一个ConcurrentNavigableMap ,包含了多个WAL文件的引用。当一个文件写满了就会开始写下一个文件。WAL工作时,WAL文件数量会不断增长直到一个阈值后开始滚动。环状滚动日志结构
WAL实例只有一个,WAL文件会有多个,个数由HBase内部计算,公式:

Math.max(32, (regionserverHeapSize * memstoreSizeRatio*2 / logRollSize))

MemStore刷写, LSM树,主要是保证读性能(牺牲了一些写性能)

  • 大小达到阈值 hbase.hregion.memstore.flush.size 512M
    • 定时检查,若未到检查时间就达到阈值,会出发阻塞机制,阻止写入
  • 整个regionserver的memstore总和达到阈值
    • 也会出现阻塞
  • WAL数量大于maxLogs
    • 不会阻塞写入。触发memstore的刷写,以创建新空间加载WAL
  • memstore达到刷写时间间隔 1小时
  • 手动触发刷写

4. 读取流程

hbase架构及读写流程

从store中获取的数据先写入BlockCache,再返回到客户端

BlockCache的实现方案

1. LRUBlockCache

LeastRecentUsed 最近最少使用的数据淘汰
分为三个区域:

  • single-access 25%
  • multi-access 50%
  • in-memory 25%

列族的in-memory属性为true时,该列族的block从一开始就会被读到in-memory,且淘汰block时最后考虑这个区域。

BlockCache和Memstore配置的联动影响
memtore + blockcache 的内存占用比不能超过80%,否则会报错。因为必须留20%作为机动空间。

Full GC

2. BucketCache

14种桶
堆内、堆外、SSD-file

3. 组合模式

不同类型的Block分别放到LRUCache和BucketCache:

  • IndexBlock 和 BloomBlock 会被放到LRUCache
  • DataBlock 直接放到BucketCache

二级缓存:数据从一级到二级再到硬盘,从小到大,存储介质也是从快到慢。
比较合理的介质是:LRUCache使用内存,BucketCache使用SSD,HFile使用机械硬盘

hbase架构及读写流程

上一篇:约瑟夫环问题(通过观察得出递推式从而建立递归求解)


下一篇:Docker网络模式