一文讲清HBase的存储结构-阿里云开发者社区

开发者社区> 数据库> 正文

一文讲清HBase的存储结构

简介: 讲清Hbase的存储结构。
![image](http://image.spacedong.top/Swan%20River.jpg) ### 前言 `Hbase` 是一个分布式的、多版本、面向列的开源 `KV` 数据库。运行在 `HDFS` 的基础上,支持 `PB` 级别、百万列的数据存储。 ### HBase的存储结构 #### 逻辑存储结构 通过下图直观地展示 `HBase` 的逻辑存储结构: ![HBase 逻辑视图](http://image.spacedong.top/Hbase%20%E9%80%BB%E8%BE%91%E8%A7%86%E5%9B%BEjpg%20%281%29.jpg) 在本图中,列簇(`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 图](http://image.spacedong.top/Hbase%20Key%E7%BB%84%E6%88%90.jpg) `KEY` 的组成是以 `Row key` 、`CF(Column Family)` 、`Column` 和 `TimeStamp` 组成的。 `TimeStamp` 在 `HBase` 中充当的作用就是版本号,因为在 `HBase` 中有着数据多版本的特性,所以同一个 `KEY` 可以有多个版本的 `Value` 值(可以通过配置来设置多少个版本)。查询的话是默认取回最新版本的那条数据,但是也可以进行查询多个版本号的数据,在接下来的进阶操作文章中会有演示。 ##### Region Server 和 Region 的关系 ![Region Server 和 Region 关系图](http://image.spacedong.top/Region%20Server%20%E5%92%8C%20Region%20%E7%9A%84%E5%85%B3%E7%B3%BB.jpg) - 一个 `Region Server` 就是一个机器节点(服务器) - 一个 `Region Server` 包含着多个 `Region` - 一个 `Region` 包含着多个列簇 `(CF)` - 一个 `Region Server` 中可以有多张 `Table`,一张 `Table` 可以有多个 `Region` #### 物理存储结构 先来看这张图: ![Hbase架构图](http://image.spacedong.top/Hbase%E7%89%A9%E7%90%86%E5%AD%98%E5%82%A8%E6%9E%B6%E6%9E%84.png) 为了不混淆,我们可以先把以下的概念一一对应起来 逻辑结构 | 物理结构 ---|--- 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` 主键的数据,结果集如下: ![查找Row 3的数据](http://image.spacedong.top/%E9%80%BB%E8%BE%91%E5%92%8C%E7%89%A9%E7%90%86%E6%98%A0%E5%B0%84.png) 更加直观地显示,在 `HBase` 中是以 `CF` 为单元的存储结构。 ### HBase的架构 如下图,`HBase` 的架构图,在 `HBase` 中我们看到有 `Client`、`Zookeeper`、`HMaster` 和 `HRegion`。 ![HBase的架构图](http://image.spacedong.top/Hbase%E6%9E%B6%E6%9E%84%E5%9B%BEpng.png) - `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 写入数据的过程 ![在HBase中写入数据的过程](http://image.spacedong.top/Hbase%E8%AF%BB%E5%8F%96%E6%95%B0%E6%8D%AE.png) 先是 `Client` 进行发起数据的插入请求,如果 `Client` 本身存储了关于 `Rowkey` 和 `Region` 的映射关系的话,那么就会先查找到具体的对应关系,如果没有的话,就会在`ZK`中进行查找到对应 `Region server`,然后再转发到具体的 `Region` 上。所有的数据在写入的时候先是记录在 `WAL` 中,同时检查关于 `MemStore` 是否满了,如果是满了,那么就会进行刷盘,输出到一个 `Hfile` 中,如果没有满的话,那么就是先写进 `Memstore` 中,然后再刷到 `WAL` 中。 #### 福利 看完后,是否对 HBase 的存储结构有所了解了呢?最后送两本电子书给大家,一本是《HBase权威指南(中文版)高清完整版》,一本是《HBase实战中文版》,在公众号后台回复 HBase 关键字即可获取。 PS:画图的过程是真滴累啊!!! 题图:chichimaru ![image](http://image.spacedong.top/wechatqcode.jpg)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章