HBase 架构与工做原理2 - HBase 组件

1、HBase 组件概览

Master-Slave 模式: HBase 体系结构遵循传统的 master-slave 模式,由一位掌握决策的主设备和一个或多个真正处理任务的从设备组成。在 HBase 中,主设备称为 HMaster,从设备被称为 HRegionServers,主从设备之间则经过 Zookeeper 共享状态信息。html

HBase 组成: 从物理层面,HBase 由 3 个部分:算法

  • Region Servers
  • HBase Master
  • Zookeeper

它们在程序中的实现分别为:apache

  • HRegionServers 节点
  • HMaster 节点
  • Zooeeper 节点

Region Servers 为客户端的读写提供数据,访问数据时,客户端直接与 Region Servers 通讯。Region 分配、DDL(建立、删除表)操做则由 HBase Master 处理。Zookeeper 做为 HDFS 的一部分,维护者一个活动的集群的状态。数组

全部的 HBase 数据都存储在 HDFS 中,即 DataNode 负责存储 RegionServers 正在管理的数据。实际的架构中,会在每一个 DataNode 节点上部署一个对应的 RegionSevers,这使得 RegionSevers 所管理的数据距离实际的存储更接近,这也符合了 HDFS 目标之一:移动计算而非移动数据。缓存

这里写图片描述

HRegionServers

RegionServers 主要负责服务和管理 Regions,它提供面向数据和 Region 维护的方法,其中包括:服务器

  • 数据的读写、删除等
  • Region 的分离(Split)、压缩(compact)等

Region

Region 是 Table 可用性和分布的基本元素,由每一个列族(ColumnFamily)的一个库(Store) 组成。其对象层级以下:数据结构

- Table
  - Region
    - Store(由每一个 Region 中的列族组成的存储块)
      - MemStore(每一个 Region 中存储在内存中的 Store)
      - StoreFile(每一个 Region 中被持久化后的 Store)
        - Block (StoreFile 内被分块存储后的块)

分区存储: HBase 按照行键(RowKey)范围水平划分 Regions,一个 Region 包含了该 Region 的 startKey (开始键)到 endKey (结束键)之间的全部行。这些 Region 被分配给各个 RegionServers,每一个 RegionServer 能够服务约 1000 个 Region。架构

这里写图片描述

HMaster

HMaster 是 Master Server 的实现,它负责监视集群中的全部 RegionServer 实例,而且提供全部元数据更改的接口。HMaster 主要功能包括:负载均衡

  • 协调 RegionServer
    • 在启动时分配 Region、从新分配 Region 以恢复或负载均衡
    • 监控集群中的全部 RegionServers 节点(侦听来自 Zookeeper 的通知)
  • 管理功能
    • 提供建立、修改、删除、启动、禁用 table 的接口
    • 管理 namesapce 和 table 的元数据
    • 管理 Region 的移动、分配、取消分配
    • 权限控制

这里写图片描述

同时,HMaster 运行着几个后台进程,包括:分布式

  • 负载平衡器(LoadBalancer): 按期地,若是没有任何 Region 被转换时,负载平衡器将运行并移动 Region 平衡集群负载;
  • Catalog Janitor: 按期检查并清理 .META 表。

Zookeeper

HBase 使用 Zookeeper 做为分布式协调服务来维护集群中的服务器状态。Zookeeper 维护哪些服务器处于活动状态并可用,并提供服务器故障通知。Zookeeper 使用共识来保证共同的共享状态。根据 Zookeeper 使用的 Paxos 算法特性,至少应该有三至五台机器达成共识。

这里写图片描述

2、组件间如何协同工做

使用 Zookeeper 共享成员信息: HBase 使用 Zookeeper 来协调 HMasters 与 RegionServers 成员的共享状态信息。RegionServers 和活动状态的 HMaster 经过会话链接到 Zookeeper,并在 Zookeeper 上建立一个临时节点以表示其处于活动状态。Zookeeper 则经过接收各成员的心跳信息来维护会话的临时节点,若是RegionServers 或活动的 HMaster 未能向 Zookeeper 发送心跳,则表明会话过时,Zookeeper 将删除相应的临时节点。HMaster 经过监听 Zookeeper 上 RegionServer 建立的临时节点来发现可用的 RegionServer,并监控这些节点的服务器故障。

这里写图片描述

HMaster 选举: HMaster 经过争夺建立一个短暂的节点,Zookeeper 会选择第一个来确保只有一个 HMaster 处于活动状态。活动的 HMaster 将心跳发送到 Zookeeper,非活动状态的 HMaster 将监听活动的 HMaster 故障的通知,一旦发现活动的 HMaster 失败,则非活动的 HMaster 将变为活动状态。

3、RegionServers 的组件

RegionServer 做为管理 Region,并直接与客户端传输数据的节点,其运行在 HDFS 的 DataNode 节点之上,并具备如下组件:

  • WAL: 预写日志,用于存储还没有被永久保存的新数据,它以文件的形式存储在分布式文件系统(一般是 HDFS)上,其主要做用是用于故障后的恢复;
  • BlockCache: 读取缓存,它将频繁读取的数据存储在内存中,用以加快客户端的读取速度。最近最少使用的数据将在 BlockCache 满时被逐出,其默认的最大值为 Java 堆大小 * 0.4,默认的缓存方式为 LruBlockCache(一种彻底在 Java 堆内的缓存,另一种方式为 BucketCache);
  • MemStore: 写入缓存,它存储还没有写入磁盘的新数据,用以减小磁盘 IO 频率。它在写入磁盘以前将进行排序。++每一个 Region 的每一个列族都有一个 MemStore。++
  • HFiles: 用于将行数据做为已排序的 KeyValues 结构存储在磁盘上的最终文件,一个 Region 一般包含多个 HFile。

这里写图片描述

HFile (StoreFile)

HBase 的数据最终被存储在 HFile 中,HFile 是保存在 HDFS 中的物理文件(默认大小为 128M),它包含已经排序过的 KeyVelue 数据。

注:HFile 中的数据是有序的,但同一个 Region 下的全部 HFile 并不必定是连续有序的。

当 MemStore 累积足够的数据时(默认为128M),整个已排序的 KeyValues 集将被写入 HDFS 中的新的 HFile 文件中(这是一个顺序写入,避免了移动磁盘驱动器磁头,因此它的速度会很是快)。

这里写图片描述

KeyVelue

KeyVelue 类是 HBase 中数据存储的核心。KeyVelue 包装一个字节数组,并将偏移量和长度放入传递的数组中,指定将内容开始解释为 KeyVelue 的位置。

字节数组中的 KeyVelue 数据结构表现为:

{
    keylength,
    valuelength,
    key: {
        rowLength,
        row (i.e., the rowkey),
        columnfamilylength,
        columnfamily,
        columnqualifier,
        timestamp,
        keytype (e.g., Put, Delete, DeleteColumn, DeleteFamily)
    }
    value
}

注:keytype 用来标识数据操做类型,当删除操做发生时,HBase 新建一条相同的数据,并使 keytype=delete,便表明了此数据被删除。

Block

StoreFile(HFile) 由 block 组成,block 的大小基于每一个 ColumnFamily 进行配置,可在建立表时指定,默认大小为 64 KB。数据压缩也是发生在 block 级别。

HFile 结构

HFile 包含一个多层索引,它容许 HBase 在没必要读取整个文件的状况下查找数据。多级索引就像一颗 B+ 树,它具备以下特色:

  • KeyValue 对按升序存储
  • 索引指向包含 KeyValue 数据的“block”(默认大小为 64KB)
  • 每一个 block 都有本身的叶子索引(Leaf ndex)
  • 每一个 block 的最后一个 key 放在中间索引(Intermediate index)中
  • 根索引指向中间索引

同时,文件的结尾包含一个 trailer 信息,它指向全部的块。而且该 tariler 还具备 Bloom 过滤器和时间范围等信息。Bloom 过滤器有助于跳过不包含某个行键的文件。若是文件再也不读取的时间范围内,则时间范围信息对于跳过该文件很是有用。

注:一个 keyValue 不会在 block 之间被拆分,即若是一个 KeyValue 大小为 8M,即便 block 大小设置是 64KB,这个 KeyValue 也将做为一个连贯的 block 被存储。

HFile 结构

HFile 索引

HFile 的索引是在 HFile 打开并保存在内存中时被加载的,它被保存在 BlockCache(即读取缓存)中,这就容许经过单个磁盘寻道来执行查找功能。

这里写图片描述

参考连接

相关文章
相关标签/搜索