我们从以上架构图可以得知HBase存储机制涉及到的组件:

一 ZooKeeper作用:

#存储HBase元数据

#负责HMaster的选择和主备切换

#负责对HRegionServer进行监控:HRegionServer会向ZK注册,ZK创建针对每一个RegionServer创建/hbase/rs/[hostname]状态节点;HMaster同时会对这个节点注册监听。当某一个RegionServer挂掉的时候,ZK在一段时间无法接受该RegionServer的心跳信息,则会删除该状态节点。与此同时,HMaster则会接收到ZooKeeper 的NodeDelete 通知,从而感知到某个节点断开,并立即开始容错工作。

HBase为什么不直接让HMaster来负责RegionServer的监控呢?如果HMaster直接通过心跳机制等来管理RegionServer的状态,随着集群越来越大,HMaster的管理负担会越来越重,另外它自身也有挂掉的可能,因此数据还需要持久化。在这种情况下,ZooKeeper就成了理想的选择。

#对RootRegion的管理

对应HBase集群来说,数据存储的位置信息是记录在元数据HRegion,也就是Root Region上的。每次客户端发起新的请求,需要知道数据的位置,就会去查询RootRegion,而RootRegion自身位置则是记录在ZK上的(默认情况下,是记录在ZK的/hbase/meta-region-server节点中)。当Root Region发生变化,比如Region的手工移动、重新负载均衡或Root Region所在服务器发生了故障等是,就能够通过ZK来感知到这一变化并做出一系列相应的容灾措施,从而保证客户端总是能够拿到正确的RootRegion信息。

#Region 管理

HBase里的HRegion会经常发生变更,这些变更的原因来自于系统故障、负载均衡、配置修改、HRegion分裂与合并等。一旦HRegion发生移动,它就会经历下线(offline)和重新上线(online)的过程。

在下线期间数据是不能被访问的,并且HRegion的这个状态变化必须让全局知晓,否则可能会出现事务性的异常。对于大的HBase集群来说,HRegion的数量可能会多达十万级别,甚至更多,这样规模的HRegion状态管理交给ZK来做也是一个很好的选择。

#分布式SplitWAL任务管理

当某台HRegionServer服务器挂掉时,由于总有一部分新写入的数据还没有持久化到StoreFile中,因此在迁移该HRegionServer的服务时,一个重要的工作就是从WAL中恢复这部分还在内存中的数据,而这部分工作最关键的一步就是SplitWAL,即HMaster需要遍历该HRegionServer服务器的WAL,并按HRegion切分成小块移动到新的地址下,并进行日志的回放(replay)。

由于单个HRegionServer的日志量相对庞大(可能有上千个HRegion,上GB的日志),而用户又往往希望系统能够快速完成日志的恢复工作。因此一个可行的方案是将这个处理WAL的任务分给多台HRegionServer服务器来共同处理,而这就又需要一个持久化组件来辅助HMaster完成任务的分配。

当前的做法是,HMaster会在ZooKeeper上创建一个SplitWAL节点(默认情况下,是/hbase/SplitWAL节点),将”哪个HRegionServer处理哪个HRegion”这样的信息以列表的形式存放到该节点上,然后由各个HRegionServer服务器自行到该节点上去领取任务并在任务执行成功或失败后再更新该节点的信息,以通知HMaster继续进行后面的步骤。ZK在这里担负起了分布式集群中相互通知和信息持久化的角色。

二 HMaster作用

2.1管理用户对Table的增删改查操作

2.2管理HRegionServer,实现其父在均衡,调整Region分布

2.3管理和分配Region:Region分裂后,负责新Region的分配;某一个RegionServer宕机之后,接收到ZooKeeper 的NodeDelete 通知然后开始该失效RegionServer上的Region的迁移

三 HRegionServer作用

3.1维护本地的Region,并处理客户端对这些Region读写的I/O请求

3.2负责切分本地Region,当StoreFile大小超过阀值,则会触发Region的split操作,把当前Region切分成2个Region,然后老的Region会下线;新的2个Region会被HMaster分配到相对应的HRegionServer上

HRegionServer内部管理着一系列HRegion对象,每一个HRegion对象对应着Table中的Region。

HRegion由多个HStore组成,每一个HStore对应了Table中的一个ColumnFamily(列簇)的存储。因此可以看出每一个列簇其实就是一个集中的存储单元,因此最好将具备共同I/O特性的列放在一个列簇里,这样可以保证读写的高效

四 HStore作用

HStore是HBase存储的核心,主要由2部分组成:MemStore和StoreFile。MemStore就是 SortedMemory Buffer,用户写入的数据首先会放在这个内存缓存中,当缓冲区满了以后,flush 到StoreFile(底层是HFile)中,当StoreFile文件数达到阀值会触发Compact操作,将多个StoreFile进行合并,合并成一个大的StoreFile。合并过程中会进行版本的合并和数据删除,因此所有的更新和删除操作都是在compact阶段完成的,这使得用户的写操作只要写入内存就可以立即返回,保证HBaseI/O高性能

当合并之后的StoreFile超过阀值,则会触发HRegion的split操作,将一个HRegion分成2个HRegion,老的HRegion会被下线,新的会被HMaster分配到对应的HRegionServer上,可能是当前HRegionServ

Er也有可能是其他HRegionServer上

五 WAL机制的作用

假设在写数据到MemStore的时候,突然HRegionServer挂了,怎么办?

其实在每一次用户写入数据到MemStore的时候,也会把这个数据写入到HLog中,HLog就是实现了WAL的一个类,每一个HRegionSe

Rver都有一个HLog对象。

HLog文件定期会滚动刷新,当MemStore将数据刷到StoreFile的时候,则会把之前记录的数据给删除掉。

HRegionServer挂掉之后,ZK会给HMaster发送一个NodeDelete通知,HMaster收到之后,则会首先处理HLog文件,将该HRegionServer上的所有HLog数据进行拆分,分别放到不同得HRegion目录下,然后再将失效的这些Region重新分配,ZK会记录这些对应地址,其他HRegionServer去ZK领取自己对应的Region,然后去加载这些Region,在加载的过程中,发现有HLog需要处理,因此会将HLog中的数据放到MemStore里面,然后刷新到StoreFile中,完成数据恢复。

六 HFile作用

就是HBase中key-value格式的数据存储文件,他是一个二进制的格式的,StoreFile就是针对HFile进行了一个轻量级的封装而已

七 HLogFile作用

HBase中 WriteAhead Log(WAL)的存储格式,物理上是一个sequencefile

HBase架构设计及原理分析相关推荐

  1. Zookeeper的架构设计及原理分析

    1. Zookeeper 设计猜想 Zookeeper 作为一个分布式协调组件,很多应用系统都会依赖Zookeeper来实现相关业务的处理. 前面我们一直在提到,在分布式架构中任何节点都不能以单点状态 ...

  2. 一文带你了解 Spark 架构设计与原理思想

    卷友们,大家好 ~ 我是 Alex .之前已经陆续输出了 Hadoop三大核心组件 的 架构思想和原理 和 Hive架构设计和原理 ,每篇都受到了读者小伙伴们的一致好评 ~ 感谢大家的支持.大家可能已 ...

  3. 基于Sip的P2P设计和原理分析

    基于Sip的P2P设计和原理分析 1.            SIP网络 2.            P2P技术在互联网上的应用 3.            P2P网络架构 3.1.    集中目录式 ...

  4. GOTC 大会预告 | Apache Pulsar PMC 成员翟佳:Apache Pulsar 架构设计与原理

    关于全球开源技术大会 全球开源技术大会(the global opensource technology conference, GOTC),是由开放原子开源基金会与 Linux 基金会联合开源中国社 ...

  5. 5.8架构设计原则案例分析

    date comments categories tags permalink title 2020/3/15 true 软件架构 架构 原则 5.8 架构设计原则案例分析 前面介绍了架构设计的三条核 ...

  6. 光标飞控硬件架构设计与原理

    更多交流欢迎关注作者抖音号:81849645041 本专栏的STM32F4无人机飞控所有程序都在飞航科技光标飞控上测试通过,本文介绍一下基于STM32F4的光标飞控,便于读者学习交流. 飞行控制系统硬 ...

  7. 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

    MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例, ...

  8. MyBatis架构设计及源代码分析系列(一):MyBatis架构

    一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBatis data mapper framework makes it easier to use a re ...

  9. MyBatis的架构设计以及实例分析--转

    原文地址:http://blog.csdn.net/luanlouis/article/details/40422941 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单 ...

最新文章

  1. IIS访问共享文件详解
  2. 为什么不推荐正沿+lockup+负沿的scan chain?
  3. 分水岭算法及相应处理
  4. 笔记-高项案例题-2017年下-整体管理-变更管理
  5. html密码框不显示,密码框中密码的显示与隐藏切换(JS)
  6. 怎么写ERP实施方案?
  7. golang中的defer
  8. dw网页制作入学教程_简单的手机网页制作教程
  9. jvm--Garbage Collection
  10. maxvalue mysql自动分区_mysql的partition分区
  11. asp.net web submit链接页面_De1CTF2020的Web部分题解
  12. puppet详解(七)——cron资源详解
  13. 如何借助ArrayAdapter和Spinner实现下拉列表
  14. linux中的输出格式化,Linux column使用(格式化输出)
  15. LINUX开机自启问题
  16. Atitit.软件的建模种类and 建模语言选型and UML???
  17. 4x4矩阵键盘扫描c语言程序,4x4矩阵键盘工作原理及扫描程序
  18. 解决Ubuntu16.04 wineQQ和wps office 不能输入中文的问题
  19. Unity UGUI Inputfield 回车submit 按下Enter回车完成
  20. 一切就绪,2019年新型智慧城市峰会将展现怎样的“新益阳”

热门文章

  1. python自定义高阶函数_python基础知识5(集合,高级特性,高阶函数)
  2. 一天测血压的最佳时间_高血压病患者,一天之内在什么时间点测血压最好?
  3. 学习记录——背包问题基础公式解释回顾
  4. 数据科学入门与实战:玩转pandas之五
  5. php开发总结,PHP开发规范总结
  6. java管理系统代码bs_基于BS的人力资源管理系统 - WEB源码|JSP源码/Java|源代码 - 源码中国...
  7. python小数点进位小学数学_python小数的进位与舍去的介绍(附代码)
  8. easypoi 导入失败返回错误文件_从Excel批量导入数据说到ForkJoin的原理
  9. 七年级上册计算机教学反思,七年级信息技术上册教学反思范文.docx
  10. M6315模块连接阿里云物联网MQTT通讯