HBase架构、数据存储结构及工作原理分析
文章目录
一、HBase介绍
- 定义:HBase是一个面向列存储的数据库,它是一个分布式的hash map,并能够利用HDFS的可靠性来做存储功能。
- 特点
- 数据访问速度快,响应时间月约2-20ms
- 支持随机读写,每个节点20k~100k+ops/s
- 可扩展性,可扩展到20000+节点
- 应用场景
- 增量数据-时间序列数据——高容量、高速写入
- 信息交换-消息传递——高容量、高速读写
- 内容服务-Web后端应用程序——高容量、高速读写、
- 高并发
二、HBase架构
HBase是一种Master/slaves架构,主要的组成由下图可以看出,分别为:Client、zookeeper、HMaster、HRegionServer、HDFS。
1.主架构
(1).Client
Client(客户端)可以是HBase shell,Java API或者是RestAPI。Client 就是用来访问 HBase 数据库的,它不仅提供了访问接口,还维护了对应的缓存(cache)来加速 HBase 的访问。Client 端的缓存主要是缓存 Region 的位置信息,减少获取元数据的时间。
当 Client 端没有缓存的时候(第一次请求),会加载 Region 的位置信息到Client 端,后面直接使用 cache 中的信息,如果出现重试,则会重新获取 Region 的位置信息,更新 Client 端的 cache。
(2).Zookeeper
HBase 通过 ZooKeeper 来做 HMaster 的高可用、HRegionServer 的监控、元数据的入口以及集群配置的维护等工作。它具体工作如下:
- 通过Zookeeper来保证集群中只有一个HMaster在运行,如果HMaster异常,会通过选举机制产生新的HMaster来提供服务
- 通过Zookeeper来监控HRegionServer的状态,当HRegionServer有异常,通过Master会受到Zookeeper消息通知HRegionServer上下线的信息
- 通过ZooKeeper存储元数据的统一入口地址
(3).HMaster
HMaster节点是集群中的主节点,可以配置多个,用来实现HA,它的主要职责如下:
- 处理元数据的变更
- 监控HRegionServer,处理HRegionServer的故障转移。当某个HRegionServer挂掉时,Zookeeper会将分配在该HRegionServer上的HRegion分配到其他HRegionServer上进行管理
- 负责HRegionServer的负载均衡
- 通过Zookeeper发布自己的位置给客户端
- HRegion分裂后,负责新的HRegion的分配
()4.HRegionServer
HRegionServer直接负责用户的读写请求,它的功能如下:
- 负责和底层HDFS的交互,存储数据到HDFS上
- 处理分配给它的HRegion
- 刷新缓存到HDFS上
- 维护HLog,Hlog是一个容错机制
- 处理来自客户端的读写请求。HRegionServer是管理数据的,所以客户端的读写请求最终都要由HRegionServer来处理
- 负责处理HRegion变大后的拆分工作
- 负责StoreFile的合并工作
(5).HDFS
HDFS为HBase提供最终的底层数据存储服务,为HBase提供高可用的支持,具体功能如下:
- 提供元数据和表数据的底层分布式存储服务
- 数据多副本,保证高可靠性和高可用性
2.其他组成部分
(1).Write-Ahead Logs
Write-Ahead Logs 也叫预写日志,在HBase中为HLog,HLogs存储在HDFS上。当HBase读写数据时,数据不是直接就写进磁盘的,也不是直接写入内存的,是首先写入到HLogs中,然后再写到内存中为了就是防止数据丢失。HLog是每一个HRegionServer对应一个。
(2).HRegion
HRegion可以看成是表的横向切分,HBase表的分片,HBase每个表都会根据RowKey值被切分成不同的HRegion分散存储在HRegionServer中。一个HRegionServer中可以有多个HRegion。
下图是HRegion、Table、HRegionServer的关系。
注:一个HRegion只能在一个HRegionServer上,不可以跨多个HRegionServer·
(3).Store
每一个Region内部,又分为多个Store,一个Store对应表中的一个列族。也就是说一个Store存储了对应表该列族下的部分数据。
(4).MemStore
内存存储,位于内存中,用来保存当前的数据操作。当数据保存在WAL中之后,HRegionServer会在内存中存储键值对。
(5).HFile
这是磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以HFile的形式存储在HDFS的。
三、HBase数据存储结构
HBase的特点是列的灵活性。在列族中,可以指定任意多的列,在列数据为空的情况下也不会占用存储空间。HBase的底层存储的数据是KeyValue格式的数据。
1.RowKey
RowKey是用来检索数据的主键,不仅如此,HBase表数据会按照RowKey进行排序,并在HBase达到一定大小后,会按照RowKey范围进行裂变。
Rowkey的值可以是任意字符串(最大长度为64KB)。在存储的时候,数据会按照RowKey进行字典排序,所以在设计RowKey的时候,要充分利用这个特性。
2.Column Family
列族是HBase对表在纵向上的优化,列族是在纵向进行切分的,将一列分成一组进行管理。
列族是表的schema的一部分,所以在时候前需要进行定义。每一个列族对应一个Store,也对应HDFS上的一个目录,类似于HBase对表按列族进行分区一样。
3.Time Stamp
HBase中通过RowKey和ColumnFamily:column来确定一个存储单元,也就是一个cell。每一个cell中都保存着同一个数据的多个版本。版本需要 根据时间戳来索引。时间戳一般是由HBase在写入数据时自动赋值的。每一个cell中,每一个版本的数据都是按照时间顺序倒序排列的,最新的数据在最前面。
四、HBase原理
1.元数据存储
HBase中有一个系统表meta用来存储HBase的元数据信息。该表记录了每一个表的Region地址,还有其他的一些信息。
在zookeeper中存储了meta的位置,客户端可以通过zookeeper查找到meta表的位置。meta表示HBase中的一张表,是由HRegionServer来管理的。
2.读流程
HBase的读数据流程如图所示
具体的工作流程如下:
- Client先访问zookeeper,请求获取meta的位置,然后通过meta表来读取Region的位置,从而获取meta表中的数据,且meta表中还存储了用户表的Region信息
- zookeeper会根据请求返回meta表所在RegionServer的位置。
- 用户根据RowKey在meta表中的位置来找到对应Region的信息
- 然后在找到对应的RegionServer
- 查找对应的Region
- 首先从MemStore找数据,如果没有再从BlockCache里面找
- 如果BlcokCache也没有,再到StoreFile里面找
- 如果是从StoreFile里面读取的数据,不会 直接返回给客户端,而是先写入到BlockCache里,再返回给客户端
上述流程可以描述为下图:
3.写流程
HBase的写流程具体如下图所示
具体步骤为:
- Client访问zookeeper,获取meta表的位置
- 访问meta表,然后镀组meta表中的数据
- 根据namespace、表名、Rowkey,在meta表中找到该Rowkey应该写到哪一个Region
- 找到对应的Region对应的RegionServer后,发送写数据的请求
- RegionServer将数据先写到HLog中,为了数据的持久化和数据恢复
- 再讲数据写到MemStore中
- 反馈给Client写入成功
4.数据Flush过程
从上面写数据可以看出,HBase写数据是写入到内存中就返回给客户端了,并不是直接落盘,这也就是为什么HBase插入数据会比较快。那什么时候数据会落入磁盘中呢?当MemStore数据达到阈值时(默认是128M),RegionServer会将数据刷到HDFS上,生成HFile文件,然后再将内存中的数据删除,同时还删除HLog中的历史数据。
本文地址:https://blog.csdn.net/qq_38497133/article/details/107495605