概述
NoSQL
HBase是一种NoSQL型数据库。支持通过增加RegionServer,在存储容量和操作性能上同时进行拓展。
HBase一些特性如下:
- 强一致性读写操作
- 自动分片:HBase表以regions概念分布式存储在集群之中,regions会随着数据的增长自动分裂和再分配。
- RegionServer自动容错
- 与Hadoop/HDFS的整合:HBase支持HDFS作为其分布式文件系统
- MapReduce的支持
- 简单丰富的Java Client API
- Thrift/REST API的应用
- 区块缓存和布隆过滤器:HBase在大数据查询优化中支持区块缓存和布隆过滤器
- 操作管理:HBase提供web界面查看操作信息
什么时候使用HBase
与所有的技术一样,不是适用于所有的问题。只是在特定的场景下才适合使用HBase,因为HBase使用的简洁和方便(HBase最简洁的经验总结-13条建议让你快速上手HBase),在实际工程中可能会出现过度使用的情况。
- 首先,HBase是针对大数据开发的NoSQL存储数据库,显然我们要有足够多的数据。数据规模在亿规模的情况下推荐使用,如果数据规模过小,可能引起的是数据集中在个别节点上,而集群的其余节点闲置。
- 确定在不使用RDBMS提供的数据操作特性(例如索引、事务和高级的查询语句SQL等)的前提下可以实现功能。
- 有足够的硬件支持。更多的数据操作硬件支持是必不可少的。
HBase与Hadoop/HDFS的不同
HBase的数据存储在HDFS上,那么两者有什么区别呢?
HDFS是一个分布式的文件系统,用于大文件的存储,而不提供快速的检索功能。相反,HBase在HDFS之上提供了大数据表的快速检索功能。在内部实现中,为了高速的检索,HBase数据存储在HDFS上的StoreFiles中。
Catalog Tables
Catalog Tables,我翻译为目录表,就是HBase的一个目录。为表述准确后文中仍旧使用Catalog Tables表述。
hbase:meta
Catalog Tables hbase:meta为一张普通的HBase表,只是在使用shell的list命令展示时会被过滤掉。
hbase:meta(之前的.META.)的位置信息被存在ZooKeeper之中,hbase:meta表中存放着系统中的regions列表。
hbase:meta表结构如下:
- Key:Region key of the format ([table],[region start key],[region id])
- Values:
- info:regioninfo (serialized HRegionInfo instance for this region)
- info:server (server:port of the RegionServer containing this region)
- info:serverstartcode (start-time of the RegionServer process containing this region)
上面摘自HBase官方文档中,晦涩不易懂。我们暂且放下,先看HBase分表时,hbase:meta表是如何变化的。当一张HBase表分裂时,会有两个新列被创建,分别是info:splitA和info:splitB
(也是在info列族的下面创建的列)。这两个列分别代表着两个子region,列的值是新子表的info:regioninfo信息。在region成功分裂后,hbase:meta表的原有的region的这一行将会被删除,因为region已经分裂不存在了。
Master Server
Master Server负责监控集群中所有的Region Server,并且提供所有改变metadata的服务。在分布式环境中,Master运行在NameNode上。
可以多Master运行
与我们直观想法在集群中只有一个Master不同,HBase可以构建多Master的环境,所有的Master竞争运行集群。如果当前活跃的Master失去其在ZooKeeper抢占的位置(或者Master关机),那么余下的Master会抢占接管Master的角色。多Master的好处显而易见可以保证HBase集群的高可用性,但同时也闲置了一部分资源。
运行时Master挂掉,会产生什么影响
因为HBase的客户端直接与Region Servers通信,另外,每个Catalog Tables hbase:meta作为一张HBase表并不存储在Master中,所以集群仍旧会处于一个“稳定的状态”运行。然而,Master控制的一些重要功能(例如Region Server容错,region的分裂等)是不能进行的。所以,集群在没有Master的情况下仍旧可以短时间运行,Master需要尽快恢复。
MasterProcWAL
WAL文件存储在MasterProcWALs文件夹下,记录着一系列的管理操作和本身的运行状态。当Master出现故障时,可以根据存储的WAL文件恢复Master状态。
Region Server
Region Server的职责是服务和控制region,在分布式集群中,Region Server运行在DataNode上。
区块缓存
HBase提供两种区块缓存方式——LruBlockCache(默认的)和BucketCache。
- LruBlockCache是最原始的实现,基于Java堆的实现,换言之数据存在Java虚拟机的内存中。
- BucketCache是不基于Java虚拟机的可选择的。当我们选择BucketCache时,会构建两层的缓存系统,过去描述为"L1"和"L2" ,但是从hbase-2.0.0起已经废弃了这种称呼,取而代之的是,所有数据块存储在BucketCache层级上,索引和布隆过滤器存储在meta blocks层级上,meta blocks层级是堆上的LruBlockCache实现。
RegionServer分裂的实现
Write Ahead Log (WAL)
Region Server中Write Ahead Log (WAL) 记录着HBase中的数据改变。正常情况下,数据改变经过MemStore到StoreFiles,WAL是不被需要的。然而,在MemStore中数据被写入StoreFiles之前,Region Server宕机或者其他原因导致不可用时,WAL可以确保Region Server重启时所有的数据可以再一次被执行。
Regions
Region
多个Region组成一张HBase表,每个列族为一个Store,多个Store组成一个Region。下图是HBase官方文档截图,展示每个名词术语之间的关系。
如上图强调几点:
- Table由多个Region组成,表的分裂就是Region的分裂;
- 每个列族存储在一个Store中,所以列族影响着HBase表的物理存储,不推荐多个列族的使用,因为在读取涉及到不同Store之间的读取;
- 写入数据时,数据先写入MemStore,当MemStore写满之后再刷入到StoreFile中;
- Block在Region Server一小节中已经提到了,是区块缓存。
Store
一个Store包括一个MemStore和多个StoreFile。在Region中一个Store就是一个列族。
- MemStore:记录Store数据改变的内存,数据改变首先记录在MemStore中,当落盘发生时,MemStore中数据会产生一个镜像(snapshot)并被清空。落盘操作完成后镜像会被遗弃,而在此之前,HBase使用新的MemStore和备份的镜像继续提供数据写入服务。
- StoreFile:存储数据的文件。
- Blocks:区块缓存。
HDFS
前文提到了HDFS的NameNode和DataNode术语,在文章最后简单介绍一下。
- NameNode:NameNode负责存储HDFS文件系统的元数据,监视和控制这个文件系统。
- DataNode:DataNode存储着HDFS的数据块,也就是HDFS上数据存储的地方。