从图中可以看出Hbase是由Client、Zookeeper、HMaster、HRegionServer、HDFS等几个组件组成:
ClientClient是整个Hbase集群的访问入口,它维护了对应的cache(Block Cache)来加速Hbase的访问,比如cache的.META元数据的信息等。 Client使用Hbase RPC机制与HMaster和HRegionServer通信:
- 与HMaster通信进行管理类的操作
- 与HRegionServer通信进行行读写类的操作
HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。
Zookeeper Quorum中除了存储ROOT表的地址和HMaster的地址外,还存储了HRegionServer的注册信息。HRegionServer把自己以Ephemeral的方式注册到Zookeeper中,这样HMaster就可以随时感知到各个HRegionServer的健康状态。
Zookeeper的具体工作如下:
- Zoopkeeper可以保证任何时候集群中只有1个HMaster(HA)在运行。如果HMaster异常,会通过竞争机制产生新的HMaster提供服务
- 实时监控RegionServer的上线和下线信息,并实时通知给HMaster。即,通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知HMaster RegionServer上下线的信息
- Zoopkeeper中存储了所有HRegion的寻址入口。即,HBase是通过Zoopkeeper存储元数据的统一入口地址的
- Zoopkeeper中存储了Hbase的schema和table的元数据以及其它信息:HMaster需要知道哪些HRegionServer是活的、可用的以及HRegionServer的位置信息,以便管理,所有这些信息都有Zookeeper提供
Hbase与Zookeeper的关系
- Hbase元数据存储在Zookeeper中
- 默认情况下,Hbase管理Zookeeper实例,比如启动或停止Zookeeper
- Zookeeper通过选举机制解决Hbase单节点故障问题
- HMaster与HRegionServer启动时会向Zookeeper注册
HMaster没有单点问题。理论上HBase中可以启动多个HMaster,但是通过Zookeeper的Master Election机制会保证总有一个HMaster在运行。 HMaster在功能上主要负责Table和HRegion的管理工作。
HMaster的主要职责如下:
- 维护整个集群的负载均衡
- 维护集群的元数据信息
- 管理用户对Table本身的增、删、改、查操作。
- 管理HRegionServer的负载均衡,调整Region分布
- 在Region Split后,负责新Region的分配
- 在HRegionServer停机后,负责失效HRegionServer上的Regions的迁移工作
- 为HRegionServer分配Region
- 发现失效的Region,并将失效的Region分配到正常的HRegionServer上
- 当HRegionSever失效的时候,协调对应Hlog的拆分
注意:HMaster失效仅会导致所有元数据无法被修改,表的数据读写还是可以正常进行。
HRegionServerHRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。 HRegionServer直接对接用户的读写请求,是真正的“干活”的节点。 HRegionServer内部管理了一系列HRegion对象。每个HRegion对应了Table中的一个 Region。
HRegion由多个HStore组成,每个HStore对应了Table中的一个列簇的存储。 注:每个列簇其实就是一个集中的存储单元,因此最好将具备共同IO特性的列放在一个列簇中,这样最高效。
HStore存储是HBase存储的核心,它由MemStore和StoreFiles两部分组成。 用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile)。当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除。
可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的。这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。
当StoreFiles Compact后,会逐步形成越来越大的StoreFile。当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region Split成2个Region,父Region会下线,新Split出的2个子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上。
在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。每个HRegionServer中都有一个HLog对象,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中,HLog文件会定期滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。 当HRegionServer意外终止后,HMaster会通过Zookeeper感知到。此时,HMaster首先会处理HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
HRegionServer的功能概括如下:
- 维护HRegion并往HDFS中写数据
- 负责和底层HDFS的交互,存储数据到HDFS
- 在HRegionServer停机后,负责失效HRegionServer上的Region的迁移
- 管理master为其分配的Region
- 处理来自客户端的读写请求
- 当表的大小超过设置值的时候,负责Region的拆分
- 负责Storefile的合并工作
注意:
- Client访问hbase上数据时并不需要HMaster参与,数据的读写也只是访问HRegioneServer。HMaster仅仅维护着table和Region的元数据信息,负载很低。
- HBase是通过DFS client把数据写到HDFS上的
- 每一个HRegionServer有多个HRegion,每一个HRegion有多个Store,每一个Store对应一个列簇。
- HFile是StoreFile的存储格式,它是一个二进制格式文件。StoreFile就是对HFile进行了封装(其实就是一个东西),然后进行数据的存储。
- HStore由一个MemStore和多个StoreFile组成。
- HLog记录数据的变更信息,用来做数据恢复。
HDFS为Hbase提供最底层的数据存储服务,同时为HBase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:
- 提供元数据和表数据的底层分布式存储服务
- 数据多副本,高可靠和高可用性