HBase的组成
文章目录
- HBase的组成
- 大表的拆分
- HBase 的组件
- HBase架构图
- HBase工作原理
- 整体工作流程
- 具体流程之写入
- 具体流程之读取
首先HBase 的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。
我们可以想象一张超级超级大的表,可能有几千列几亿行,这个数据量十分庞大,为了进行分布式存储和处理,所以我们要把表进行拆分。
根据拆分的逻辑就有了HBase的组成:
大表的拆分
也正是如上图所示的列拆分,所以HBase是面向列存储的数据库
HBase 的组件
HMaster
1.监控RegionServer
2.处理RegionServer故障转移
3.处理元数据的变更
4.处理region的分配或转移
5.在空闲时间进行数据的负载均衡
6.通过Zookeeper发布自己的位置给客户端
RegionServer
1.负责存储HBase的实际数据
2.处理分配给它的Region
3.刷新缓存到HDFS
4.维护Hlog
5.执行压缩
6.负责处理Region分片
1.Write-Ahead logs
HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
2.Region
Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region。
3.Store
HFile存储在Store中,一个Store对应HBase表中的一个列族。
4.MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。
5.HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以Hfile的形式存储在HDFS的。
HBase架构图
1)Client
Client包含了访问Hbase的接口,另外Client还维护了对应的cache来加速Hbase的访问,比如cache的.META.元数据的信息。
2)Zookeeper
HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。具体工作如下:
- 通过Zoopkeeper来保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master提供服务
- 通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下线的信息
- 通过Zoopkeeper存储元数据的统一入口地址
3)Hmaster
master节点的主要职责如下:
- 为RegionServer分配Region
- 维护整个集群的负载均衡
- 维护集群的元数据信息
- 发现失效的Region,并将失效的Region分配到正常的RegionServer上
- 当RegionSever失效的时候,协调对应Hlog的拆分
4)HregionServer
HregionServer直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:
- 管理master为其分配的Region
- 处理来自客户端的读写请求
- 负责和底层HDFS的交互,存储数据到HDFS
- 负责Region变大以后的拆分
- 负责Storefile的合并工作
5)HDFS
HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:
提供元数据和表数据的底层分布式存储服务
数据多副本,保证的高可靠和高可用性
HBase工作原理
客户端访问数据时的“三级寻址”
由于HBase是分布式数据库,所以具体的数据存在那台服务器上需要通过元数据来记录,在HBase中,元数据是存储服务器集群中某一个节点(HMaster)中的meta
表中的,那么问题来了,当客户端需要请求某个数据时,首先要解决一个问题,就是在哪台服务器上找到元数据表,要解决这个问题很简单,zookeeper可以存储集群中共同维护的关键信息并以此完成高可用HA,所以将存储了meta table
所在的节点信息即meta-region-server
交给zookeeper来进行管理。
我们可以通过查看zookeeper的节点信息找到meta-region-server
整体工作流程
具体流程之写入
- 客户端根据meta表向region-server发送写入数据
- region-server根据写入数据的数据标识找到其所在的分区,即region
- region-server为了数据不丢失,先把数据写入HLog(图像好像画错了,偷懒没有重新画)
- region通过分析写入数据所在列族找到对应的store并写入store中的MemStore(写缓存,相当于一个内存空间)
- 反馈客户端写成功的信息
- MemStore向HFile写入数据(溢写操作flush)
- HFile和HLog等待系统空闲时把数据Put到HDFS文件系统中
注意
memory store 又称为写缓存,因为只有在写入数据的时候,数据才会经过它,而读数据的时候,数据不会经过它。这是为了避免memory store中的数据重复.
那读数据的时候没有缓存么?
BlockCache才是读缓存
具体流程之读取
第一次查询
前面1、2、3与写的操作相同,主要关注后面几步
- 考虑到之前写入的数据最有可能被查询,所以先向查询写缓存MemStore有没有相关数据
- 如果没有在MemStore里找到数据就去HFile里面找数据
- HFile会将找到的数据传递给读缓存,这时读缓存BlockCache里就有内容了
- 读缓存将数据交付给客户端
第二次查询
- 因为第一次查询的时候向BlockCache里写入数据,所以在MemoryStore没有找到数据的时候会从读缓存中查找数据
- 如果读缓存里还是没有相关数据则从HFile里面查找数据,HFile会将相关数据交给BlockCache
- BlockCache向客户端交付数据