HBase的体系结构属于典型的Master-Slave模型。它的数据存储在HDFS上,ZooKeeper被使用协助管理HBase。
我们可以用一张图来纵览HBase的整个体系结构。
Client
在连接方式上,HBase客户端会通过查询hbase:meta
去找相关存活的RegionServer。找到相关的region后,客户端会直接和对应的regionServer连接而并不会再去通过master节点请求。 hbase:meta
中的信息会被缓存在客户端中,除非集群有region分裂或者blance之类的调整,HBase会重新拉去hbase:meta
中的信息。
在HBase2.0后,连接API改为Connection。(HTablePool在HBase 0.94、0.95和0.96中已弃用,并在0.98.1中由HBASE-6580或HConnection删除,而HConnection在HBase 1.0中已由Connection弃用。 )BufferedMutator, HTable已被标为deprecated
。
Zookeeper
zookeeper在HBase的集群管理中扮演着非常重要的角色。
- 高可用:当Zookeeper通过心跳检测到有宕机节点。可以通过选举新的master节点,保证高可用。
- 元数据:保存集群信息的元数据。
- 一致性: Zookeeper可以通过加表锁,保证HBase表数据的一致性。
Master
主服务器负责监视群集中的所有RegionServer实例,并且是所有元数据更改的接口。 在分布式群集中,主服务器通常在NameNode上运行。具体细节HBaseMaster参考这篇文章。
提供了一些面向元数据的结构的接口
- 表(createTable,modifyTable,removeTable,启用,禁用)
- ColumnFamily(addColumn,modifyColumn,removeColumn)
- region(move, assign, unassign) (例如,当调用Admin方法disableTable时,它由主服务器提供服务。
另外Master节点提供了定期检查并清理hbase:meta
。检查HDFS中HLog是否过期、HFile是否已经被删除,并在过期之后将其删除。
RegionServer
它负责服务和管理区域。 在分布式群集中,RegionServer在DataNode上运行,它由WAL(HLog)、BlockCache以及多个Region构成。
- Region:数据表的一个分区。它存储rowkey按照散列区分的从startkey-endkey的数据。通常一个region设计为10G到50G。当数据表大小超过这个值就会自动分裂为两个Region。Region是集群负载均衡的基本单位。通常一张表的Region会分布在整个集群的多台RegionServer上,一个RegionServer上会管理多个Region,当然,这些Region一般来自不同的数据表。
它的基本结构如下:
Table (HBase table)
Region (Regions for the table)
Store (Store per ColumnFamily for each Region for the table)
MemStore (MemStore for each Store for each Region for the table)
StoreFile (StoreFiles for each Store for each Region for the table)
Block (Blocks within a StoreFile within a Store for each Region for the table)
HLog:HBase数据随机写入时,并非直接写入HFile数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入HLog,这样,即使缓存数据丢失,仍然可以通过HLog日志恢复;其二,用于实现HBase集群间主从复制,通过回放主集群推送过来的HLog日志实现主从复制。
BlockCache:HBase的都缓存。HBase提供了两种不同的BlockCache实现来缓存从HDFS读取的数据:默认的堆上LruBlockCache和BucketCache(通常是堆外)。
Store: 多个Store构成1个region,Store的个数取决于表中列簇(columnfamily)的个数,多少个列簇就有多少个Store。每个Store由一个MemStore和一个或多个HFile组成。
MemStore: MemStore是HBase的写缓存。默认为128M,当超过这个值,数据就会被异步地将数据持久化到HFile中。
HDFS
由于HBase在HDFS上运行(并且每个StoreFile都作为文件写在HDFS上),因此重要的是了解HDFS体系结构,尤其是在如何存储文件,处理故障转移和复制块方面。
HDFS具有主/从体系结构。 HDFS群集由单个NameNode和管理文件系统名称空间并控制客户端对文件的访问的主服务器组成。 此外,还有许多数据节点,通常是集群中每个节点一个,用于管理与它们所运行的节点相连的存储。 HDFS公开了文件系统名称空间,并允许用户数据存储在文件中。 在内部,文件被分成一个或多个块,这些块存储在一组DataNode中。 NameNode执行文件系统名称空间操作,例如打开,关闭和重命名文件和目录。 它还确定块到DataNode的映射。 DataNode负责处理来自文件系统客户端的读写请求。 DataNode还根据NameNode的指令执行块创建,删除和复制。
细节可以参考这篇文档。