Hbase的架构

Hbase的架构

Hbase特点

  • 海量存储
  • 列式存储:列族存储,列族在创建表的时候必须指定
  • 极易扩展:一是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS),
    通过横向添加RegionServer的机器,水平扩展,提升Hbase上层的处理能力;横向添加DataNode的机器,进行存储层扩容,提升Hbase的数据存储能力和后端存储的读写能力
  • 高并发:Hbase的单个IO延迟下降并不多,能获得高并发,低延迟的服务
  • 稀疏:在列族中,可以指定任意多的列,在列数据为空时,不会占用存储空间

Hbase的组件

  • Client:Client包含了访问Hbase的接口,另外Client还维护了对应的cache来加速Hbase的访问,比如cache的.META.元数据的信息
  • Zookeeper:HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作
    通过Zoopkeeper来保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master提供服务
    通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下线的信息
    通过Zoopkeeper存储元数据的统一入口地址
  • Hmaster:
    为RegionServer分配Region
    维护整个集群的负载均衡
    维护集群的元数据信息
    发现失效的RegionServer,并将失效的Region分配到 正常的RegionServer上
    当RegionSever失效的时候,协调对应Hlog的拆分
  • HregionServer
    管理master为其分配的Region
    处理来自客户端的读写请求
    负责和底层HDFS的交互,存储数据到HDFS
    负责Region变大以后的拆分
    负责Storefile的合并工作
  • HDFS:提供元数据和表数据的底层分布式存储服务

其余组件

  • Write-Ahead logs:数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
  • Region:Hbase根据Rowkey的不同划分成不同的region存储在regionServer中,一个regionServer可有多个不同的region
  • Store:Hfile存储在store中,一个store对应Hbase表的一个列族
  • MemStore:内存存储,保存当前的数据操作,当数据保存在WAL中后,RS会在内存中存储键值对
  • Hfile:在磁盘上保存原始数据的实际的物理文件,是实际的存储文件,StoreFile是以Hfile的形式存储在HDFS上。

HBase数据存取流程

  • 数据存储

    • 1、客户端Client:

    • 请求Zookeeper,确定 MetaTable所在RegionServer的地址

    • 在根据RowKey找到归属的RegionServer

    • HBase Client Put(Delete)数据,提交到RegionServer

    • 2、服务端Hbase server

    • Region Server 去获取行锁,Region更新共享锁

    • 写HLog,WAL

    • 写缓存,MemStore

    • 将日志同步到HDFS

    • 写满缓存后,启动异步线程将数据写入到硬盘上

    • 可能触发Compaction或拆分
      put 提交之后,数据首先会放入 MemStore,然后再写 WAL (Write Ahead Log),当 MemStore 满了之后就会往 StoreFile 里面刷( HBase 并不会直接将数据落盘,而是先写入缓存,等缓存满足一定大小之后再落盘。)。当 StoreFile 文件数量增长到一定阈值之后,会触发Compact合并操作,将多个 StoreFiles 合并成一个 StoreFile

  • 数据获取
    客户端:

    • 请求Zookeeper,确定 MetaTable所在RegionServer的地址
    • 去对应的RegionServer地址拿到对应数据
      服务端:HBase Server
    • Region Server 构建RegionScanner准备进行检索
    • 有多少个列簇就构建多少个StoreScanner,用于对确定的列簇数据检索

对于hbase中数据的操作

  • 在修改数据时,是通过新增一条记录,每条记录都有一个版本号,每次查询出来的都是最新的数据
  • 删除数据时,也是追加一条新记录,但是标记该记录被删除的标志,每次查询时,看到最新数据时是数据删除,就知道数据被删除了
  • 如果进行很多次的增删操作,在小文件合并的同时,对于一些无用的记录就会删除,节约存储空间--------------》其实hbase把合并分为两种,一种是小合并minor compact,这种方式只会将少数文件进行简单合并,不会进行数据的清理,还有一种是大合并major compact,这种方式会将大部分文件进行合并,并且清理数据。但是大合并会消耗很多资源,影响性能