深刻了解HBASE架构(转)

dd by zhj: 最近的工做须要跟HBase打交道,因此花时间把《HBase权威指南》粗略看了一遍,感受不过瘾,又从网上找了几篇经典文章。数据库

下面这篇就是很经典的文章,对HBase的架构进行了比较详细的描述。我本身也进行了简单的总结,简单的说,HBase使用的是LSM(缓存

Log-Structured Merge tree)--日志结构的合并树作为存储方式,这种存储方式是不少NoSQL数据库都在使用的,它的主要特色是:安全

1. 写:彻底的内存操做,速度很是快。具体来讲,是写入WAL(write ahead log)日志和MemStore内存,完成后给客户端响应。服务器

WAL至关于MySQL的binlog。当MemStore达到必定大小后,将其flush到磁盘。网络

2. 读:将磁盘中的数据与MemStore中的数据进行合并后架构

与B+树相比,LSM提升了写入性能,并且读取性能并无减低多少负载均衡

 

HBase由三个部分,以下分布式

1. HMasteroop

对Region进行负载均衡,分配到合适的HRegionServer性能

2. ZooKeeper

选举HMaster,对HMaster,HRegionServer进行心跳检测(貌似是这些机器节点向ZooKeeper上报心跳)

3. HRegionServer

数据库的分片,HRegionServer上的组成部分以下

Region:HBase中的数据都是按row-key进行排序的,对这些按row-key排序的数据进行水平切分,每一片称为一个Region,它有startkey和endkey,Region的大小能够配置,一台RegionServer中能够放多个Region

CF:列族。一个列族中的全部列存储在相同的HFile文件中

HFile:HFile就是Hadoop磁盘文件,一个列族中的数据保存在一个或多个HFile中,这些HFile是对列族的数据进行水平切分后获得的。

MemStore:HFile在内存中的体现。当咱们update/delete/create时,会先写MemStore,写完后就给客户端response了,当Memstore达到必定大

小后,会将其写入磁盘,保存为一个新的HFile。HBase后台会对多个HFile文件进行merge,合并成一个大的HFile

 

 

 

英文:https://mapr.com/blog/in-depth-look-hbase-architecture/#.VdMxvWSqqko

译文:https://my.oschina.net/u/1416978/blog/716926

一.Hbase 架构的组件

  •  Region Server:提供数据的读写服务,当客户端访问数据时,直接和Region Server通讯。
  • HBase Master:Region的分配,.DDL操做(建立表,删除表)
  • Zookeeper:是HDFS的一部分,维护一个活跃的集群状态

Hadoop DataNode存储着Region Server 管理的数据,全部的Hbase数据存储在HDFS文件系统中,Region Servers在HDFS DataNode中是可配置的,并使数据存储靠近在它所须要的地方,就近服务,当王HBASE写数据时时Local的,可是当一个region 被移动以后,Hbase的数据就不是Local的,除非作了压缩(compaction)操做。NameNode维护物理数据块的元数据信息。

 

二.Regions

HBase Tables 经过行健的范围(row key range)被水平切分红多个Region, 一个Region包含了全部的,在Region开始键和结束以内的行,Regions被分配到集群的节点上,成为 Region Servers,提供数据的读写服务,一个region server能够服务1000 个Region。

 

三.HBase HMaster

分配Region,DDL操做(建立表, 删除表)

协调各个Reion Server :

        -在启动时分配Region、在恢复或是负载均衡时从新分配Region。

        -监控全部集群当中的Region Server实例,从ZooKeeper中监听通知。

管理功能:

        -提供建立、删除、更新表的接口。

 

四.ZooKeeper:协调器

Hbase使用Zookeeper做为分布式协调服务,来维护集群中的Server状态,ZooKeeper维护着哪些Server是活跃或是可用的。提供Server 失败时的通知。Zookeeper使用一致性机制来保证公共的共享状态,注意,须要使用奇数的三台或是五台机器,保证一致。

 

5、组件之间如何工做

Zookeeper通常在分布式系统中的成员之间协调共享的状态信息,Region Server和活跃的HMaster经过会话链接到Zookeeper,ZooKeeper维护短暂的阶段,经过心跳机制用于活跃的会话。

每一个Region Server建立一个短暂的节点,HMaster监控这些节点发现可用的Region Server,同时HMaster 也监控这些节点的服务器故障。HMaster 经过撞见一个临时的节点,Zookeeper决定其中一个HMaster做为活跃的。活跃的HMaster 给ZooKeeper发送心跳信息,不活跃的HMaster在活跃的HMaster出现故障时,接受通知。

若是一个Region Server或是一个活跃的HMaster在发送心跳信息时失败或是出现了故障,则会话过时,相应的临时节点将被删除,监听器将因这些删除的节点更新通知信息,活跃的HMaster将监听Region Server,而且将会恢复出现故障的Region Server,不活跃的HMaster 监听活跃的HMaster故障,若是一个活跃的HMaster出现故障,则不活跃的HMaster将会变得活跃。

六  Hbase 的首次读与写

有一个特殊的Hbase 目录表叫作Meta表,它拥有Region 在集群中的位置信息,ZooKeeper存储着Meta表的位置。

以下就是客户端首次读写Hbase 所发生的事情:

1.客户端从Zookeeper的Meta表中获取Region Server。

2.客户端将查询 .META.服务器,获取它想访问的相对应的Region Server的行健。客户端将缓存这些信息以及META 表的位置。

3.护额端将从相应的Region Server获取行。

若是再次读取,客户端将使用缓存来获取META 的位置及以前的行健。这样时间久了,客户端不须要查询META表,除非Region 移动所致使的丢失,这样的话,则将会从新查询更新缓存。

 

七 Hbase META表

META 表集群中全部Region的列表

.META. 表像是一个B树

.META. 表结构为:

- Key: region start key,region id

- Values: RegionServer

 

八  Region Server 的组件

Region Server 运行在HDFS DataNode上,并有以下组件:

WAL:Write Ahead Log 提早写日志是一个分布式文件系统上的文件,WAL存储没有持久化的新数据,用于故障恢复,相似Oracle 的Redo Log。

BlockCache:读缓存,它把频繁读取的数据放入内存中,采用LRU

MemStore:写缓存,存储来没有来得及写入磁盘的新数据,每个region的每个列族有一个MemStore

Hfiles :存储行,做为键值对,在硬盘上。

 

Hbase 写步骤1:

当客户端提交一个Put 请求,第一步是把数据写入WAL:

-编辑到在磁盘上的WAL的文件,添加到WAL文件的末尾

-WAL用于宕机恢复

 

Hbase 写步骤2

一旦数据写入WAL,将会把它放到MemStore里,而后将返回一个ACk给客户端

 

MemStore

MemStore 存储以键值对的方式更新内存,和存储在HFile是同样的。每个列族就有一个MemStore ,以每一个列族顺序的更新。

 

 

HBase Region 刷新(Flush)

当MemStore 积累到足够的数据,则整个排序后的集合被写到HDFS的新的HFile中,每一个列族使用多个HFiles,列族包含真实的单元格,或者是键值对的实例,随着KeyValue键值对在MemStores中编辑排序后,做为文件刷新到磁盘上。

注意列族是有数量限制的,每个列族有一个MemStore,当MemStore满了,则进行刷新。它也会保持最后一次写的序列号,这让系统知道直到如今都有什么已经被持久化了。

最高的序列号做为一个meta field 存储在HFile中,来显示持久化在哪里结束,在哪里继续。当一个region 启动后,读取序列号,最高的则做为新编辑的序列号。

 

HBase HFile

数据存储在HFile,HFile 存储键值,当MemStore 积累到足够的数据,整个排序的键值集合会写入到HDFS中新的HFile 中。这是一个顺序的写,很是快,能避免移动磁头。

 

HFile 的结构

HFile 包含一个多层的索引,这样没必要读取整个文件就能查找到数据,多层索引像一个B+树。

  • 键值对以升序存储
  • 在64K的块中,索引经过行健指向键值对的数据。
  • 每一个块有本身的叶子索引
  • 每一个块的最后的键被放入到一个中间索引中。
  • 根索引指向中间索引。

trailer (追踪器)指向 meta的块,并在持久化到文件的最后时被写入。trailer 拥有 bloom过滤器的信息以及时间范围(time range)的信息。Bloom 过滤器帮助跳过那些不含行健的文件,时间范围(time range)则跳过那些不包含在时间范围内的文件。

 

HFile Index

索引是在HFile 打开并放入内存中时被加载的,这容许在单个磁盘上执行查找。

 

 

HBase 读合并

一个行的键值单元格能够被存储在不少地方,行单元格已经被存储到HFile中、在MemStore最近被更新的单元格、在Block cache最佳被读取的单元格,因此当你读取一行数据时,系统怎么能把相对应的单元格内容返回呢?一次读把block cache, MemStore, and HFiles中的键值合并的步骤以下:

  1. 首先,扫描器(scanner )在读缓存的Block cache寻找行单元格,最近读取的键值缓存在Block cache中,当内存须要时刚使用过的(Least Recently Used )将会被丢弃。
  2. 接下来,扫描器(scanner)将在MemStore中查找,以及在内存中最近被写入的写缓存。
  3. 若是扫描器(scanner)在MemStore 和Block Cache没有找到全部的数据,则HBase 将使用 Block Cache的索引以及bloom过滤器把含有目标的行单元格所在的HFiles 加载到内存中。

 

每一个MemStore有许多HFiles 文件,这样对一个读取操做来讲,多个文件将不得不被屡次检查,势必会影响性能,这种现象叫作读放大(read amplification)。

 

 

 

HBase 辅压缩(minor compaction)

HBase将会自动把小HFiles 文件重写为大的HFiles 文件,这个过程叫作minor compaction。

辅助压缩减小文件的数量,并执行合并排序。

 

 

 

HBase 主压缩(Major Compaction)

主压缩将会合并和重写一个region 的全部HFile 文件,根据每一个列族写一个HFile 文件,并在这个过程当中,删除deleted 和expired 的单元格,这将提升读性能。

然而由于主压缩重写了全部的文件,这个过程当中将会致使大量的磁盘IO操做以及网络拥堵。咱们把这个过程叫作写放大(write amplification)。

 

 

Region = 临近的键

  • 一个表将被水平分割为一个或多个Region,一个Region包含相邻的起始键和结束键之间的行的排序后的区域。
  • 每一个region默认1GB 
  • 一个region的表经过Region Server 向客户端提供服务
  • 一个region server能够服务1000 个region

 

 

Region 分裂

初始时一个table在一个region 中,当一个region 变大以后,将会被分裂为2个子region,每一个子Region 表明一半的原始Region,在一个相同的 Region server中并行打开。

而后把分裂报告给HMaster。由于须要负载均衡的缘故,HMaster 可能会调度新的Region移动到其余的Server上。

 

 

读负载均衡(Read Load Balancing)

分裂一开始发生在相同的region server上,可是因为负载均衡的缘由。HMaster 可能会调度新的Region被移动到其余的服务器上。

致使的结果是新的Region Server 提供数据的服务须要读取远端的HDFS 节点。直到主压缩把数据文件移动到Regions server本地节点上,Hbase数据当写入时是本地的,

可是当一个region 移动(诸如负载均衡或是恢复操做等),它将不会是本地的,直到作了主压缩的操做(major compaction.)

 

HDFS数据复制

全部的读写操做发生在主节点上,HDFS 复制WAL和HFile 块,HFile复制是自动发生的,HBase 依赖HDFS提供数据的安全,

当数据写入HDFS,本地化地写入一个拷贝,而后复制到第二个节点,而后复制到第三个节点。

WAL 文件和 HFile文件经过磁盘和复制进行持久化,那么HBase怎么恢复还没来得及进行持久化到HFile中的MemStore更新呢?

 

 

HBase 故障恢复

当一个RegionServer 挂掉了,坏掉的Region 不可用直到发现和恢复的步骤发生。Zookeeper 决定节点的失败,而后失去region server的心跳。

而后HMaster 将会被通知Region Server已经挂掉了。

当HMaster检查到region server已经挂掉后,HMaster 将会把故障Server上的Region重写分配到活跃的Region servers上。

为了恢复宕掉的region server,memstore 将不会刷新到磁盘上,HMaster 分裂属于region server 的WAL 到单独的文件,

而后存储到新的region servers的数据节点上,每一个Region Server从单独的分裂的WAL回放WAL。来重建坏掉的Region的MemStore。

 

 

数据恢复

WAL 文件包含编辑列表,一个编辑表明一个单独的put 、delete.Edits 是按时间的先后顺序排列地写入,为了持久化,增长的文件将会Append到WAL 文件的末尾。

当数据在内存中而没有持久化到磁盘上时失败了将会发生什么?经过读取WAL将WAL 文件回放,

添加和排序包含的edits到当前的MemStore,最后MemStore 刷新将改变写入到HFile中。

 

 

九 HBase架构的优势

强一致模型:当写操做返回时,全部的读将看到同样的结果

自动扩展:Regions 随着数据变大将分裂;使用HDFS传播和复制数据

内建的恢复机制:使用WAL

和Hadoop的集成:直接使用mapreduce

十 HBase架构的缺点

WAL回放较慢

故障恢复较慢

主压缩致使IO瓶颈。

相关文章
相关标签/搜索