HBase的架构
Zookeeper
HBase通过zk来做Master的高可用,RegionServer的监控、元数据的入口以及集群配置的维护工作;具体如下:
通过ZK保证集群中只有一个Master可用,在主的Master的出现异常后,会通过竞争机制产生新的Master
通过ZK监控RegionServer的状态,当RegionServer有异常时,同时Master RegionServer上下线信息。
通过ZK存储元数据
ZK作为统一的入口地址
HMaster
为RegionServer分配Region,维护集群的负载均衡,维护集群的元数据信息,发现失效的Region,将失效的Region分配到正常的RegionServer上,当RegionServer失效时,协调对应的HLog的拆分。
HRegionServer
HRegionServer直接对接用户的读写请求,是真正的干活的额节点,功能如下:
管理Master为其分配的Region
处理来自客户端的读写请求,负责与HDFS进行交互,负责Region变大后的拆分。
Region
- HBase 表根据Rowkey 划分成Region,理论上一个Region包含该表格从起始行到结束之间的所有行。
- 但是往往有可能一个Region没有办法存储这个表中所有的行,会进行切分 数据大小>=N^2*128MB(N为Region数量),当N=9时,切分大小会超过10GB,此时就按照10GB进行切分。
- Region由Store 组成
- Region会被分配到称之为“HRegionServer”的节点上
Store
每一个Region由一个或者多个Store组成,至少是一个Store 。HBase会把经常访问的数据放在一个Store里面,即一个列簇组成一个Store ,有多少个列簇就多少个Store 。
在Store 中,由一个memStore 和 0个或者多个StoreFile 组成
MemStore
- 写缓存。数据先写入到MemStore,触发flush机制后写到磁盘中
- 以key-value的形式存储到内存中
- MemStore的6种Flush机制(当MemStore Flush触发后,同一Region下的所有的MemStore都会刷新)
- MemStore级别:当Region中有一个MemStore的大小达到上限(默认为128MB hbase.hregion.memstore.flush.size),会触发MemStore刷新
- Region级别:当Region中所有的MemStore大小总和达到的上限(256MB hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 2* 128M = 256M)
- RegionServer级别:当RegionServer中所有的MemStore大小总和达到上限(hbase.regionserver.global.memstore.upperLimit * hbase_heapsize,默认 40%的JVM内存使用量),会触发部分Memstore刷新。Flush顺序是按照Memstore由大到小执行,先Flush Memstore最大的Region,再执行次大的,直至总体Memstore内存使用量低于阈值(hbase.regionserver.global.memstore.lowerLimit * hbase_heapsize,默认 38%的JVM内存使用量)。
- 当一个RegionServer中HLog数量达到了上限(可通过参数hbase.regionserver.maxlogs配置)时,系统会选取最早的一个 HLog对应的一个或多个Region进行flush
- HBase定期刷新Memstore:默认周期为1小时,确保Memstore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致的问题,定期的flush操作有20000左右的随机延时。
- 手动执行flush:用户可以通过shell命令 flush ‘tablename’或者flush ‘region name’分别对一个表或者一个Region进行flush。
StoreFile|HFile
HFile(StoreFile) 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、 Column排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列。
由于MemStore中存储的Cell遵循相同的排列顺序,因而Flush过程是顺序写,由于不需要不停的移动磁盘指针,因此磁盘的顺序写性能很高。
HFile的组成分为6部分,分别是数据块、元数据块、FileInfo块、数据索引块、元数据索引块、HFile文件尾,它们的详细描述如下:
名称 | 描述 |
---|---|
数据块 | 由多个Block(块)组成,每个块的格式为: [块头] + [Key长] + [Value长] |