HBase的体系结构借鉴了BigTable论文,是典型的Master-Slave模型。
1.HBase客户端
HBase客户端提供了Shell命令行接口、原生Java API编程接口、Thrift/REST API编程接口以及MapReduce编程接口。HBase客户端支持所有常见的DML操作以及DDL操作,即数据的增删改查和表的日常维护等。其中Thrift/REST API主要用于支持Java的上层业务需求,MapReduce接口主要用于批量数据导入以及批量数据读取。
HBase客户端访问数据行之前,首先需要通过元数据表定位目标数据所在的RegionServer,之后才会发送请求到该RegionServer。同时这些元数据会被缓存在客户端本地,以方便之后的请求访问。如果集群RegionServer发生宕机或者执行了负载均衡等,从而导致数据分片发生迁移,客户端需要重新请求最新的元数据并缓存在本地。
2.zookeeper
- HBase通过Zookeeper来做Master的高可用,通常情况下系统中只有一个Master工作,一旦Active Master由于异常宕机,ZK会检测到该宕机事件,并通过一定机制选举出新的Master,保证系统正常运转。
- 管理系统的核心元数据:比如管理当前系统中正常工作的RegionServer集合,保存系统元数据表hbase:meta所在的RegionServer地址等。
- 参与RegionServer宕机恢复:Zookeeper通过心跳可以感知到RegionServer是否宕机,并在宕机后通知Master进行宕机处理。
- 实现分布式锁:HBase中对一张表进行各种管理操作需要先加表锁,防止其他用户对同一张表进行管理操作,造成表状态不一致。和其他RDBMS表不同,HBase中的表通常都是分布式存储,Zookeeper可以通过特定机制实现分布式表锁。
3.Master
Master主要负责HBase系统的各种管理工作,其实现类为HMaster,主要作用如下:
- 处理用户的各种管理请求,包括对表的各种操作:create, delete, alter(表级别的管理操作),还有切分表、合并数据分片以及Compaction。
- 管理集群中所有RegionServer,包括RegionServer中Region的负载均衡、RegionServer的宕机恢复以及Region的迁移等。
- 清理过期日志以及文件,Master会每隔一段时间检查HDFS中HLog是否过期、HFile是否已经被删除,并在过期之后将其删除。
4.RegionServer
RegionServer主要用来响应用户的IO请求,是HBase中最核心的模块,由WAL(HLog)、BlockCache以及多个Region构成。
WAL(HLog)
HLog在HBase中有两个核心作用:
? 1. 用于实现数据的高可靠性,HBase数据随机写入时,并非直接写入HFile数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入HLog,这样,即使缓存数据丢失,仍然可以通过HLog日志恢复。
? 2. 用于实现HBase集群间主从复制,通过回放主集群推送过来的HLog日志实现主从复制。
BlockCache
HBase系统中的读缓存。客户端从磁盘读取数据之后通常会将数据缓存到系统内存中,后续访问同一行数据可以直接从内存中获取而不用访问磁盘。对于带有大量热点数读的业务请求来说,缓存机制会带来极大的性能提升。
Region
Region就是类似于表的概念,在HBase中它是一张表进行横向切分的切片,横跨多个列族。当数据表大小超过一定阈值就会“水平切分”,分裂为两个Region。Region是集群负载均衡的基本单位。通常一张表的Region会分布在整个集群的多台RegionServer上,一个RegionServer上会管理多个Region,当然,这些Region一般来自不同的数据表。
一个Region由一个或者多个Store构成,Store的个数取决于表中列族的个数,多少个列族就有多少个Store。HBase中,每个列族的数据都集中存放在一起形成一个存储单元Store,因此建议将具有相同IO特性的数据设置在同一个列族中。
Store
每个Store由一个MemStore和一个或者多个HFile组成。MemStore称为写缓存,由于HFile 中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,当MemStore写满之后(缓存数据超过阈值,默认128M)系统会异步地将数据flush成一个HFile文件。显然,随着数据的不断写入,HFile文件会越来越多,当HFile文件数超过一定阈值之后系统将会执行Compact操作,将这些小文件通过一定策略合并成一个或者多个大文件。数据在每个HFile中都是有序的。
RegionServer为Region的管理者(数据级别的管理),其实现类为HRegionServer,它可以实现如下具体的操作:
- 对于数据的操作:get, put, delete;
- 对于Region的操作:splitRegion、compactRegion。
5.HDFS
HDFS为HBase提供最终的底层数据存储服务,包括用户数据文件、HLog日志文件等最终都会写入HDFS落盘。同时HDFS默认的三副本存储策略可以有效保证数据的高可靠性。HDFS内部封装了一个名为DFSClient的HDFS客户端组件,负责对HDFS的实际数据进行读写访问。
6.注意
从HBase的结构图可以看出,用户Client并没有和Master直接相连,而是直接连接的zookeeper,zookeeper承担了一部分Master的功能,Client除了连接zookeeper还连接了RegionServer,所以即使Master挂掉了,用户客户端依旧可以完成对数据的读写操作。
HBase系统特性
优点
- 容量巨大,HBase单表支持千亿行、百万列的数据规模,数据容量可以达到TB甚至PB级别。
- 良好的扩展性:HBase集群可以方便的实现集群容量扩展,主要包括数据存储节点扩展以及读写服务节点扩展。
- 稀疏性:HBase支持大量稀疏存储,即允许大量列值为空(不用null进行填充),并不占用任何存储空间。所以HBase可以存储多至上百万列的数据,即使存在大量的空值,也不需要任何额外空间。
- 多版本:用户可以根据需要选择最新版本或者历史版本的数据。
缺点
- 不支持很复杂的聚合运算,如Join、GroupBy
- HBase本身没有实现二级索引功能,所以不支持二级索引查找。