本文系转载,若有侵权,请联系我:likui0913@gmail.comhtml
Master-Slave 模式: HBase 体系结构遵循传统的 master-slave 模式,由一位掌握决策的主设备和一个或多个真正处理任务的从设备组成。在 HBase 中,主设备称为 HMaster,从设备被称为 HRegionServers,主从设备之间则经过 Zookeeper 共享状态信息。算法
HBase 组成: 从物理层面,HBase 由 3 个部分:apache
它们在程序中的实现分别为:数组
Region Servers 为客户端的读写提供数据,访问数据时,客户端直接与 Region Servers 通讯。Region 分配、DDL(建立、删除表)操做则由 HBase Master 处理。Zookeeper 做为 HDFS 的一部分,维护者一个活动的集群的状态。缓存
全部的 HBase 数据都存储在 HDFS 中,即 DataNode 负责存储 RegionServers 正在管理的数据。实际的架构中,会在每一个 DataNode 节点上部署一个对应的 RegionSevers,这使得 RegionSevers 所管理的数据距离实际的存储更接近,这也符合了 HDFS 目标之一:移动计算而非移动数据。服务器
RegionServers 主要负责服务和管理 Regions,它提供面向数据和 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 是 Master Server 的实现,它负责监视集群中的全部 RegionServer 实例,而且提供全部元数据更改的接口。HMaster 主要功能包括:分布式
同时,HMaster 运行着几个后台进程,包括:
HBase 使用 Zookeeper 做为分布式协调服务来维护集群中的服务器状态。Zookeeper 维护哪些服务器处于活动状态并可用,并提供服务器故障通知。Zookeeper 使用共识来保证共同的共享状态。根据 Zookeeper 使用的 Paxos 算法特性,至少应该有三至五台机器达成共识。
使用 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 将变为活动状态。
RegionServer 做为管理 Region,并直接与客户端传输数据的节点,其运行在 HDFS 的 DataNode 节点之上,并具备如下组件:
HBase 的数据最终被存储在 HFile 中,HFile 是保存在 HDFS 中的物理文件(默认大小为 128M),它包含已经排序过的 KeyVelue 数据。
注:HFile 中的数据是有序的,但同一个 Region 下的全部 HFile 并不必定是连续有序的。
当 MemStore 累积足够的数据时(默认为128M),整个已排序的 KeyValues 集将被写入 HDFS 中的新的 HFile 文件中(这是一个顺序写入,避免了移动磁盘驱动器磁头,因此它的速度会很是快)。
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,便表明了此数据被删除。
StoreFile(HFile) 由 block 组成,block 的大小基于每一个 ColumnFamily 进行配置,可在建立表时指定,默认大小为 64 KB。数据压缩也是发生在 block 级别。
HFile 包含一个多层索引,它容许 HBase 在没必要读取整个文件的状况下查找数据。多级索引就像一颗 B+ 树,它具备以下特色:
同时,文件的结尾包含一个 trailer 信息,它指向全部的块。而且该 tariler 还具备 Bloom 过滤器和时间范围等信息。Bloom 过滤器有助于跳过不包含某个行键的文件。若是文件再也不读取的时间范围内,则时间范围信息对于跳过该文件很是有用。
注:一个 keyValue 不会在 block 之间被拆分,即若是一个 KeyValue 大小为 8M,即便 block 大小设置是 64KB,这个 KeyValue 也将做为一个连贯的 block 被存储。
HFile 的索引是在 HFile 打开并保存在内存中时被加载的,它被保存在 BlockCache(即读取缓存)中,这就容许经过单个磁盘寻道来执行查找功能。