2014年7月14日星期一

HBase架构分析(二) 目录表-Master-RegionServer

介绍

        HBase是一种NoSQL数据库。NoSQL所表示的意思是区分于传统的RDBMS-关系型数据库,它不支持关系型数据库的SQL语言。现在,有很多的NoSQL类型数据库,例如BerkeleyDB是一个本地的NoSQL数据库,而HBase则是一个分布式的NoSQL数据库。谈到数据库,其实HBase更像是一个数据存储,因为它不支持数据库的多种特点,比如SQL,比如二级索引、触发器、高级搜索语言等;
        但是HBase也有自己的很多特性,它可以进行线性和模块化扩展;HBase集群的扩展是通过扩展RegionServer来实现的,RegionServer则是运行在一组服务器上。如果一个HBase集群从10个扩展到20个,那么集群的存储空间和计算能力都会翻番;关系型数据库也能很好的扩展,但是仅仅是在 一个点上的纵向扩展,通过扩展硬件的计算、存储和内存来达到服务的升级;HBase有以下特性:

  • 强一致性读写:HBase不是最终一致性的数据库,所以一些计数器在HBase中实现非常合适;
  • 自动分片策略:HBase的表通过分区(regions)分布在集群中,分区(regions)则会自动的随着数据增长重新分割并重新分布;
  • 自动分区服务容错;
  • Hadoop/HDFS集成:HBase底层支持直接使用HDFS进行存储,因为HDFS是一个分布式存储系统;
  • MapReduce:HBase支持使用HBase作为并行的MapReduce作业的数据源;
  • Java Client API:HBase支持非常简单的Java API 接口;
  • Thrift/REST API:HBase也支持Thrift或Rest API;
  • Block Cache and Bloom Filters: HBase支持分块缓存和bloom filters来实现快速检索;
  • 运行管理:HBase提供和JMX一样的内置web页面来观察服务的情况;

什么时候使用HBase

  • 当你有数亿或者数十亿的记录需要存储时,可以选择使用HBase;当你只有几千到一百万行数据时,传统的关系型数据库可能更合适;
  • 确保你可以放弃关系型数据库提供的特性;
  • 确保你有足够的硬件,即使对于HDFS来说,少于5个节点的集群的效率也不会很好;

HDFS和HBase的区别

        HDFS是一个被设计用来存储大文件的文件系统,它无法提供单个独立记录的快速查找;HBase是建立在HDFS基础上的,提供数据在巨大的数据表中的快速查找、更新;
HBase内部将数据存储在索引后的数据文件中,这些数据文件被保存到了HDFS中。

Catalog Tables

        HBase的目录表:hbase:meta会被HBase的shell命令:list过滤,list命令不会显示出它,但是它确实是实际存在的一个独立的表;

-ROOT-

        -ROOT-表从0.96开始已经被移除了。
        -ROOT-表用来追踪.META表的的位置(.META是hbase:meta的之前的旧名字)-到0.96版本
        -ROOT-表的结构如下:
  • KEY
    • .META. region key (.META.,,1)
  • VALUE
    • info:regininfo(序列化的HRegionInfo,hbase:meta实例)
    • info:server(拥有hbase:meta的服务器server:port)
    • info:serverstartcode(拥有hbase:meta的服务器进程的启动时间)

hbase:meta

        hbase:meta保存了一个系统分区的列表,这个列表之前是通过-ROOT-来追踪定位的,现在它保存到了Zookeeper上;它的结构如下:
  • KEY
    • 分区主键([table],[region start key],[region id]
  • VALUES
    • info:regininfo(region的序列化的HRegionInfo实例)
    • info:server(regionServer的server:port)
    • info:serverstartcode(regionServer进程的启动时间)
        如果一个table正在进行分割,那么两个额外的列会被创建:info:splitA, info:splitB, 这两个列代表了两个孩子分区,他们的值仍然是序列化之后的HRegionInfo实例,当分割结束时,当前这一行也会同时被删除;
HRegionInfo说明:
        HRegionInfo中的空白key用来标识table的开始和结束;如果一个region start key为空,则标识它是一个表的开始第一个分区;如果start key和end key都为空,则该分区是该表的唯一分区;

启动排序

        首先,hbase:meta信息是从zookeeper上进行查找的,另外,hbase:meta会根据服务器地址和启动时间进行更新;

Client和ClientFilters以后的blog再总结

Master(主节点)

        HMaster是MasterServer的实现,MasterServer负责监控集群中所有RegionServer节点,也是所有元数据变化的接口;在一个分布式集群中,MasterServer实际上是运行在一个NameNode上。

启动行为

        如果运行在一个多主服务的集群上,所有的主服务都会启动完毕准备操作整个集群。当当前活动的主节点丢失时(可能是丢失到zookeeper的连接或重启),另外一个闲置的主节点就会马上接管整个集群;

运行时的影响

        一个经常被提及的问题是,当单master节点的集群中,master down机会产生什么影响?因为所有的regionServer节点都与master节点直接通信,结果是down机后整个集群会处在一个相对稳定的状态;因为保存hbase:meta表数据不存在master节点上,而是在zookeeper上,但是Master控制了所有regionServer的故障转移以及数据分割,因此Master应该尽快的被启动起来;

接口

        HMasterInterface暴露的接口主要是面向元数据的:
  • 表操作 (createTable, modifyTable, removeTable, enable, disable)
  • 列族 (addColumn, modifyColumn, removeColumn)
  • 分区Region (move, assign, unassign)
        例如,HbaseAdmin调用disableTable是通过Master Server来完成的;

进程

        Master运行了几个后台线程;
  • LoadBalancer(负载均衡)
    • 定时或当所有region都没有请求时,LoadBalancer会启动,移动Region来实现集群的负载均衡;
  • CatalogJanitor(目录看管)
    • 定时检查并清理hbase:meta表中的数据;

RegionServer

        HRegionServer是RegionServer的实现;负责服务和维护分区(regions);RegionServer运行在DataNode上。

接口

        HRegionRegionInterface暴露出的接口是面向分区维护和数据维护的:
  • 数据(get, put, delete, next, 等等.)
  • 分区 (splitRegion, compactRegion, 等.)

进程

        RegionServer运行了不同种类的后台线程:
  • CompactSplitThread
    • 检查数据分割,负责小型数据合并(minor compaction)
  • MajorCompactionChecker
    • 大型数据合并的检查
  • MemStoreFlusher
    • 定时将内存中的数据写到文件存储中;
  • LogRoller
    • 定时检查RegionServer的HLog

Coprocessors

        在0.92版本被添加进来;更多信息可以参考Blog Overview of CoProcessors 

Block Cache

        HBase提供了三种不同的块缓存,分别是使用堆实现的LruBlockCache,以及非堆实现的BucketCache, SlabCache;
  • 缓存的选择
    • LruBlockCache是块缓存的原始实现,它完全在java堆中。BucketCache和SlabCache被设计用来在堆外存储数据的,当然也可以保存到堆或者文件中;注意,SlabCache现在不被推荐,并且要在1.0.0版本移除;
    • BucketCache是更多产品化部署的首选并且有更多的配置项;相对于堆内实现的LruBlockCache,BucketCache可能会在读取数据时稍慢,但是相比较堆内的GC次数更少,BucketCache因此会更稳定;
    • 一些证据表明BucketCache比SlabCache有更少的GC次数,因此BucketCache会更稳定;之所以说SlabCache有更多的垃圾回收次数,原因是在SlabCache中,数据会从L1移动到L2,也就是激活了SlabCache配置,等于是激活了一个两层缓存系统;它的实现类是:DoubleBlockCache,当一个数据从L1中消失时,会被移动到L2层;
    • BucketCache 的实现类是:CombinedBlockCache。所有的数据块都被保存到了BucketCache,而元数据块,例如索引和Bloom数据块都被保存到了LruBlockCache;

Write Ahead Log (WAL)

        写前日志WAL记录了所有的HBase的数据变动,并存储到磁盘文件中;WAL之所以会有价值,是因为数据是定时从内存存储写入到文件中的,当写入操作未完成但是RegionServer却down机时,WAL保证这些数据可以被重新读取;如果写入WAL失败,整个写入将会返回失败;
        HBase使用HLog来实现保存WAL。一般每个RegionServer实例只有一个WAL实例,在写入MemStore之前,HBase会先将日志写入WAL。
WAL在HDFS中的目录位于每个regionserver子目录下的/hbase/WALs;

没有评论:

发表评论