回答思路:
简介:
高可靠性、高性能、面向列、可伸缩的分布式存储系统
数据模型:
- Row Key:Column Family:Timestamp:
Rowkey的概念和mysql中的主键是完全一样的,Hbase使用Rowkey来唯一的区分某一行的数据。
列族存储,Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
TimeStamp对Hbase来说至关重要,因为它是实现Hbase多版本的关键。在Hbase中使用不同的timestame来标识相同rowkey行对应的不通版本的数据。
-
{row key, column family, column qualifier, version} 唯一确定的单元。
-
当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,不同的region会被Master分配给相应的RegionServer进行管理:
-
HBase中有两张特殊的Table,-ROOT-和.META.
Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到User Table的位置去访问,中间需要多次网络操作,不过Client端会做cache缓存。
系统架构
Hbase是由Client、Zookeeper、Master、HRegionServer、HDFS等几个组建组成
Hbase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。
Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。
稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
Hbase会将一个大表的数据基于Rowkey的不同范围分配到不通的Region中,每个Region负责一定范围的数据访问和存储。这样即使是一张巨大的表,由于被切割到不通的region,访问起来的时延也很低。
存储格式
HFile
HLogFile
读写流程
写分为3步骤:
第1步:Client获取数据写入的Region所在的RegionServer
第2步:请求写Hlog
第3步:请求写MemStore
如果想快速读取数据,通用的原则是数据保持有序 并 尽可能保存在内存里。HBase实现了这两个目标。
HBase提供三维有序存储,首先以rowkey字典序,然后以column family + column qualifier字典序,最后单元格是以timestamp时间戳降序排序。
HBase读操作使用了LRU缓存技术,这种缓存叫做BlockCache,用来保存从HFile里读入内存的频繁访问的数据。
从HBase读数据,会依次访问三个地方:首先检查MemStore,然后检查BlockCache,最后才会访问硬盘上的对应HFile。
当StoreFile文件数量达到一定阈值,会触发compaction;当单个StoreFile大小超过一定阈值后,会触发split。
为了提高Hbase的写入性能,当写请求写入MemStore后,不会立即刷盘。而是会等到一定的时候进行刷盘的操作。
2.1、全局内存控制
2.2、MemStore达到上限
2.3、RegionServer的Hlog数量达到上限
2.4、手工触发
2.5、关闭RegionServer触发
2.6、Region使用HLOG恢复完数据后触发
Hlog实现的功能就是我们前面讲到的保证数据安全。当RegionServer出现问题的时候,能跟进Hlog来做数据恢复。此外为了保证恢复的效率,Hbase会限制最大保存的Hlog数量,如果达到Hlog的最大个数(hase.regionserver.max.logs参数控制)的时候,就会触发强制刷盘操作。对于已经刷盘的数据,其对应的Hlog会有一个过期的概念,Hlog过期后,会被监控线程移动到 .oldlogs,然后会被自动删除掉。
Master启动数据恢复流程后,其实主要的流程如下:
RegionServer宕机---》ZK检测到RegionServer异常---》Master启动数据恢复---》Hlog切分---》Region重新分配---》Hlog重放---》恢复完成并提供服务
网友评论