HBase - HMaster组件模式解析

HMaster是HBase的一个重要组成部分(HBase的架构体系可以参考蒋鸿翔大神的一篇ks文章:《HBase原理和设计》),主要有三个重要的职责:

1. 负责响应用户页面请求。用户通常通过访问http://MasterHost:60010就可以通过界面查看HBase集群的相关信息。

2. 响应用户部分Admin操作请求。用户可以通过客户端执行建表、删表等操作。

3. RS分布式管理、Region重新分配等功能。

可以这样说,HMaster就是HBase的大脑,它借助于Zookeeper实现了对RS的分布式管理,在功能上类似于HDFS中的NameNode。这也是当前最盛行的分布式体系架构:M-Z-S(Master-Zookeeper-Slaves)体系架构,HMaster扮演了协调者的角色,Zookeeper扮演了中介的角色,而RegionServer则是HBase实际的工作者。在这样的体系下,HMaster并不真正响应客户端的读写请求,所以正常情况下实际负载并不很高,这也是 M-Z-S体系能够稳定工作的前提之一。

这篇文章从HMaster内部组件的视角对HMaster进行一次解析,希望可以通过这种解剖式地方法更好地了解HBase是如何正常运转的(这篇文章是基于HBase 0.98版本源码,因为该版本相较于之前版本无论代码还是目录文件有较大的改动,请看官留意!)。下图是HMaster的组件架构图:

External Interfaces :

  • InfoServer

  Info Server是HBase内嵌的一个jetty服务器,主要用来响应用户的页面请求,默认端口为60010。可以通过修改hbase-site.xml中hbase.master.info.port属性值来改变端口

  • RpcServer

          Rpc Server可看作一个基于NIO机制(selector)实现的netty服务器。基本原理是首先创建一个Listenner线程监听客户端请求,一旦有connection进来,服务器会新建一个Reader线程,读取传输的数据并反序列化为Call对象,再将该对象交由Schedule对象进行安排,根据call对应的优先级交给不同的Executor(PriorityExecutor, ReplicationExecutor, CallExecutor), Executor再调用对应的handler线程进行执行。具体见下图:


Zookeeper System Trackers:

          HMaster和RS使用Zookeeper监测、处理并响应集群中的特定事件。在Master中,代理类ZookeeperWatcher在Zookeeper和所有的trackers之间搭建了一个桥梁,ZookeeperWatcher集中监听Zookeeper节点发生的变化,并封装为一定的实体分发给对应的tracker进行处理。因此,所有的tracker都需要在此对自己感兴趣的事件进行注册。下图为zk的节点层次图:


接下来分别看看所有的tracker:

  • Active Master Manager

在HBase体系架构下,Master以主备的形式存在,这样就不会存在单点问题。Master选主通过Zookeeper实现,HBase启动的时候主备都会注册/hbase/master节点,只有仅有一个可以注册成功,成为Leader。备机就一直处于阻塞状态,直至/hbase/master节点发生delete事件,ZookeeperWatcher监听到此事件,唤醒阻塞的备机,备机再次去/master节点注册,如果注册成功就会成为主机,对外提供服务。如果注册失败,说明已经有节点注册成功,就只能再次阻塞等待被唤醒。

  • Region Server Manager

         该Manager注册在/hbase/rs节点下,如果该节点下有子节点创建、删除,就会调用该类中相应的方法维护一份在线rs列表。

  • Assignment Manager

         注册在/hbase/region-in-transition节点,跟踪管理并执行Region的分配。包括RS的open操作、close操作、split操作、merge操作等等。

  • Catalog Tracker

         对MetaRegionTracker的封装,注册在/meta-region-server节点,用于跟踪并管理(设置并获取)Meta Region的位置。可以在zk命令行执行get /hbase/meta-region-server查看Meta Region位于那个RS上。

  • LoadBanlancer Tracker

        注册在/balancer节点,用于跟踪Load Balancer是否开启。用于LoadBanlancer类中负载均衡banlance()方法,判断banlancer是否开启。

Executor Services:

         Master中通用的Executor Services组件,通过ConcurrentHashMap<String, Executor> executorMap管理维护了一组executor。一个executor包括一个线程池、一个任务队列和一组实现了Runnable的EventHandler。通过执行instance.startExecutorService("myService")创建一个service,然后执行submit(final EventHandler eh)运行对应的service。除此之外,用户还可以给service注册Listener,该组件会在用户执行service之前自动执行Listener中定义的pre方法,在之后执行post方法。下面列出了Master中常见的Service和EventHandler:

  • Open Region Service - RS_ZK_REGION_OPENED - OpenedRegionHandler

          Assignment Manager通过ZookeeperWatcher监听到一个Region被成功open,就会生成一个类型为RS_ZK_REGION_OPENED的Service,并交给OpenedRegionHandler进行处理。

  • Close Region Service - RS_ZK_REGION_CLOSED - ClosedRegionHandler

          Assignment Manager通过ZookeeperWatcher监听到一个Region被成功close,就会生成一个类型为RS_ZK_REGION_CLOSED的Service,并交给ClosedRegionHandler进行处理。

  • Server Operation Service -M_SERVER_SHUTDOWN/.. - ServerShutdownHandler/..

          Assignment Manager通过ZookeeperWatcher监听到一个RS离线,会调用ServerManager的expireServer方法,该方法会生成一个M_SERVER_SHUTDOWN的Service,并交给ServerShutdownHandler进行处理。

  • Table Operation Service - C_M_CREATE_TABLE/C_M_DELETE_TABLE/C_M_MODIFY_TABLE/... - CreateTableHandler/DeleteTableHandler/ModifyTableHandler/.. 

         Rpc Server接受用户创建table的请求,就会生成一个类型为C_M_CREATE_TABLE的Service,并交给CreateTableHandler进行处理。其余类似。


File System Interfaces:

       作为Master最底层接口,主要负责与底层文件系统进行交互,管理数据的实际落盘以及各种清理工作。

  • MasterFileSystem :

       最核心的底层文件系统交互类,主要提供了split log文件、检查文件系统状态等接口

  • Log Cleaner

       大家都知道HBase的写是基于WAL的,因此在写数据的时候首先会写到WALs文件夹里的log文件里,如果log中的数据被持久化到hdfs,系统就会将这些无用的log移到oldWALs文件夹下,LogCleaner就会定期清理oldWALs文件夹中的log日志

  • HFile Cleaner

        用户可以在创建表的时候可以设置表级别的过期时间(ttl),HFileCleaner会定期判断哪些HFile已经过期,并清理这些已经过期的HFile。


总结:

这篇文章主要从HMaster组件的角度对其进行了分析,从架构上可以看出整个HMaster有两条信息流:

1. 外部交互信息流:Client  —>  InfoServer/RpcServer —>  Executor Services

2. 内部控制信息流:RS —> Zookeeper —>  ZookeeperWatcher  —>  Trackers —> Executor Services

外部交互信息流用以响应用户的页面请求以及各种Table操作请求,而内部控制信息流则用以实现HBase分布式管理。

除此之外,通用Executor Service组件和通用Zookeeper Watcher组件也是Master架构设计中的一大亮点。

本文来自网易实践者社区,经作者范欣欣授权发布。