Hbase基本概念

一、简介

Hbase是分布式、面向列的开源数据库(其实准确的说是面向列族)。HDFS为Hbase提供可靠的底层数据存储服务,MapReduce为Hbase提供高性能的计算能力,Zookeeper为Hbase提供稳定服务和Failover机制,因此我们说Hbase是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。

二、基本特点

1、海量储存

2、面向列

3、极易扩展

4、稀疏

5、高并发

三、扩展的方式

1、增加regionserver,提高计算能力

2、增加datanode,提高储存能力

四、4个基本概念

1、clumn family(列族)

Hbase通过列族划分数据的存储,列族下面可以包含任意多的列,实现灵活的数据存取。Hbase表的创建的时候就必须指定列族。Hbase的列族不是越多越好,官方推荐的是列族最好小于或者等于3。

2、rowkey

Hbase使用Rowkey来唯一的区分某一行的数据。

hbase查询的三种方式:1、基于Rowkey的单行查询;2、基于Rowkey的范围;3、扫描全表扫描

因此,Rowkey对Hbase的性能影响非常大,Rowkey的设计就显得尤为的重要。设计的时候要兼顾基于Rowkey的单行查询也要键入Rowkey的范围扫描。

3、Region

等同与关系型数据库的分区或者分片。Hbase会将一个大表的数据基于Rowkey的不同范围分配到不通的Region中,每个Region负责一定范围的数据访问和存储。这样即使是一张巨大的表,由于被切割到不通的region,访问起来的时延也很低。

4、timestamp

在Hbase中使用不同的timestame来标识相同rowkey行对应的不通版本的数据。

在写入数据的时候,如果用户没有指定对应的timestamp,Hbase会自动添加一个timestamp,timestamp和服务器时间保持一致。

在Hbase中,相同rowkey的数据按照timestamp倒序排列。默认查询的是最新的版本,用户可同指定timestamp的值来读取旧版本的数据。

五、架构

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节点的主要职责如下:

1)为RegionServer分配Region

2)维护整个集群的负载均衡

3)维护集群的元数据信息

4)发现失效的Region,并将失效的Region分配到正常的RegionServer上

5)当RegionSever失效的时候,协调对应Hlog的拆分

4、Hregionserver

HregionServer直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:

1)管理master为其分配的Region

2)处理来自客户端的读写请求

3)负责和底层HDFS的交互,存储数据到HDFS

4)负责Region变大以后的拆分

5)负责Storefile的合并工作

5、HDFS

HDFS为Hbase提供最终的底层数据存储服务,同时为Hbase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:

提供元数据和表数据的底层分布式存储服务

数据多副本,保证的高可靠和高可用性

六、Region详细介绍

每个Region负责一小部分Rowkey范围的数据的读写和维护,Region包含了对应的起始行到结束行的所有信息。master将对应的region分配给不同的RergionServer,由RegionSever来提供Region的读写服务和相关的管理工作。

Hbase基本概念

RegionServer寻址

1)老的Region寻址方式

在Hbase 0.96版本以前,Hbase有两个特殊的表,分别是-ROOT-表和.META.表,其中-ROOT-的位置存储在ZooKeeper中,-ROOT-本身存储了 .META. Table的RegionInfo信息,并且-ROOT-不会分裂,只有一个region。而.META.表可以被切分成多个region。

Hbase基本概念

第1步:client请求ZK获得-ROOT-所在的RegionServer地址

第2步:client请求-ROOT-所在的RS地址,获取.META.表的地址,client会将-ROOT-的相关信息cache下来,以便下一次快速访问

第3步:client请求.META.表的RS地址,获取访问数据所在RegionServer的地址,client会将.META.的相关信息cache下来,以便下一次快速访问

第4步:client请求访问数据所在RegionServer的地址,获取对应的数据

从上面的路径我们可以看出,用户需要3次请求才能直到用户Table真正的位置,这在一定程序带来了性能的下降。在0.96之前使用3层设计的主要原因是考虑到元数据可能需要很大。但是真正集群运行,元数据的大小其实很容易计算出来。在BigTable的论文中,每行METADATA数据存储大小为1KB左右,如果按照一个Region为128M的计算,3层设计可以支持的Region个数为2^34个,采用2层设计可以支持2^17(131072)。那么2层设计的情况下一个集群可以存储4P的数据。这仅仅是一个Region只有128M的情况下。如果是10G呢? 因此,通过计算,其实2层设计就可以满足集群的需求。因此在0.96版本以后就去掉了-ROOT-表了。

2)新的Region寻址方式

如上面的计算,2层结构其实完全能满足业务的需求,因此0.96版本以后将-ROOT-表去掉了。

Hbase基本概念

访问路径变成了3步:

第1步:Client请求ZK获取.META.所在的RegionServer的地址。

第2步:Client请求.META.所在的RegionServer获取访问数据所在的RegionServer地址,client会将.META.的相关信息cache下来,以便下一次快速访问。

第3步:Client请求数据所在的RegionServer,获取所需要的数据。

总结去掉-ROOT-的原因有如下2点:

其一:提高性能

其二:2层结构已经足以满足集群的需求

这里还有一个问题需要说明,那就是Client会缓存.META.的数据,用来加快访问,既然有缓存,那它什么时候更新?如果.META.更新了,比如Region1不在RerverServer2上了,被转移到了RerverServer3上。client的缓存没有更新会有什么情况?

其实,Client的元数据缓存不更新,当.META.的数据发生更新。如上面的例子,由于Region1的位置发生了变化,Client再次根据缓存去访问的时候,会出现错误,当出现异常达到重试次数后就会去.META.所在的RegionServer获取最新的数据,如果.META.所在的RegionServer也变了,Client就会去ZK上获取.META.所在的RegionServer的最新地址。

七、Hbase的写逻辑

                                    Hbase基本概念

第1步:Client获取数据写入的Region所在的RegionServer

第2步:请求写Hlog

第3步:请求写MemStore

只有当写Hlog和写MemStore都成功了才算请求写入完成。MemStore后续会逐渐刷到HDFS中。

备注:Hlog存储在HDFS,当RegionServer出现异常,需要使用Hlog来恢复数据。

MemStore刷盘

为了提高Hbase的写入性能,当写请求写入MemStore后,不会立即刷盘。而是会等到一定的时候进行刷盘的操作。

1)全局内存控制

这个全局的参数是控制内存整体的使用情况,当所有memstore占整个heap的最大比例的时候,会触发刷盘的操作。这个参数是hbase.regionserver.global.memstore.upperLimit,默认为整个heap内存的40%。但这并不意味着全局内存触发的刷盘操作会将所有的MemStore都进行输盘,而是通过另外一个参数hbase.regionserver.global.memstore.lowerLimit来控制,默认是整个heap内存的35%。当flush到所有memstore占整个heap内存的比率为35%的时候,就停止刷盘。这么做主要是为了减少刷盘对业务带来的影响,实现平滑系统负载的目的。

2)MemStore达到上限

当MemStore的大小达到hbase.hregion.memstore.flush.size大小的时候会触发刷盘,默认128M大小

3)RegionServer的Hlog数量达到上限

前面说到Hlog为了保证Hbase数据的一致性,那么如果Hlog太多的话,会导致故障恢复的时间太长,因此Hbase会对Hlog的最大个数做限制。当达到Hlog的最大个数的时候,会强制刷盘。这个参数是hase.regionserver.max.logs,默认是32个。

4)手工触发

可以通过hbase shell或者java api手工触发flush的操作。

5)关闭RegionServer触发

在正常关闭RegionServer会触发刷盘的操作,全部数据刷盘后就不需要再使用Hlog恢复数据。

6)Region使用HLOG恢复完数据后触发

当RegionServer出现故障的时候,其上面的Region会迁移到其他正常的RegionServer上,在恢复完Region的数据后,会触发刷盘,当刷盘完成后才会提供给业务访问。




转载作者:飞鸿无痕
链接:https://www.jianshu.com/p/569106a3008f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。