本文经授权转载于 spacedong
公号ID dd_technology
阅读文本大概需要 7 分钟。
HBase
是一个分布式的、多版本、面向列的开源 KV
数据库。运行在 HDFS
的基础上,支持 PB
级别、百万列的数据存储。
作为性能如此强大的 KV
数据库,HBase
的存储结构究竟是怎样的呢?面向列的存储结构究竟有什么样的不同之处呢?接下来会详细讲解这部分。
为了清晰地表述这个,我们把 HBase
的存储结构分为逻辑结构和物理结构两个部分。
通过下图直观地展示 HBase
的逻辑存储结构:
HBase 逻辑视图
在本图中,列簇(Column Family
)对应的值就是 info
和 area
,列(Column
或者称为 Qualifier
)对应的就是 name
、 age
、 country
和 city
,Row key
对应的就是 Row 1
和 Row 2
,Cell
对应的就是具体的值。
Row key
:表的主键,按照字典序排序。HBase
中,列簇将表进行横向切割。HBase
中可以进行动态的添加。Cell
: 是指具体的 Value
。Version
:在这张图里面没有显示出来,这个是指版本号,用时间戳(TimeStamp
)来表示。看完这张图,是不是有点疑惑,怎么获取其中的一条数据呢?既然 HBase
是 KV
的数据库,那么当然是以获取 KEY
的形式来获取到 Value
啦。在 HBase
中的 KEY
组成是这样的:
Key 和 Value 图
KEY
的组成是以 Row key
、CF(Column Family)
、Column
和 TimeStamp
组成的。
TimeStamp
在 HBase
中充当的作用就是版本号,因为在 HBase
中有着数据多版本的特性,所以同一个 KEY
可以有多个版本的 Value
值(可以通过配置来设置多少个版本)。
查询的话是默认取回最新版本的那条数据,但是也可以进行查询多个版本号的数据,在接下来的进阶操作文章中会有演示。
Region Server 和 Region 关系图
Region Server
就是一个机器节点(服务器)Region Server
包含着多个 Region
Region
包含着多个列簇 (CF)
Region Server
中可以有多张 Table
,一张 Table
可以有多个 Region
先来看这张图:
Hbase架构图
为了不混淆,我们可以先把以下的概念一一对应起来
逻辑结构
物理结构
Region Server | HRegion Server |
Region | HRegion |
CF | HStore(这里指的是Store) |
在具体的物理结构中
HRegion Server
就是一个机器节点,包含多个 HRegion
,但是这些 HRegion
不一定是来自于同一个 Table
,负责响应的是用户的 IO
请求,和 HDFS
进行交互,是服务器中的一个进程。HRegion
包含多个 HStore
。CF
组成一个 HStore
,默认是 10 G
,如果大于 10G
会进行分裂。HStore
是 HBase
的核心存储单元,一个 HStore
由 MemStore
和 StoreFile
组成。MemStore
是一块内存,默认大小是 128M
,如果超过了这个大小,那么就会进行刷盘,把内存里的数据刷进到 StoreFile
中。HStore
对应着的是 Table
里面的 Column Family
,不管有 CF
中有多少的数据,都会存储在 HStore
中,为了避免访问不同的 HStore
而导致的效率低下。HRegion
是 Hbase
中分布式存储和负载均衡的最小单元,但不是存储的最小单元。Hstore
可以有多个 StoreFile
从不同的 CF
中查询 Row 3
主键的数据,结果集如下:
查找Row 3的数据
更加直观地显示,在 HBase
中是以 CF
为单元的存储结构。
如下图,HBase
的架构图,在 HBase
中我们看到有 Client
、Zookeeper
、HMaster
和 HRegion
。
HBase的架构图
Client
是客户端,要求读写数据的发起者。ZK
集群是负责转发 Client
的请求和提供心跳机制,会让 HRegion Server
和 HRegion
注册进来,同时保存着 Rowkey
和 Region
的映射关系。HMaster
中可以有多个待命,只有一个在活跃。Client
请求读取数据时,先转发到 ZK
集群,在 ZK
集群中寻找到相对应的 Region Server
,再找到对应的 Region
,先是查 MemStore
,如果在 MemStore
中获取到数据,那么就会直接返回,否则就是再由 Region
找到对应的 Store File
,从而查到具体的数据。
在整个架构中,HMaster
和 HRegion Server
可以是同一个节点上,可以有多个 HMaster
存在,但是只有一个 HMaster
在活跃。
在 Client
端会进行 rowkey
-> HRegion
映射关系的缓存,降低下次寻址的压力。
在HBase中写入数据的过程
先是 Client
进行发起数据的插入请求,如果 Client
本身存储了关于 Rowkey
和 Region
的映射关系的话,那么就会先查找到具体的对应关系,如果没有的话,就会在ZK
中进行查找到对应 Region server
,然后再转发到具体的 Region
上。
所有的数据在写入的时候先是记录在 WAL
中,同时检查关于 MemStore
是否满了,如果是满了,那么就会进行刷盘,输出到一个 Hfile
中,如果没有满的话,那么就是先写进 Memstore
中,然后再刷到 WAL
中。
福利
看完后,是否对 HBase 的存储结构有所了解了呢?最后送两本电子书给大家,一本是《HBase权威指南(中文版)高清完整版》,一本是《HBase实战中文版》,在公众号后台回复 HBase 关键字即可获取。
题图:chichimaru
PS:画图的过程是真滴累啊!!!