分享

浅谈HBase系统架构

 Glory____ 2017-01-24

一、HBase基本架构和核心功能模块

这里写图片描述

  • Client:

    1. 客户端Client是HBase系统的入口,使用者直接通过客户端操作HBase;
    2. Client使用HBase的RPC机制与HMaster和RegionServer进行通信,对HBase 管理类操作,Client与HMaster进行RPC通信;对数据读写类操作,Client与 RegionServer进行RPC交互;
    3. Client客户端允许有多个,包括原生Java接口,还有Thrift,Avro,Rest等客户端模式;
        
  • Zookeeper(协调服务组件):

    1. ZooKeeper Quorum队列负责管理HBase中多个HMaster的选举、服务器之间的状态同步等,避免HMaster单点问题;
    2. HBase中ZooKeeper实例负责的协调工作有:存储HBase元数据信息、实时监控RegionServer(感知各个HRegionServer的健康状况)、存储所有Region的寻址入口;
    3. 保证HBase集群中有且只有一个HMaster节点;
  • HMaster:

    1. HMaster没有单点问题,在HBase中可以启动多个Hmaster,通过ZooKeeper 的Master(leader)选举机制保证总有一个Master正常运行并提供服务,其余HMaster作为备选时刻准备提供服务;
    2. HMaster 主要负责Table和Region的管理工作;
    3. 管理用户对Table的增删改查操作;
    4. 管理RegionServer的负载均衡,调整Region分布;
    5. 在Region分裂后,负责新的Region的分配;
    6. 在RegionServer宕机后,负责失效RegionServer上的Region迁移;
  • HRegionServer:

    1. HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中的核心存储模块;
    2. HRegionServer内部管理了一系列Hregion对象,每个Hregion对应了Table中的一个Region;
    3. HRegion由多个HStore组成,每个HStore对应了Table中的一个 Column Family的存储;
    4. HBase中每个Column Family就是一个集中的存储单元,因此设计时最好将具备共同IO特性的列放在同一个Column Family中,保证读写的高效性;

二、HRegionServer架构

这里写图片描述

  • HStore是HBase的真实数据存储结构,有两部分组成:MemStore 和StoreFile(底层实现是HFile格式);

  • MemStore是Sorted Memory Buffer,用户写入的数据首先会放入 MemStore中,当MemStore满了以后会Flush成一个StoreFile;

  • 当StoreFile文件数量增长到一定阈值,会触发Compact操作,将多 个StoreFile合并成一个StoreFile,在合并过程中会进行版本合并和数据删除,因此可以看出,HBase其实只有增加数据,所有的更新和删除操作都是在后续的Compact过程中进行的,使得用户的写操作只要缓冲至内存即可返回,保证IO性能;

  • StoreFiles在触发Compact操作后,会逐步形成越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前 Region分裂成2个Region,父Region会下线,新分裂的2个子 Region会被Hmaster分配到相应的HRegionServer上,使得原来的 1个Region的负载压力得以分流到2个Region上;

  • 每个HRegionServer中都有一个HLog对象,HLog是一个实现WAL 的类,每次操作写入数据到MemStore时,也会写一份数据到HLog 文件中,HLog文件定期会更新删除旧的文件(已经持久化到StoreFile中的数据);

三、HRegionServer意外出错或宕机

由上面我们知道HBase其实只有增加数据,所有的更新和删除操作都是在后续的Compact过程中进行的,使得用户的写操作只要缓冲至内存即可返回,保证IO性能,但是如果在Compact之前HRegionServer宕机了,那在内存中的写操作数据都将会丢失,下面说明一下HBase是如何做的。

其实HRegionServer中的HLog就是防止这种情况发生的。

工作机制:

  • 每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log(WAL)的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知;
  • HMaster首先处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应的Region目录下;
  • 然后再将失效的Region重新分配,领取到这些Region的HRegionServer在加载Region的过程中会发现有历史HLog需要处理;
  • 最后新分配的HRegionServer会将HLog中的数据回滚到MemStore中,接着Flush到StoreFile中进行持久化存储;

四、HBase存储格式

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:

  • HFile HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile ;

  • HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File;

1.HFile
这里写图片描述

HFile里面的每个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了很多项,并且有固定的结构。

HFile由六部分组成

1). Data Block 段:保存表中的数据,这部分可以被压缩;每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成,Magic内容就是一些随机数字,目的是防止数据损坏;为了提高效率,HRegionServer中有基于LRU的Block Cache机制。

2). Meta Block段 (可选的):保存用户自定义的kv对,可以被压缩。

3). File Info 段:HFile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。

4). Data Block Index 段:Data Block的索引。每条索引的key是被索引的 block的第一条记录的key。记录了每个Data块的起始点。

5). Meta Block Index段 (可选的):Meta Block的索引。记录了每个Meta块的起始点。

6). Trailer段:这一段是定长的。保存了每一段的偏移量,读取一个HFile时会首先读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后DataBlock Index会被读取到内存中,这样,当检索 某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。

  • Data Block Index采用LRU机制淘汰。
  • HFile的Data Block,Meta Block通常采用压缩方式存储,压缩之后 可以大大减少网络IO和磁盘IO,随之而来的开销当然是需要花费cpu 进行压缩和解压缩。

  • 目标Hfile的压缩支持两种方式:Gzip,Lzo。

2.HLog(WAL log)

这里写图片描述

  • HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”, sequence number的起始值为0,或者是最近一次存入文件系统中sequence number;

  • HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue;

五、-ROOT-与.META.表

  • -ROOT-表

表包含.META.表所在的区域列表,该表只会有一个HRegion,不会被切分;Zookeeper中记录了-ROOT-表的location;

  • .META.表

表包含所有的用户空间区域列表,以及RegionServer的服务器地址;

–>
因此查找数据的流程:
1. 通过Zookeeper找到-ROOT-的位置
2. 根据-ROOT-找到相关.META.对应的位置
3. .META.找到对应RegionServer的位置
4. 在RegionServer里找到相关Region
5. 在Region中取得数据

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多