概述
HBase 是 Hadoop Database 的简称.与HDFS的分布式文件系统的定位不同,HBase从它的名字中就可以知道它的定位是一个不折不扣真正意义上的数据库概念
HBase作为数据库而言,对外提供数据的存储和读取.
架构
HBase 整体架构在HDFS上,从某种意义上说,HBase就是HDFS的写入和查询器
HBase架构本身是一个分布式的主从架构,主要由三部分组成
- HMaster
- HRegionServer群
- Zookeeper
Zookeeper
Zookeeper 在HBase中是非常重要的部分
- ZK负责HMaster的HA切换和HRegionServer的上下线存活监控
- ZK还负责提供Region的寻址
在LSM的设计中,最困难的是定位读取.因为LSM是牺牲了读性能来换取的写性能
HBase 虽然采用了LSM的小树合并优化(HRegion),但始终只是相对合并,无论如何也不可能合并为一棵树的.
所以最终始终要面对的是HRegion的寻址问题,就是知道一个键如何知道在哪个HRegion
HBase的策略是ZK存储HRegion的区段.这样HBase最终完美的解决了LSM的读取难问题
依靠ZK的寻址存储,在HBase中甚至直接避开了常规主从的Master.
- 客户端首先请求ZK
- 客户端解析寻址数据后(就是判断键在哪个键段中),定位HRegionServer,然后绕过HMaster直连HRegionServer读取数据(依据键段可以确定我们键所在的Region,Region所在的RegionServer,注意没有直存Region而必须通过HRegionServer转,因为Region量太大了)
HMaster
HMaster作为这个主从集群的中心点,负责管理整个集群
- 负责数据库和表级别的元数据管理(也就是DDL必须通过HMaster)
- 管理HRegionServer的负载均衡(调整Region分布)
- RegionSplit后,负责新的Region数据分布
- 迁移已停机HRegionServer的Region
- HDFS的垃圾回收
HRegionServer
HRegionServer是真正数据存储的地方
- 每一个HRegionServer中含有多个HRegion
- 每一个HRegion对应元数据Table中的一个Region,每一个HRegion中含有多个HStore
- 每一个HStore对应元数据一个列族(Column Family)
HStore
HStore 是HBase内部的存储核心.由MemStore和StoreFile组成,整体上就是一个内存缓冲区设计
- 客户端写入 写入内存缓冲区(MemStore)
客户端写入到此完毕,对客户端而言只是增加.合并,更新,删除都是由合并阶段完成的 - 内存缓冲区满时写出到一个StoreFile
- 随着StoreFile的不断增长,触发Compact.多个StoreFile被合并成一个StoreFile
- StoreFile合并过程中,同时会进行版本合并和数据删除
随着单个StoreFile的继续持续增长,会继续触发
- 当单个StoreFile超过一定阈值(256M),会触发Spite.会将当前Region分裂为两个新Region,原Region会下线,两个新Region会重新上线加入集群
HLog
HLog是HBase的WAL机制引入的概念
用户写入数据只到内存就即时返回,这样的风险是如果此时HRegionServer崩溃会导致数据丢失,所以在客户端写入MemStore之前,引入了WAL(Write AHead Log)机制,数据写入MemStore的同时写入HLog.
.定期滚动
一旦HMaster感知到某个HRegionServer崩溃,会首先处理其遗留的HLog按照Region拆分后分别存于其它的对应的Region目录下,然后将失效Region中的RowKey重新分配
领取到Region的HRegionServer通过LoadRegion发现自己有历史HLog未处理,就会Replay HLog到自己的MemStore,然后通过正常的溢写完成数据恢复
HLog对象在每一个HRegionServer维持一个,而不是每个Region一个
这样好处在多个Region上维持顺序写入是可以提升性能.坏处是在HLog中,必然是混杂多个Region,提高了解析成本
存储格式
HBase 是架构在HDFS之上的,所以HBase的存储必然是文件存储
HBase 的数据文件 主要有有两种
- HFile
HFile 是HBase的数据存储文件.本质是一个存放在HDFS中的键值对的二进制格式文件.(StoreFile本质也是HFile) - HLog
HLog是WAL文件,本质上是一个存放在HDFS中的Sequence File
数据模型
HBase的数据是一种三维概念,定位一个Cell需要 RowKey + Column + Version 三部分完成
HBase不存储空数据,所以HBase表整体呈现出稀疏表的特征
HBase 是一个分布式的列式存储数据库(KV列式),HBase实际是通过RowKey检索的