下图是hbase的底层原理图。
从图中可以看出hbase分为HMaster和HRegionServer两个部分。
HMaster主要功能:
- 监控 RegionServer
- 处理 RegionServer 故障转移
- 处理元数据的变更
- 处理region 的分配或移除
- 在空闲时间进行数据的负载均衡
- 通过 Zookeeper 发布自己的位置给客户端
RegionServer主要功能:
- 负责存储 HBase 的实际数据
- 处理分配给它的 Region
- 刷新缓存到 HDFS
- 维护HLog
- 执行压缩
- 负责处理region分片
HBase组建:
- WAL(Write -Aheadlogs)预写日志
对hbase中的数据进行读写的时候,并不是直接写入到磁盘的,而是会先写入到内存中,当数据量达到了一定的阈值的时候才会flush到磁盘。因为数据存储到内存中,所以数据丢失的风险很高,为了解决这种问题,就引入了WAL(日志预写)机制,也就是说会将数据写入到一个log日志文件中,然后再写入到内存中。当内存中的数据丢失,可以通过WAL进行恢复。
2.HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
3.Store
HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。
4.MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL中之后,RegsionServer 会在内存中存储键值对。
5.Region
Hbase 表的分片,HBase 表会根据RowKey 值被切分成不同的region 存储在RegionServer 中,在一个 RegionServer 中可以有多个不同的 region。
读写流程
1.HRegionServer 保存着meta 表以及表数据,要访问表数据,首先 Client 先去访问zookeeper,从 zookeeper 里面获取meta 表所在的位置信息,即找到这个meta 表在哪个HRegionServer 上保存着。
2.接着Client 通过刚才获取到的 HRegionServer 的 IP 来访问 Meta 表所在的HRegionServer,从而读取到 Meta,进而获取到 Meta 表中存放的元数据。
3.Client 通过元数据中存储的信息,访问对应的HRegionServer,然后扫描所在HRegionServer 的Memstore 和 Storefile 来查询数据。
4.最后 HRegionServer 把查询到的数据响应给Client。
HBase 写数据流程:
- Client 也是先访问 zookeeper,找到 Meta 表,并获取 Meta 表信息。
- Client 也是先访问 zookeeper,找到 Meta 表,并获取 Meta 表信息。
- Client 向该 RegionServer 服务器发起写入数据请求,然后RegionServer 收到请求并响应
- Client 先把数据写入到 HLog,以防止数据丢失。
- 然后将数据写入到Memstore。
- 如果 Hlog 和Memstore 均写入成功,则这条数据写入成功。在此过程中,如果 Memstore达到阈值,会把 Memstore 中的数据 flush 到 StoreFile 中。
- 当 Storefile 越来越多,会触发Compact 合并操作,把过多的 Storefile 合并成一个大的Storefile。当 Storefile 越来越大,Region 也会越来越大,达到阈值后,会触发 Split 操作,将 Region 一分为二。