HBase存储结构及存储模块讲解

简介:

本文介绍HBase中的数据存储模块,先从微观层面拆分出每个存储模块讲解,然后再从宏观层面介绍这些模块之间是怎样协同工作的,以及为什么需要这些存储模块,它们帮HBase实现了那些功能和性能上的提升。

一.RegionServer

HBase存储结构及存储模块讲解_第1张图片

(RegionServer的架构图)

RegionServer的结构:

RegionServer = Region + Store + MemStore + StoreFile + HFile + HLog

接下来将逐个介绍RegionServer中的这些模块。

二.Region

Region的重点介绍:

  • Region是数据分布式存储和负载均衡的最小单元(存储的最小单元是HFile),是Client和RegionServer交互的实际载体。
  • Region通过三个信息标识自己:tableName,startRowKey(Rowkey是有序的),createTime(最早一条数据的插入时间)。
  • 一个Region是一张表中的一行数据(不会出现一行数据出现在多个Region中)。
  • 一个RegionServer包含许多的Region,每个Region包含的数据都是互斥的(不会出现一个Region存在多个RegionServer上)。
  • 当Region中的数据不断插入,或者某个列族的数据到达一定的阈值后,Region将会水平拆分两个Region。
  • 当RegionServer挂了后,Master会通过负载均衡策略将Region移动到其他RegionServer上。
  • Region的数量一定不能低于集群中节点的数量(数据量大到一定程度时,避免某个节点压力过大,不能做到负载均衡)。

什么是数据库的水平拆分?

水平拆分就是将表横向切分,就像在一张白纸划一道横线,白纸就分为上下两部分。这样每一部分都保存着完整的字段,只是有些数据保存在上面部分,有些数据保存在下面部分。如下图:

HBase存储结构及存储模块讲解_第2张图片

上图中,表中ID为奇数存在一张表中,偶数存在另一张表中,这样就是表的水平拆分。

Region的拆分过程:

Region的拆分是不可见的,Master不参与拆分。RegionServer先将要拆分的Region下线,然后拆分;再将子Region加入到Mata元信息中,再将两个Region添加到RegionServer上,最后同步到Master上(这就是HBase负载均衡的原理)。

根据拆分原理得到的优化技巧:
在设计表,尤其是RowKey时,尽量让数据分散到多台Server上,避免单个节点成为热点,才能发挥出HBase的性能。

三.Store

每个Region有多个Store。Store对应每个表的列族,表里有多少个列族,Region中就有多少个Store。Region会根据Store的大小,决定是否切分Region。

四.MemStore

每个Store又包含多个MEMStore,MEMStore是内存式的数据结构。
MemStore保存修改的数据,即用户put、delete的请求,默认大小64M,HBase有异步线程进行刷写。

五.StoreFile

HBase会将内存中的数据写入到文件中,这里的文件指的就是StoreFile。StoreFile底层是以HFile格式保存,HFile下文会专门介绍。

六.HFile

存储数据的最小单元,HFile底层是Hadoop的二进制格式文件(Key-Value类型)。
HBase存储结构及存储模块讲解_第3张图片

(Hfile结构图)

接下来介绍一下HFile中的各个模块:

①Scanned Block Section:

顺序扫描HFile时,此部分数据将被读取,用户数据就保存这个分区中(HFile最重要的功能)。

Data Block:

Data Block是由Key-Value结构组成,这就是为什么HBase是Key-Value存储的。每个Key-Value由Key Length、value length、key、value 4个部分组成,keylength 和value length主要在偏移时候,起到作用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTvWFgqR-1599123508856)(https://note.youdao.com/yws/public/resource/babda7978b0415833a56f265c7ae77d8/xmlnote/8DC775EA2B01461097FED47625BD336F/62527)]

(Data Block结构图)

  • Key

    结合上图来看,Data Block中的Key中包含以下内容:

    名称 含义
    Row Length 行键长度
    Row 行键
    Column Family length 列族长度
    Column Family 列族
    Column Qualifier length 列描述符的长度
    Column Qualifier 列描述符
    Timestamp 时间戳
    Key Type 键类型
  • Key Type:

    由于写入到HFile中的数据,是不可修改的,只能通过先删除后增加实现修改,所以当需要删除数据时,KeyType就起作用了。

    KeyType类型 含义
    put 插入数据。
    delete 删除整行数据。
    delete Column 删除整列数据。
    delete Family 删除一个列族。

    我们可以用Key Type,来给数据做一个墓碑标记,表示这个数据被删除掉了。HBase在扫描HFile时,当看到标记delete、delete column、delete family时,就认为这些数据已经不存在了;HBase会在以后运行中(具体在什么时候,下文还会详细介绍),将这些标记为删除的数据删除掉,这样就提高了HBase的存储插入的性能。

②Non-scanned Block Section:

顺序扫描HFile时,Non-scanned Block Section区域不会被扫描,该区域包含了一些元数据块。

③"Load-on-open" Section:

在RegionServer启动时,“Load-on-open” Section会加载到内存中的。该区域保存了HBase元数据相关信息。

④Trailer:

Trailer中保存HFile的基本信息,偏移量和寻址信息。也保存了一部分的元数据(Mata)信息。

总结

本文分析了HBase中的各个存储模块,以及所有HBase存储模块的介绍,我建议将本文作为HBase名词的字典,遇到这些存储模块时,就来查看一下它的作用介绍,这样就更容易理解HBase的运行机制,以及各个模块之间是怎样协作运行的了。

在后续的文章中,将介绍下Hbase的日志系统。喜欢本文就点赞和收藏吧。

你可能感兴趣的:(HBase)