HBase架构解析

Client

1.包含访问HBase的接口,比如:linux shell、java api
2.维护Cache来加块访问Hbase的速度,比如:region的位置信息

Zookeeper

1.通过选举机制,监控HMaster的状态,保证任何时候集群中只有一个活跃的HMaster,实现高可用。HMaster和HRegionServer启动时会向Zookeeper进行注册
2.存储所有HRegion的寻址入口,例如:.meta.表在哪台服务器上
3.实时监控HRegionServer的状态,感知HRegionServer的上下线信息,并通知HMaster
4.存储HBase的Schema和Table的部分元数据

HMaster

1.为HRegionServer分配HRegion
2.负责HRegionServer的负载均衡
3.负责HRegion的重新分配,例如:HRegionServer宕机之后的HRegion分配;HRegion过大之后的拆分控制
4.处理HDFS上的垃圾文件回收
5.处理Scheme的更新请求

HRegionServer

1.维护HMaster分配的HRegion(管理本机的Region)
2.处理Client对这些Region的读写请求,并和HDFS进行交互
3.负责切分在运行过程中逐渐变大的HRegion

  Client访问HBase上的数据并不需要HMaster参与。寻址访问Zookeeper和HRegionServer,数据读写需要访问HRegionServer。HMaster仅仅维护Table和HRegion的元数据信息。并且Table的部分元数据信息保存在Zookeeper上,因此HMaster的负载很低
  HRegionServer存取一个子表时,首先会创建一个HRegion对象,然后对表的列族创建一个或多个Store对象,每个Store对象都会有一个MemStore和零或多个StoreFile与之相对,每个StoreFile都会对应一个HFile,HFile就是实际的存储文件。因此,一个HRegion有多少列族就有多少个Store,一个HRegionServer会有多个HRegion和一个HLog

HLog

  WAL(Write-Ahead-Log ):预写日志,从名字就可以看出它的用途,就是“预先写入”的含义,该机制用于数据的容错和恢复。每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,当Client提交的操作到达HRegionServer的时候,HBase会先把操作写到HLog文件里去,然后HBase会再把数据放在基于内存实现的MemStore里。HLog文件定期会创建新的文件,并删除保存已持久化到StoreFile中的数据的旧文件。当HRegionServer发生故障,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同HRegion的Log数据进行拆分,分别放到相应HRegion的目录下,然后再将失效的HRegion重新分配 。接收到这些HRegion的HRegionServer在Load HRegion的过程中,会发现并处理遗留的HLog,并Replay HLog到MemStore中,并flush到StoreFile,完成数据恢复

HRegion

1.HBase中分布式存储和负载均衡的最小单元,它是表或者表的一部分
2.相当于一个数据分片,以Table中的行进行切分,每个Region都有起始的rowkey和结束的rowkey,表示它存储的row范围
3.每一个HRegion内部含有多个Store实例
4.默认一个HRegion超过256M就要被分割成两个,这个过程由HRegionServer实现

Store

  每个Store都对应一个列族的数据,如果一个表中有两个列族,那么在一个HRegion里面就有两个Store,而每一个Store内部都有一个MemStore和多个StoreFile

Memstore

  数据被写入WAL之后,就会被加载到MemStore中,然后随着大小的增加到一定阀值的时候就会被写到HDFS上,以HFile的形式持久化存储

  设计MemStore的原因有以下几点
  1.由于HDFS上的文件不可修改,只能创建、追加、删除。对于一个数据库来说,按顺序进行存放数据是非常重要的。(性能得以保障,提高读取效率,所以我们不应该按照数据到来的顺序来写入到磁盘。那就需要使用内存先把数据整理成顺序存放,然后再写入磁盘,这就是MemStore存在的意义。不过不要想当然的认为读取数据也就是读取MemStore再读取磁盘,读取的时候要有专门的缓存叫BlockCache,这个BlockCache如果开启了,就先读取BlockCache,读不到菜户读取HFile+MemStore
  2.优化数据的存储,比如一个数据添加后过一会就要删除,这样在flush的时候就可以不把这个数据写到HDFS上

StoreFile

  StoreFile是一个逻辑概念,MemStore内存中的数据写入到文件后就就是StoreFile,StoreFile的底层是以HFile的格式进行存储的

HFile

1.HFile是数据存储的实际载体,因为HBase是基于Java编写的,那么所有物理上的实体都有一个对象与之相对,在物理存储上我们管StoreFile flush而成的文件叫HFile,StoreFile是HFile的抽象类
2.在StoreFile的实例中,数据是由一个一个的数据块组成的,HBase中的一个块大小默认是64KB,由列族上的BLOCKSIZE属性来定义,内部主要存储的就是KV对

猜你喜欢

转载自www.cnblogs.com/JoshWill/p/11564227.html
今日推荐