1、概述:最近,有一些工程师问我有关HBase的基本架构的问题,其实这个问题仅仅说架构是非常简单,但是需要理解。在这里,我觉得可以用HDFS的架构作为借鉴。(其实像Hadoop生态系统中的大部分组建的架构原理是类似,不信你往下看)
2、介绍架构
(1)HDFS例子
在这里我以我比较熟悉的HDFS分布式文件系统作为一个例子来简单说明一下。首先我对HDFS的架构做一个简单的说明:
HDFS分布式文件系统主要三个组建:NameNode和DataNode以及SecondaryNameNode。Namenode主要负责维护文件系统的元数据信息,DataNode则是负责实际存储对应数据分片的节点。
它的主要工作原理是客户端(client)通过发送一个请求(读写请求)时,首先会从NameNode中获取对应的元数据信息,这个元数据信息包含了对应 请求的数据所在的位置、大小等信息。获取到这些元数据信息后,client直接从对应的DataNode上执行对应的请求。这就是整个请求的响应过程。这 简单吧。当然这里并没有讲到SecondaryNameNode,它的作用主要是用来合并fsimage和edits文件来减少NameNode重启的时 间,还可以用来作为数据的一个冷备份。
好了,HDFS分布式文件系统的架构和原理简单的理解就是上面的内容了。下面来看看HBase的架构和原理吧。
(2)HBase(正题)
有了HDFS的基本原理对比之后,我们用同样的思维看HBase:与HDFS一样,HBase有Master和RegionServer(当然,这里还 需要用到Zookeeper)。在这里其实Zookeeper充当了类似NameNode的角色,Master的角色实际上是维护整个列式存储集群的运行 (如分配或切分Region,检查失效的RegionServer),RegionServer的角色当然跟Datanode的角色类似啦。
HBase的主要原理:客户端(Client)发送对应的请求(增、删、改、查),首先客户端会从Zookeeper中获取一个-ROOT-的表的元信 息(即-ROOT-的位置);第二步,客户端就去读取对应的-ROOT-表的信息,-ROOT-表中存储了对应的Meta的元数据信息;第三步,客户端知 道了Meta表元数据信息后就去读取对应Meta表的信息,Meta表存储了对应存放数据的RegionServer的位置信息等;第四步,就去获取对应 RegionServer上的数据。
HBase中比较重要的RegionServer,它上面包含的内容有:WAL(HLog)、BlockCache、Region、MemStore、StoreFile(HFile新版本的改进),下面主要讲一下这些个名词的原理和含义:
a) WAL:Write Ahead Log即提前写日志(Log),根据字面意思就知道,在写操作的时候,就是先要写入到该日志文件中。所有写操作都会先保证将数据写入这个Log文件后,才 会真正更新MemStore,最后写入HFile中。这样可以在RegionServer挂掉后,通过WAL来恢复数据,从而避免数据的丢失。一般一个 RegionServer只有一个WAL实例,也就是说一个RegionServer的所有WAL写都是串行的,你可能会觉得这会有性能问题,因而在 HBase 1.0之后,通过HBASE-5699实现了多个WAL并行写(MultiWAL),该实现采用HDFS的多个管道写,以单个HRegion为单位。
b) BlockCache:它是一个读缓存,即“引用局部性”原理。
c) Region:它是一个Table在一个RegionServer中的存储单元,也是分布式存 储的最小单元。一个Table可以有一个或多个Region,他们可以在一个相同的RegionServer上,也可以分布在不同的 RegionServer上,一个RegionServer可以有多个Region,他们分别属于不同的Table。Region由多个Store构成, 每个Store对应了一个Table在这个Region中的一个Column Family,即每个Column Family就是一个集中的存储单元,因而最好将具有相近IO特性的Column存储在一个Column Family,以实现高效读取(数据局部性原理,可以提高缓存的命中率)。Store是HBase中存储的核心,它实现了读写HDFS功能,一个 Store由一个MemStore 和0个或多个StoreFile组成。
d) MemStore是一个写缓存(In Memory Sorted Buffer),所有数据的写在完成WAL日志写后,再写入MemStore中,由MemStore根据一定的算法将数据Flush到地层HDFS文件中 (HFile),通常每个HRegion中的每个 Column Family有一个自己的MemStore。
e) HFile(StoreFile) 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列。