前言
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
的组成是以 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
物理存储结构
先来看这张图:
为了不混淆,我们可以先把以下的概念一一对应起来
逻辑结构 | 物理结构 |
---|---|
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
在HBase中查找不同的CF的数据
从不同的 CF
中查询 Row 3
主键的数据,结果集如下:
更加直观地显示,在 HBase
中是以 CF
为单元的存储结构。
HBase的架构
如下图,HBase
的架构图,在 HBase
中我们看到有 Client
、Zookeeper
、HMaster
和 HRegion
。
Client
是客户端,要求读写数据的发起者。ZK
集群是负责转发Client
的请求和提供心跳机制,会让HRegion Server
和HRegion
注册进来,同时保存着Rowkey
和Region
的映射关系。HMaster
中可以有多个待命,只有一个在活跃。
Hbase读取数据的过程
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
中。
PS:画图的过程是真滴累啊!!!
题图:chichimaru
欢迎关注我的公众号:spacedong
原文链接:一文讲清HBase的存储结构