【零】HBase的架构原理剖析
一、定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。
二、数据模型
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。
三、 逻辑结构
- 简单的理解就是一张表
- 行键(row key): 数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索
- 列族(Column Family): 普遍将描述同类型的列归为一个列族
- 列限定字符(Column Qualifier): 就是普通表的列名的概念
- Cell : 由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元(多个 Key 指向一个 Value)。cell中的数据是没有类型的,全部是字节数组形式存贮。
- Store:多个Cell在一起组成的数据,划分的依据是列族
- Region:多个Store构成一个Region,一张表可以是多个Region,划分的依据是行键(下面会具体介绍)
四、物理结构
多个Key一个Value组成的一个个的Cell
如:值张三的存储结构是:{row_key1,personala_info,name,t1} -> 张三
五、HBase架构
- Master: 主要负责表的增删查改,Region Server的负载均衡Region的分布调整和Region的分裂之后的分配(下面会介绍)
- Region Server:主要负责数据的读写和持久化,Region的分裂
- Mem Store(内存Store): 写缓存(正写磁盘时经过的一个高速缓存),由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile(刷写到StoreFile 也就是HDFS),每次刷写都会形成一个新的HFile。
- StoreFile: 保存实际数据的物理文件,StoreFile以HFile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的。
- HLog(HDFS上的WALs): 为了保证数据在内存中不会因为挂掉弄丢数据,数据的操作数(步骤)会先写在一个叫做Write-Ahead logfile的文件中,然后再写入MemStore中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
- HDFS:HLog(WALs)和StoreFIle都存在在HDFS上(磁盘)
六、写流程
- put数据的时候没有master参与
- 访问zk获取元数据信息表(描述着数据存储在集群中的位置)所在的客户端RegionServer
- 返回一个元数据存储信息表(只有一个存储在一个节点上)所在的server -> hadoop102
- 向102请求获取元数据表
- 102返回元数据信息表,根据信息表查询出要插入的目标数据的Region所在的RegionSserver的所在位置(并缓存到了客户端你的meta cache,方便下次访问)
- 向目标RS请求put
- 往WAL这个操作写进去(追加操作)
- 然后写到MemStore
- 向客户端发送ack(返回成功)
- MemStore一定大小后 进行刷写到HDFS(下面详细介绍)
七、MemStore Flush
在MemStore达到一定的容量后,会发生刷写操作,将自身缓存中的数据写到HDFS
7.1 第一种情况
7.2 第二种情况
7.3 第三种情况
八、读流程
- 请求meta表所在的RS -> 102
- 去102请求获取meta
- 返回meta,根据meta查询到RS(将信息缓存到client本地) -> 103
- 向目标RS发送get请求
- 先去RS级别的Block Cache(读缓存)中看最近是否读取过这个数据
- 然后去MEnstor(最新的数据)
- 遍历StoreFile
- 找到后交给(缓存到)BlockChache
- 然后返回结果
九、StoreFile Compaction
为了减少file的个数:
- minor Compaction(默认为3个) : 将小文件合并成一个大的,不清理
- majorCompaction(默认一星期一次,实际开发中自定义) : 将一个store下的所有file合并成一个大的,并清理过期的文件
十、Region Split
10.1 逻辑切分
- 默认table只有一个region
- 数据过大,进行自动拆分,变成两个子region,都处于当前的RS
- 出于负载均衡考虑,Hmaster可能会将其中一个Region给其他的RS
- 逻辑上分成两个region
- 新的数据插入时,rowkey之内(若是小于3)的就那个region(第一个)处理
10.2 物理过程
- 新建立两个子Region(A,B)
- A和B分别指向父region中数据(A是rowKey为123,B为456)的连接,父数据下线(新数据进入region),新数据添加到子的region -> 根据rowkey小于3去第一个,反之。
- 当storefile触发storefile合并,如两个文件合并会生成一个新的文件,则原始文件引用的父数据的连接清除
- 当两个子region都将引用清除干净(软连接失效)之后,父Region(源文件)就会被清除(通过合并生成新的文件之后,再没有连接指向父数据,父分区才能删除)
- 分裂完成
十一、Life
早起也是自律的体现。威林克的座右铭是“自律 = 自由” —— 你为了获得真正的自由,就非得给自己设定一些限制。所谓“真正的自由”,也就是财务自由、时间自由、免于疾病和贫困的自由,为了达到这样的目标你必须自律才行,这个道理很明白。