HBase基本原理介绍(0.98) 2015-04-09 11:00

特点

  1. BigTable-Like
  2. KeyValue
  3. 面向列
  4. 线性扩展
  5. 强一致性
  6. 高可靠
  7. 字典排序

系统架构图

基本概念

Region

  • 将一个数据表按Key值范围横向划分为一个个的子表,实现分布式存储。
  • 这个子表,在HBase中被称作“Region”。
  • 每一个Region都关联一个Key值范围,即一个使用StartKey和EndKey描述的区间。事实上,每一个Region仅仅记录StartKey就可以了,因为它的EndKey就是下一个Region的StartKey。
  • Region是HBase分布式存储的最基本单元。

RegionServer

  • RegionServer是HBase的数据服务进程。负责处理用户数据的读写请求。
  • Region被交由RegionServer管理。实际上,所有用户数据的读写请求,都是和RegionServer上的Region进行交互。
  • Region可以在RegionServer之间发生转移。

思考:
一个Region包含了一个Startkey和EndKey范围;一条用户数据KeyValue必然属于一个唯一的Region; Region由RegionServer来管理,那么,这个路由信息保存在哪里呢?Region如何才可以转移?由谁负责转移?

Region分类

  • Region分为Meta Region以及用户Region两类。
  • Meta Region记录了每一个User Region的路由信息。
  • 读写Region数据的路由,包括如下几步:
    1、 找寻找寻Meta Region地址。
    2、 再由Meta Region找寻User Region地址。

备注:在0.9以前的版本,元数据Region包含Root Region和Meta Region两类。从0.9版本开始,HBase去掉了Root Region。客户端直接通过Meta Region获取User Region的信息。Meta Region跟其他Region一样,由Region Server管理。具体由哪一个Region Server管理尖Zookeeper中——这由HMaster启动时注册到Zookeeper中。

思考: Root Region的信息保存在哪里?

Master

  • Master进程负责管理所有的RegionServer。
  • 新RegionServer的注册。
  • 运行期间的负载均衡保障。
  • RegionServer Failover处理。
  • 负责建表/修改表/删除表以及一些集群操作。
  • Master进程负责所有Region的转移操作。
  • 新表创建时的Region分配。
  • 运行期间的负载均衡保障。
  • RegionServer Failover后的Region接管。
  • Master进程有主备角色。集群可以配置多个Master角色,集群启动时,这些Master角色通过竞争获得主Master角色。主Master只能有一个,所有的备Master进程在集群运行期间>处于休眠状态,不干涉任何集群事务

思考: 主备Master进程角色是如何进行裁决的?

Zookeeper

  • 提供分布式锁的服务。 例如,多个Master进程竞争主Master角色时,怎么样保证仅有一个Active角色存在?这就需要一个分布式的锁机制来保证。 多个Master进程都尝试着去ZooKeeper中写入一个对应的节点,该节点只能被一个Master进程创建成功,创建成功的Master进程就是Active角色。
  • 提供了事件监听机制。 例如,主Master进程宕掉之后,其它的备Master如何能够快速的接管?这个过程中,备Master在监听那个对应的 ZooKeeper节点。主Master进程宕掉之后,该节点会被删除,那么,其它的备Master就可以收到相应的消息。
  • 个别场景,可充当一个微型数据库角色。例如,在ZooKeeper中存放了Root Region的地址(Root Region原来是存在ZooKeeper中的!),此时,可以将它理解成一个微型数据库。

相关流程

数据写入过程

数据先写入MemStore中,然后MemStore定期Flush成HFile。为意外重启导致未Flush到HFile中的数据丢失,在数据写入MemStore之前,会先写HLog。这样,一旦HBase意外重启,可以通过HLog恢复数据。

Flush、Compact和Split

WAL

  • 为避免因RegionServer故障,导致MemStore中尚未Flush到HFile中的数据丢失。数据写入MemStore之前,需要先写Write Ahead Log(WAL)。RegionServer恢复时,可以通过WAL恢复数据。如果WAL写失败,客户端可感知到数据写入失败。
  • 在HBase中,WAL的实现为HLog。WAL中每一条日志为edit
  • 同一个RegionServer下的所有Region共用一个WAL。数据恢复时,需要按各个Region分别恢复数据。而WAL混杂了所有Region的edit。因此,在数据恢复前,需要按照Region拆分出各个Region的edit。这个过程称为log splitting
  • log splitting在HMaster启动时或者在RegionServer关闭时触发。
  • WAL可以关闭以提升性能,但需要解决数据可能丢失的问题。关闭WAL一般只在特殊场景下使用,比如通过BulkLoad批量导入数据时。此时,如果导入数据失败,MapReduce可以重新执行,以避免数据丢失。

Locality

  • HBase遵循HDFS的复本放置策略。
  • 新写入的数据会在本地节点放置一个复本。因此读写时能够利用HDFS的本地性。
  • 对于Failover的RegionServer,由于本地没有复本,不能利用本地性。
  • Failover后的Region,如果有Compact操作,会在HDFS本地性。因此Compat是删除并重新生成HDFS文件。Failover后的Region,新写入的数据也会有本地性。
Tags: #HBase    Post on Hadoop