HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。 分布式
HRegionServer内部管理了一系列HRegion对象,每一个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每一个HStore对应了Table中的一个Column Family的存储,能够看出每一个Column Family其实就是一个集中的存储单元,所以最好将具有共同IO特性的column放在一个Column Family中,这样最高效。 性能
HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用户写入的数据首先会放入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上。下图描述了Compaction和Split的过程: spa
在理解了上述HStore的基本原理后,还必须了解一下HLog的功能,由于上述的HStore在系统正常工做的前提下是没有问题的,可是在分布式系统环境中,没法避免系统出错或者宕机,所以一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就须要引入HLog了。每一个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操做写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件按期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会经过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不一样Region的Log数据进行拆分,分别放到相应region的目录下,而后再将失效的region从新分配,领取 到这些region的HRegionServer在Load Region的过程当中,会发现有历史HLog须要处理,所以会Replay HLog中的数据到MemStore中,而后flush到StoreFiles,完成数据恢复。 对象