【零】HBase的架构原理剖析

一、定义

HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。

二、数据模型

逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。

三、 逻辑结构

  1. 简单的理解就是一张表
  2. 行键(row key): 数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索
  3. 列族(Column Family): 普遍将描述同类型的列归为一个列族
  4. 列限定字符(Column Qualifier): 就是普通表的列名的概念
  5. Cell : 由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元(多个 Key 指向一个 Value)。cell中的数据是没有类型的,全部是字节数组形式存贮。
  6. Store:多个Cell在一起组成的数据,划分的依据是列族
  7. Region:多个Store构成一个Region,一张表可以是多个Region,划分的依据是行键(下面会具体介绍)

【零】HBase的架构原理剖析

四、物理结构

多个Key一个Value组成的一个个的Cell
如:值张三的存储结构是:{row_key1,personala_info,name,t1} -> 张三

【零】HBase的架构原理剖析

五、HBase架构

  1. Master: 主要负责表的增删查改,Region Server的负载均衡Region的分布调整和Region的分裂之后的分配(下面会介绍)
  2. Region Server:主要负责数据的读写和持久化,Region的分裂
  3. Mem Store(内存Store): 写缓存(正写磁盘时经过的一个高速缓存),由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile(刷写到StoreFile 也就是HDFS),每次刷写都会形成一个新的HFile。
  4. StoreFile: 保存实际数据的物理文件,StoreFile以HFile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的。
  5. HLog(HDFS上的WALs): 为了保证数据在内存中不会因为挂掉弄丢数据,数据的操作数(步骤)会先写在一个叫做Write-Ahead logfile的文件中,然后再写入MemStore中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
  6. HDFS:HLog(WALs)和StoreFIle都存在在HDFS上(磁盘)

【零】HBase的架构原理剖析

六、写流程

  1. put数据的时候没有master参与
  2. 访问zk获取元数据信息表(描述着数据存储在集群中的位置)所在的客户端RegionServer
  3. 返回一个元数据存储信息表(只有一个存储在一个节点上)所在的server -> hadoop102
  4. 向102请求获取元数据表
  5. 102返回元数据信息表,根据信息表查询出要插入的目标数据的Region所在的RegionSserver的所在位置(并缓存到了客户端你的meta cache,方便下次访问)
  6. 向目标RS请求put
  7. 往WAL这个操作写进去(追加操作)
  8. 然后写到MemStore
  9. 向客户端发送ack(返回成功)
  10. MemStore一定大小后 进行刷写到HDFS(下面详细介绍)

【零】HBase的架构原理剖析

七、MemStore Flush

在MemStore达到一定的容量后,会发生刷写操作,将自身缓存中的数据写到HDFS

【零】HBase的架构原理剖析

7.1 第一种情况

【零】HBase的架构原理剖析

7.2 第二种情况

【零】HBase的架构原理剖析

7.3 第三种情况

【零】HBase的架构原理剖析

八、读流程

  1. 请求meta表所在的RS -> 102
  2. 去102请求获取meta
  3. 返回meta,根据meta查询到RS(将信息缓存到client本地) -> 103
  4. 向目标RS发送get请求
  5. 先去RS级别的Block Cache(读缓存)中看最近是否读取过这个数据
  6. 然后去MEnstor(最新的数据)
  7. 遍历StoreFile
  8. 找到后交给(缓存到)BlockChache
  9. 然后返回结果

【零】HBase的架构原理剖析

九、StoreFile Compaction

为了减少file的个数:

  1. minor Compaction(默认为3个) : 将小文件合并成一个大的,不清理
  2. majorCompaction(默认一星期一次,实际开发中自定义) : 将一个store下的所有file合并成一个大的,并清理过期的文件

【零】HBase的架构原理剖析

十、Region Split

10.1 逻辑切分

  1. 默认table只有一个region
  2. 数据过大,进行自动拆分,变成两个子region,都处于当前的RS
  3. 出于负载均衡考虑,Hmaster可能会将其中一个Region给其他的RS
  4. 逻辑上分成两个region
  5. 新的数据插入时,rowkey之内(若是小于3)的就那个region(第一个)处理

【零】HBase的架构原理剖析

10.2 物理过程

  1. 新建立两个子Region(A,B)
  2. A和B分别指向父region中数据(A是rowKey为123,B为456)的连接,父数据下线(新数据进入region),新数据添加到子的region -> 根据rowkey小于3去第一个,反之。
  3. 当storefile触发storefile合并,如两个文件合并会生成一个新的文件,则原始文件引用的父数据的连接清除
  4. 当两个子region都将引用清除干净(软连接失效)之后,父Region(源文件)就会被清除(通过合并生成新的文件之后,再没有连接指向父数据,父分区才能删除)
  5. 分裂完成

十一、Life

早起也是自律的体现。威林克的座右铭是“自律 = *” —— 你为了获得真正的*,就非得给自己设定一些限制。所谓“真正的*”,也就是财务*、时间*、免于疾病和贫困的*,为了达到这样的目标你必须自律才行,这个道理很明白。

【零】HBase的架构原理剖析