HBase组成架构


HBase组成

HBase主要有以下四大组件:Zookeeper(高可用、元数据的统一入口地址、管理HRegionServer)、HMaster(管理HRegionserver、维护集群的元数据信息和负载均衡)、HRegionServer(真正“干活”的节点)、HDFS(多副本底层数据存储服务)

Zookeeper

  • HBase通过Zookeeper来做HA高可用,Zk保存HMaster的地址和backup-master地址,ZK能保证集群中只有1个master在运行,如果master异常,会通过竞争机制选举新的master。
  • Zookeeper管理HRegionServer,监控RegionServer的状态、当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下限的信息。
  • Zookeeper存储元数据的统一入口地址(znode:/hbase/meta-region-server),这就说明zk很重要,把zk关掉你就不能读取数据了。因为你读取数据所需要的元数据表在zk上。

HMaster

  • 管理HRegionServer:为RegionServer分配Region,当RegionSever失效的时候,协调对应Hlog的拆分,将失效的Region分配到正常的RegionServer上。
  • 维护集群的元数据信息,维护集群负载均衡。

HRegionServer

  • 直接对接来自客户端的读写请求,是真正的“干活”的节点,比如表的增删改查数据,和HDFS交互,存取数据。
  • 管理Master为其分配的Region。
  • 负责和底层HDFS的交互,存储数据到HDFS。
  • 负责Region变大以后的拆分。
  • 负责Storefile的合并工作。

HDFS

  • HDFS为HBase提供底层数据存储服务,元数据和表数据都存储在HDFS中,同时为HBase提供高可用(Hlog存储在HDFS)的支持。
  • HDFS数据多副本机制能保证HBase的高可靠性。

HBase架构

在这里插入图片描述

  • 首先HBase中的Table是会分成Region的,比如,user表中有10条记录,那么可能前5条在一个Region中,后5条在另一个Region里,类似于分区的概念,分布式系统中到处可见分区,下篇会具体讲解HBASE中的Region。
  • HMaster会为HRegionServer分配Region,分配后Region落地到HRegionServer上,即图中的HRegion。
  • HRegionServer除了由HRegion组成外,还有一个很重要的东西:Hlog。HBase所有涉及到数据的变更都会写到HLog中。它的作用就是保证数据安全。当RegionServer出现问题的时候,能跟进Hlog来做数据恢复。
  • HRegion由store(memstore,storefile(hfile))组成。写文件时并不直接写入HDFS,而是先停留在MemStore缓冲区,达到一定的量再Flush到StoreFile中,StoreFile是存储HFile的地方,而HFile是真正存储数据的文件。

现在具体来讲解这些组件:

MemStore

MemStore是内存缓冲区,HBase写入数据的时候会先停留在MemStore中,达到一定的时候才会刷盘到StoreFile中。
为什么要有MemStore的存在呢?

  1. 不需要立即写入HDFS,先写内存,内存满了再写HDFS。可以提高写的性能
  2. 可以进行排序。HBase写入到HDFS上的数据是需要按照RowKey进行排序的,而HBase是随机的读写,因此HBase通过MemStore在持久化到HDFS之前完成排序,然后再快速的顺序写入HDFS。主要原理是LSM。
  3. 优化数据的存储,比如一个记录添加之后马上被删除了,在Flush的时候就可以直接不把这个数据写到HDFS中。

为什么要达到一定的时候再刷盘?
那是为了提高HBase的写入性能,所以当写请求写入MemStore后,不会立即刷盘。那么哪些场景会触发刷盘的操作呢?总结如下:

  • Region级别的触发刷写
    hbase.hregion.memstore.flush.size
    当MemStore的大小达到hbase.hregion.memstore.flush.size大小的时候会触发刷盘,默认128M。
  • 全局内存控制
    hbase.regionserver.global.memstore.size //在新的更新被阻止并强制flush之前,RegionServer的全部memstore最大值(默认为堆内存的40%,直到RegionServer中的所有 memstore 的大小达到 hbase.regionserver.global.memstore.size.lower.limit,更新将被阻止并强制flush)
    hbase.regionserver.global.memstore.size.lower.limit //强制刷新之前,RegionServer中所有memstore的最大大小(默认值为:hbase.regionserver.global.memstore.size 的95%),当由于内存限制而导致更新被阻塞时,系统会以尽可能小的刷新量刷新数据)
    举例,比如你配置的hbase.regionserver.global.memstore.size.lower.limit=0.95 hbase.regionserver.global.memstore.size=0.4,堆内存总共是64G,那么
    触发刷写的阈值是:640.40.95=24.32
    触发阻塞的阈值是:64*0.4=25.6
  • HLog引发的刷盘
    HLog中包含了所有已经写入Memstore但还未Flush到HFile的更改。在Memstore中数据还没有持久化,当RegionSever宕掉的时候,可以使用HLog恢复数据。可是当HLog很大的时候,恢复的时候就需要很长的时间。因此,对HLog的大小也有一些限制,当达到这些限制的时候,就会触发Memstore的flush。Memstore flush会使HLog减少,因为数据持久化之后(写入到HFile),就没有必要在HLog中再保存这些修改了。有两个属性可以配置:
    hbase.regionserver.hlog.blocksize//HLog块大小
    hbase.regionserver.maxlogs//HLog的最大个数
    这两个相乘就决定了hlog的最大大小。

HLog

HLog是HBase实现WAL(Write ahead log)方式产生的日志信息,内部是一个简单的顺序日志。每个RegionServer对应1个HLog(备注:1.x版本的可以开启MultiWAL功能,允许多个HLog),因此是多个Region对应同一个HLog。所有对于该RegionServer的写入都被记录到HLog中。HLog功能就是为了保证数据安全。当RegionServer出现问题的时候,能跟进HLog来做数据恢复
数据到达Region是先写入WAL然后再被加载到MemStore中的。
HLog持久化在HDFS之上, HLog存储位置查看:
在这里插入图片描述
我们看到,有一个oldWAL目录,这是啥?刚刚提到,为了避免恢复的时候因为HLog过大导致的效率低下,HLog过大时就会触发强制刷盘操作。对于已经刷盘的数据,其对应的HLog会过期,过期的HLog会被移动到oldWAL。
HLog架构图:
在这里插入图片描述
由图可知,HLog=HLogkey+WALEdit。HLogkey=sequenceid+timestamp+cluster ids+regionname+tablename等组成,WALEdit是由一系列的KeyValue组成。
其中sequenceid非常重要,sequenceid是一个自增序列号,region的数据恢复和HLog过期清除都要依赖它。
HLog的过期依赖于对sequenceid的判断。HBase会将HLog的sequenceid和HFile最大的sequenceid(刷新到的最新位置)进行比较,如果该HLog文件中的sequenceid比刷新的最新位置的sequenceid都要小,那么这个HLog就过期了,过期了以后,对应HLog会被移动到oldWAL目录。
当RegionServer出现故障的时候,需要对HLog进行回放来恢复数据。回放的时候会读取HFile的sequenceid和HLog中的sequenceid进行比较,小于sequenceid的就直接忽略,大于等于的就进行重做。回放完成后,就完成了数据的恢复工作。举例,HFile中sequenceid=10,HLog中sequenceid=15,1-10的在HFile中已经持久化了就不需要恢复了,那么就是恢复11-15的数据。

如何打开和关闭WAL
默认是打开的。Mutation.setDurability(Durability.SKIP_WAL)可以关闭它。这样可以让数据操作快一点,但是最好不要这么做,因为当服务器宕机,数据会丢失。
WAL滚动
WAL是一个环状的滚动日志结构,这样可以保证写入效果最高并且保证空间不会持续变大。
触发滚动的条件:

  1. WAL的检查间隔:hbase.regionserver.logroll.period。默认一小时,上面说了,通过sequenceid,把当前WAL的操作和HDFS对比,看哪些操作已经被持久化了。就被移动到oldWAL目录中。
  2. 当WAL文件所在的块block快要满了
  3. 当WAL所占的空间大于或者等于某个阈值(hbase.regionserver.hlog.blocksize乘hbase.regionserver.logroll.multiplier)blocksize是存储系统的块大小,如果你是基于HDFS只要设定为HDFS的块大小即可,multiplier是一个百分比,默认0.95,即WAL所占的空间大于或者等于95%的块大小,就被归到oldWAL文件中。

oldWAL何时删除
oldWAL什么时候被彻底删除呢?Master会定期的去清理这个文件,如果当这个WAL不需要作为用来恢复数据的备份,那么就可以删除。两种情况下,可能会引用WAL文件,此时不能删除

  1. TTL进程:该进程会保障WAL文件存活到hbase.master.logcleaner.ttl定义的超时时间为止,默认10分钟。
  2. 备份机制:如果你开启了备份机制replication(把一个集群的数据实时备份到里另一个集群),那么HBASE要保障备份集群已经完全不需要这个文件了。如果你手头就一个集群,那么就不需要考虑这个文件了

StoreFile和HFile

StoreFile是对HFile进行了轻量级的包装。HFile是实际数据的存储。
HFile包括:

  • Data:数据块
  • Meta:元数据块
  • Fileinfo:文件信息
  • DataIndex:Data块索引信息
  • MetaIndex:Meta块索引信息
  • Trailer:存储了Fileinfo Dataindex Metaindex的偏移值

本文转载至:http://bigdata-star.com/archives/1175

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值