Hbase简介

目录

Hbase是什么

HBase的特点

Hbase架构各个角色的功能

Hbase的使用场景

Hbase的写逻辑

MemStore 刷盘

Hlog简介

Hlog结构

Hlog的生命周期

产生

滚动

过期

删除

RegionSrver的故障恢复


Hbase是什么

HBASE是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群

HBase的特点

  1. hbase有五个维度来确定某个具体的值 行键 列族 列修饰符  录入类型 时间戳
  2. 强一致性
  3. 稀疏多维列表
  4. 多维稀疏排序Map

BigTable本质上也是一个map结构数据库,hbase亦然,也是由一系列kv组成的 然而hbase的map系统有很多限定词---稀疏的,多维的,分布式的,持久性的,排序的

Hbase的key是一个复合键,由行键,列族,列修饰符,录入类型,时间戳组成,value为cell的值

Cell是hbase中最小的维度,指的就是hbase中具有值的那行数据

每个tableName,rowKey,columnFamily,qualifier,value 所表示的维度就是一个cell

多维:意思就是 map 里的 key 是多维度的,一共是 5 个维度组成的 key,

hbase 核心数据结构是多维 key 组成的 map 数据结构

稀疏:是hbase的一个突出特点,在其他数据库中,对于空值处理一般会填充null值,而对于hbase

空 值不需要任何填充,Hbase的列理论上是允许无限扩展的,对于成百万的列来说,会有大量的空值,如果使用null填充的策略,势必会造成大量空间的浪费,因此,稀疏性是hbase无限扩展的 一个重要条件

排序:构成hbase的kv在同一文件中都是有序的,但规则不仅仅是按照rowkey排序

HBase是三维有序存储的,是指rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度是依照ASCII码表排序的。(比如A排在a前面)

先rowkey升序排序,
rowkey相同则column key升序排序
rowkey、column key相同则timestamp降序排序

分布式: 构成hbase的map都不在某台机器上,而是分布在整个集群中

5.HDFS压缩存储

6.自动水平扩展

7.服务器自动调整平衡

HDFS为Hbase提供可靠的底层数据存储服务

MapReduce为Hbase停供高性能的计算能力

Zookeeper为Hbase提供稳定服务和FailOver(容错)机制

因此我们说Hbase是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案

Hbase架构各个角色的功能

  • Client

Client包含了访问Hbase的接口,另外Client还维护了对应的cache来提高HBase的访问,比如说cache的META的元数据信息

  • Zookeeper

Hbase通过Zookeeper来做master的高可用,RegionServer的监控,元数据的入口以及集群配置的维护等工作

通过Zookeeper来保证集群中只有一个master在运行,如果master异常,会通过竞争机制来产生新的master提供服务.

通过Zookeeper来监控ReginServer,当RegionServer有异常的时候,通过回调的形式通知mastor

RegionServer上下限的信息

通过zookeeper存储元数据的统一入口地址

  • Hmaster
  1. 为RegionServer分配Region
  2. 维护整个集群的负载均衡
  3. 维护集群的元数据信息
  4. 发现失效的Region,并将失效的Region分配到正常的RegionServer上
  5. 当RegionServer失效的时候,协调对应的Hlog进行拆分
  • HregionServer

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

  1. 管理master为其分配的Region
  2. 处理来自客户端的读写请求
  3. 负责和底层HDFS的交互,存储数据到HDFS
  4. 负责Region变大以后的拆分
  5. 负责Storefile的合并工作  存储文件
  • HDFS

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

  1. 提供元数据和表数据的底层分布式存储服务
  2. 数据多副本,保证的高可靠和高可用性

Hbase的使用场景

由于HBase丰富的特性,加上自身的海量数据存储能力与超大规模并发访问能力,使得HBase应用非常广泛。目前已经在金融、交通、医疗、车联网、IoT等众多领域有了最佳实践,涉及到订单/账单存储、用户画像、时空/时序数据、对象存储、Cube分析等各个使用场景。

在实际生产过程中满足哪些条件的时候可以选择HBase作为底层存储

1、数据量规模非常庞大

一般而言,单表数据量如果只有百万级或者更少,不是非常建议使用HBase而应该考虑关系型数据库是否能够满足需求;单表数据量超过千万或者十亿百亿的时候,并且伴有较高并发,可以考虑使用HBase。这主要是充分利用分布式存储系统的优势,如果数据量比较小,单个节点就能有效存储的话则其他节点的资源就会存在浪费。

2、要求是实时的点查询

HBase是一个Key-Value数据库,默认对Rowkey即行键做了索引优化,所以即使数据量非常庞大,根据行键的查询效率依然会很高,这使得HBase非常适合根据行键做单条记录的查询。值得说明的是,允许根据行键的一部分做范围查询,这里涉及到Rowkey的设计问题,不再赘言。

3、能够容忍NoSQL短板

前面提及了NoSQL并不能解决所有问题,HBase也是一样,如果业务场景是需要事务支持、复杂的关联查询等,不建议使用HBase。HBase有它适合的业务场景,我们不能苛求它能够帮我们解决所有问题。

4、数据分析需求并不多

虽然说HBase是一个面向列的数据库,但它有别于真正的列式存储系统比如Parquet、Kudu等,再加上自身存储架构的设计,使得HBase并不擅长做数据分析,或者说数据分析是HBase的弱项,所以如果主要的业务需求就是为了做数据分析,比如做报表,那么不建议直接使用HBase。

如果能够满足上诉的几点,硬件条件也满足的情况下,强烈建议考虑使用HBase作为底层存储解决你的问题。

Hbase的写逻辑

Hbase的写逻辑涉及到写内存、写log、刷盘等操作,看起来简单,其实里面又有很多的逻辑,下面就来做详细的介绍。 

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

第2步:请求写Hlog

第3步:请求写MemStore

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

PS: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 的大小达到 hbase.hregion.memstore.flush.size 大小的时候会触发刷盘,默认 128M 大小
  3. 前面说到 Hlog 为了保证 Hbase 数据的一致性,那么如果 Hlog 太多的话,会导致故障恢复的时间太长,因此 Hbase 会对 Hlog 的最大个数做限制。当达到 Hlog 的最大个数的时候,会强制刷盘。这个参数是 hase.regionserver.max.logs,默认是 32 个。
  4. 可以通过 hbase shell 或者 java api 手工触发 flush 的操作。
  5. 在正常关闭 RegionServer 会触发刷盘的操作,全部数据刷盘后就不需要再使用 Hlog 恢复数据。
  6. 当 RegionServer 出现故障的时候,其上面的 Region 会迁移到其他正常的 RegionServer 上,在恢复完 Region 的数据后,会触发刷盘,当刷盘完成后才会提供给业务访问。

Hlog简介

Hlog是Hbase实现WAL(Write ahead log)方式产生的日志信息,内部是一个简单的顺序日志。每个RegionServer对应1个Hlog(备注:1.x版本的可以开启MultiWAL功能,允许多个Hlog),所有对于该RegionServer的写入都被记录到Hlog中。Hlog实现的功能就是保证数据安全。当RegionServer出现问题的时候,能跟进Hlog来做数据恢复。此外为了保证恢复的效率,Hbase会限制最大保存的Hlog数量,如果达到Hlog的最大个数(hase.regionserver.max.logs参数控制)的时候,就会触发强制刷盘操作。对于已经刷盘的数据,其对应的Hlog会有一个过期的概念,Hlog过期后,会被监控线程移动到.oldlogs,然后会被自动删除掉。

Hlog结构

             

  1. 多个Region共享一个Hlog文件,
  2. 单个Region在Hlog中是按照时间顺序存储的,
  3. 但是多个Region可能并不是完全按照时间顺序

  序列id

每个Hlog最小单元由Hlogkey和 两部分组成。Hlogky由sequenceid、timestamp、克拉死ter,cluster ids、regionname以及tablename等组成,WALEdit是由一系列的KeyValue组成,对一行上所有列(即所有KeyValue)的更新操作,都包含在同一个WALEdit对象中,这主要是为了实现写入一行多个列时的原子性。

  1. Hlog
    1. Hlogkey
      • sequenceid : 一个store级别的自增序列号,region的数据恢复和Hlog过期清除都要依赖这个信息
      • timestamp
      • cluster ids
      • regionname
      • tablename
    2. WALEdit
      • n个 KeyValue
    3. sequenceid的相关逻辑:Memstore在达到一定的条件会触发刷盘的操作,刷盘的时候会获取刷新到最新的一个sequenceid的下一个sequenceid,并将新的sequenceid赋给oldestUnflushedSequenceId,并刷到Ffile中。Hlog文件对应所有Region的store中最大的sequenceid如果已经刷盘,就认为Hlog文件已经过期,就会移动到.oldlogs,等待被移除当RegionServer出现故障的时候,需要对Hlog进行回放来恢复数据。回放的时候会读取Hfile的oldestUnflushedSequenceId中的sequenceid和Hlog中的sequenceid进行比较,小于sequenceid的就直接忽略,但与或者等于的就进行重做。回放完成后,就完成了数据的恢复工作

Hlog的生命周期

产生

所有涉及到数据的变更都会先写Hlog,除非是你关闭了Hlog

滚动

Hlog的大小通过参数hbase.regionserver.logroll.period控制,默认是1个小时,时间达到hbase.regionserver.logroll.period 设置的时间,Hbase会创建一个新的Hlog文件。这就实现了Hlog滚动的目的。Hbase通过hbase.regionserver.maxlogs参数控制Hlog的个数。滚动的目的,为了控制单个Hlog文件过大的情况,方便后续的过期和删除。

过期

Hlog的过期判断依赖于sequenceid。Hbase会将Hlog的sequenceid和Hfile最大的sequenceid(刷新到的最新位置)进行比较,如果该Hlog文件中的sequenceid比刷新的最新位置的sequenceid都要小,那么这个Hlog就过期了,过期了以后,对应Hlog会被移动到.oldlogs目录。

要将过期的Hlog移动到.oldlogs目录,而不是直接删除,原因如下:

因为Hbase还有一个主从同步的功能,这个依赖Hlog来同步Hbase的变更,有一种情况不能删除Hlog,那就是Hlog虽然过期,但是对应的Hlog并没有同步完成,因此比较好的做法是移动到别的目录。再增加对应的检查和保留时间。

删除

如果Hbase开启了replication,当replication执行完一个Hlog的时候,会删除Zoopkeeper上的对应Hlog节点。在Hlog被移动到.oldlogs目录后,Hbase每隔hbase.master.cleaner.interval(默认60秒)时间会去检查.oldlogs目录下的所有Hlog,确认对应的Zookeeper的Hlog节点是否被删除,如果Zookeeper 上不存在对应的Hlog节点,那么就直接删除对应的Hlog。

hbase.master.logcleaner.ttl(默认10分钟)这个参数设置Hlog在.oldlogs目录保留的最长时间。

RegionSrver的故障恢复

我们知道,RegionServer的相关信息保存在ZK中,在RegionServer启动的时候,会在Zookeeper中创建对应的临时节点。RegionServer通过Socket和Zookeeper建立session会话,RegionServer会周期性地向Zookeeper发送ping消息包,以此说明自己还处于存活状态。而Zookeeper收到ping包后,则会更新对应session的超时时间。

当Zookeeper超过session超时时间还未收到RegionServer的ping包,则Zookeeper会认为该RegionServer出现故障,ZK会将该RegionServer对应的临时节点删除,并通知Master,Master收到RegionServer挂掉的信息后就会启动数据恢复的流程.

  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值