这次我们主要介绍HBase的架构和原理
- 组件介绍
- 读写流程介绍
- 路由查询
组件介绍
HBase的架构介绍图
Client
- ①使用HBase RPC机制与HMaster和HRegionServer进行通信;
- ②Client与HMaster进行通信进行管理类操作;
- ③Client与HRegionServer进行数据读写类操作。
Zookeeper
- ①保证任何时候,集群中只有一个running master,避免单点问题;
- ②存贮所有Region的寻址入口,包括-ROOT-表地址、HMaster地址;
- ③实时监控Region Server的状态,将Region server的上线和下线信息,实时通知给Master;
- ④存储Hbase的schema,包括有哪些table,每个table有哪些column family。
PS:注意
这里再存储元数据信息的时候,随着数据的存储数量的增大,zookeeper的内存使用量会增大,不堪重负。这里我们会引入metaData特有的元数据存储信息机制。基本思想是:向上抽象。在查询路由中介绍
HMaster
可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。
角色功能:
- ①为Region server分配region;
- ②负责region server的负载均衡;
- ③发现失效的region serve并重新分配其上的region;
- ④GFS上的垃圾文件回收;
- ⑤处理用户对标的增删改查操作。
HRegionServer
HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据。
作用:
- ①维护Master分配给它的region,处理对这些region的IO请求;
- ②负责切分在运行过程中变得过大的region。
- 此外,HRegionServer管理一些列HRegion对象,每个HRegion对应Table中一个Region,HRegion由多个HStore组成,每个HStore对应Table中一个Column Family的存储,Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效。
HStore
HBase存储的核心,由MemStore内存存储和StoreFile磁盘存储组成。
HRegion
一个表最开始存储的时候,是一个region。
一个Region中会有个多个store,每个store用来存储一个列簇。如果只有一个column family,就只有一个store。
region会随着插入的数据越来越多,会进行拆分。默认大小是10G一个。
HLog
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。
- 工作机制:
- 每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。-
- 当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
读写流程介绍
文件存储的原理
- Client通过Zookeeper的调度,向RegionServer发出写数据请求,在Region中写数据。
- 数据被写入Region的MemStore,直到MemStore达到预设阈值。
- MemStore中的数据被Flush成一个StoreFile。
- 随着StoreFile文件的不断增多,当其数量增长到一定阈值后,触发Compact合并操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除。
- StoreFiles通过不断的Compact合并操作,逐步形成越来越大的StoreFile。
- 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个新的Region。父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上,使得原先1个Region的压力得以分流到2个Region上。
- 可以看出HBase只有增添数据,所有的更新和删除操作都是在后续的Compact历程中举行的,使得用户的写操作只要进入内存就可以立刻返回,实现了HBase I/O的高机能。
读取操作流程(查询路由)
- client访问Zookeeper,查找-ROOT-表,获取.META.表信息。
- 从.META.表查找,获取存放目标数据的HRegion信息,从而找到对应的HRegionServer。
- 通过HRegionServer获取需要查找的数据。
- HRegionserver的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。