HBase的应用场景及架构原理

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
云原生网关 MSE Higress,422元/月
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 笔记

一、HBase在实际业务场景中的应用


HBase是一个构建在HDFS上的分布式列存储系统;HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储

HBase能做什么?


海量数据存储

准实时查询

举例说明HBase在实际业务场景中的应用


交通

金融

电商

移动


二、HBase的特点


容量大:HBase单表可以有百亿行,百万列,数据矩阵横向和纵向两个纬度所支持的数据量级别都非常具有弹性

稀疏性:为空的列并不占用存储空间,表可以设计的非常稀疏

多版本:HBase每一列的数据存储有多个Version

面向列:HBase是面向列的存储和权限控制,并支持独立检索。列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数据量。

扩展性:底层依赖于HDFS

高可靠性:WAL机制保证了数据写入时不会因集群异常而导致写入数据丢失:Replication机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。而HBase底层使用HDFS,HDFS本身也有备份。

高性能:底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得HBase具有非常的写入性能。region切分、主键索引和缓存机制使得HBase在海量数据下具备一定的随机读取性能,该性能针对Rowkey的查询能够达到毫秒级。


三、HBase数据模型并举例说明


(1)逻辑存储模型

1.pngimage.pngimage.pngimage.png

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

Column Family(列族):Hbase通过列族划分数据的存储,列族下面可以包含任意多的列,实现灵活的数据存取。Hbase的列族不是越多越好,官方推荐的是列族最好小于或者等于3。我们使用的场景一般是1个列族。

Time Stamp(时间戳):TimeStamp对Hbase来说至关重要,因为它是实现Hbase多版本的关键。在Hbase中使用不同的timestame来标识相同rowkey行对应的不通版本的数据。

Cell:HBase 中通过 rowkey 和 columns 确定的为一个存储单元称为 cell。每个 cell 都保存着同一份 数据的多个版本。版本通过时间戳来索引。


(2)物理存储模型

Hbase的Table中的所有行都按照row key的字典序排列。Table 在行的方向上分割为多个Region。Region按大小分割的,每个表开始只有一个region,随 着数据增多,region不断增大,当增大到一个阀值的时候, region就会等分会两个新的region,之后会有越来越多的 region。7.png5.png

Region是HBase中分布式存储和负载均衡的最小单元。 不同Region分布到不同RegionServer上。

6.png

Region虽然是分布式存储的最小单元,但并不是存储 的最小单元。Region由一个或者多个Store组成,每个store保存一个 columns family。每个Strore又由一个memStore和0至多个StoreFile组成。memStore存储在内存中,StoreFile存储在HDFS上。

8.png


四、HBase基本架构

10.png

包括了HMaster、HRegionSever、HRegion、HLog、Store、MemStore、StoreFile、HFile等。HBase底层依赖HDFS,通过DFS Cilent进行HDFS操作。HMaster负责把HRegion分配给HRegionServer,每一个HRegionServer可以包含多个HRegion,多个HRegion共享HLog,HLog用来做灾难恢复。每一个HRegion由一个或多个Store组成,一个Store对应表的一个列族,每个Store中包含与其对应的MemStore以及一个或多个StoreFile(是实际数据存储文件HFile的轻量级封装),MemStore是在内存中的,保存了修改的数据,MemStore中的数据写到文件中就是StoreFile。


(1)HMaster

HMaster的主要功能有:


把HRegion分配到某一个RegionServer。

有RegionServer宕机了,HMaster可以把这台机器上的Region迁移到active的RegionServer上。

对HRegionServer进行负载均衡。

通过HDFS的dfs client接口回收垃圾文件(无效日志等)

注:HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。


(2)HRegionServer

HRegionServer的主要功能有:


维护HMaster分配给它的HRegion,处理对这些HRegion的IO请求,也就是说客户端直接和HRegionServer打交道。(从图中也能看出来)

负责切分正在运行过程中变得过大的HRegion


(3)基本架构

HBase构建在HDFS之上,其组件包括 Client、zookeeper、HDFS、Hmaster以及HRegionServer。Client包含访问HBase的接口,并维护cache来加快对HBase的访问。Zookeeper用来保证任何时候,集群中只有一个master,存贮所有Region的寻址入口以及实时监控Region server的上线和下线信息。并实时通知给Master存储HBase的schema和table元数据。HMaster负责为Region server分配region和Region server的负载均衡。如果发现失效的Region server并重新分配其上的region。同时,管理用户对table的增删改查操作。Region Server 负责维护region,处理对这些region的IO请求并且切分在运行过程中变得过大的region。

11.png

HBase 依赖ZooKeeper,默认情况下,HBase 管理ZooKeeper 实例。比如, 启动或者停止ZooKeeper。Master与RegionServers 启动时会向ZooKeeper注册。因此,Zookeeper的引入使得 Master不再是单点故障。

12.png

Client每次写数据库之前,都会首先血Hlog日志。记录写操作。如果不做日志记录,一旦发生故障,操作将不可恢复。HMaster一旦故障,Zookeeper将重新选择一个新的Master 。无Master过程中,数据读取仍照常进行。但是,无master过程中,region切分、负载均衡等无法进行。RegionServer出现故障的处理原理是定时向Zookeeper汇报心跳,如果一旦时 间内未出现心跳HMaster将该RegionServer上的Region重新分配到其他RegionServer上。失效服务器上“预写”日志由主服务器进行分割并派送给新的 RegionServer 。Zookeeper是一个可靠地服务,一般配置3或5个Zookeeper实例。

13.png

寻找RegionServer定位的顺序是ZooKeeper --ROOT-(单Region) -.META. -用户表 。如上图所示。-ROOT- 表包含.META.表所在的region列表,该表只会有一 个Region。 Zookeeper中记录了-ROOT-表的location。 .META. 表包含所有的用户空间region列表,以及 RegionServer的服务器地址。


五、HBase读写流程


(1)写流程

14.png

client首先会去读zookeeper上的meta-region-server表信息,获取hbase:meta 表位于哪个Region Server;

访问对应的Region Server,获取hbase:meta 表,此meta表信息记录了HBase所有表region信息

根据读请求的namespace:table/rowkey,查询 出目标数据位于哪个Region Server 中的哪个Region 中

并将该table 的region 信息以及meta 表 的位置信息缓存在客户端的meta cache,方便下次访问。

与目标Region Server 进行通讯

将数据顺序写入(追加)到WAL

将数据写入对应的MemStore,数据会在MemStore 进行排序

向客户端发送ack

等达到MemStore 的刷写时机后,将数据刷写到HFile


(2)读流程

15.png

client首先会去读zookeeper上的meta-region-server表信息,获取hbase:meta 表位于哪个Region Server;

访问对应的Region Server,获取hbase:meta 表,此meta表信息记录了HBase所有表region信息

根据读请求的namespace:table/rowkey,查询 出目标数据位于哪个Region Server 中的哪个Region 中

并将该table 的region 信息以及meta 表 的位置信息缓存在客户端的meta cache,方便下次访问。

与目标Region Server 进行通讯

分别在Block Cache(读缓存),MemStore 和Store File(HFile)中查询目标数据,并将查到的 所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型 (Put/Delete)。

将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为64KB)缓存到Block Cache。

将合并后的最终结果返回给客户端。


六、Flush


16.png

MemStore的刷写时机


当某个memstroe 的大小达到了hbase.hregion.memstore.flush.size(默认值128M),其所 在region的所有memstore 都会刷写。当memstore 的大小达到了hbase.hregion.memstore.flush.size(默认值128M)hbase.hregion.memstore.block.multiplier(默认值4)时,会阻止继续往该memstore 写数 据。


当region server中memstore的总大小达到hbase.regionserver.global.memstore.size(默认值0.4)hbase.regionserver.global.memstore.size.lower.limit(默认值0.95),region 会按照其所有memstore 的大小顺序(由大到小)依次进行刷写。直到region server中所 有memstore 的总大小减小到上述值以下。当region server 中memstore 的总大小达到hbase.regionserver.global.memstore.size(默认值0.4)时,会阻止继续往 所有的memstore 写数据。


到达自动刷写的时间,也会触发memstore flush。自动刷新的时间间隔由以下参数决定 hbase.regionserver.optionalcacheflushinterval(默认1 小时)。


当WAL 文件的数量超过hbase.regionserver.max.logs,region 会按照时间顺序依次进行刷 写,直到WAL 文件数量减小到hbase.regionserver.max.log 以下(该属性名已经废弃,现无需手 动设置,最大值为32)。


七、StoreFile Compaction


由于memstore 每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类 型(Put/Delete)有可能会分布在不同的HFile 中,因此查询时需要遍历所有的HFile。


为了减少HFile 的个数,以及清理掉过期和删除的数据,会进行StoreFile Compaction。Compaction 分为两种分别是Minor Compaction 和Major Compaction。


Minor Compaction会将临近的若干个较小的HFile 合并成一个较大的HFile,但不会清理过期和删 除的数据。

Major Compaction 会将一个Store 下的所有的HFile 合并成一个大HFile,并且会清理掉过期和删 除的数据。


17.png


八、Region Split


默认情况下,每个Table 起初只有一个Region,随着数据的不断写入,Region 会自动进行拆分。刚拆 分时,两个子Region 都位于当前的Region Server,但处于负载均衡的考虑,HMaster 有可能会将某个 Region 转移给其他的Region Server。


Region Split 时机:


当1 个region 中的某个Store 下所有StoreFile 的总大小超过hbase.hregion.max.filesize, 该Region 就会进行拆分(0.94 版本之前)。

当1 个region 中的某个Store 下所有StoreFile 的总大小超过Min(R^2 *“hbase.hregion.memstore.flush.size”,hbase.hregion.max.filesize"),该Region 就 会进行拆分,其中R 为当前Region Server 中属于该Table 的个数(0.94 版本之后)。

18.png


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1天前
|
前端开发 API UED
深入理解微前端架构:构建灵活、高效的前端应用
【10月更文挑战第23天】微前端架构是一种将前端应用分解为多个小型、独立、可复用的服务的方法。每个服务独立开发和部署,但共同提供一致的用户体验。本文探讨了微前端架构的核心概念、优势及实施方法,包括定义服务边界、建立通信机制、共享UI组件库和版本控制等。通过实际案例和职业心得,帮助读者更好地理解和应用微前端架构。
|
3天前
|
运维 监控 Serverless
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
11 1
|
9天前
|
运维 Cloud Native 持续交付
云原生技术在现代IT架构中的深度应用与挑战####
【10月更文挑战第17天】 本文深入剖析了云原生技术的精髓,探讨其在现代IT架构转型中的核心作用与面临的挑战。云原生不仅是一种技术实现,更是企业数字化转型的重要推手,通过容器化、微服务、持续集成/持续部署(CI/CD)等关键要素,重塑软件开发、部署与运维模式。文章首先概述了云原生的基本原则与核心组件,随后分析了其如何促进企业敏捷性、可扩展性和资源利用率的提升,同时也指出了在安全性、复杂性管理及人才技能匹配等方面存在的挑战,并提出了相应的对策建议。 ####
34 6
|
10天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
7天前
|
前端开发 API UED
拥抱微前端架构:构建灵活、高效的前端应用
【10月更文挑战第17天】微前端架构是一种将前端应用拆分为多个小型、独立、可复用的服务的方法,每个服务可以独立开发、部署和维护。本文介绍了微前端架构的核心概念、优势及实施步骤,并分享了业界应用案例和职业心得,帮助读者理解和应用这一新兴架构模式。
|
12天前
|
存储 监控 前端开发
掌握微前端架构:构建未来前端应用的基石
【10月更文挑战第12天】随着前端技术的发展,传统的单体应用架构已无法满足现代应用的需求。微前端架构通过将大型应用拆分为独立的小模块,提供了更高的灵活性、可维护性和快速迭代能力。本文介绍了微前端架构的概念、核心优势及实施步骤,并探讨了其在复杂应用中的应用及实战技巧。
|
11天前
|
运维 Go 开发者
Go语言在微服务架构中的应用与优势
本文深入探讨了Go语言在构建微服务架构中的独特优势和实际应用。通过分析Go语言的核心特性,如简洁的语法、高效的并发处理能力以及强大的标准库支持,我们揭示了为何Go成为开发高性能微服务的首选语言。文章还详细介绍了Go语言在微服务架构中的几个关键应用场景,包括服务间通信、容器化部署和自动化运维等,旨在为读者提供实用的技术指导和启发。
|
14天前
|
存储 消息中间件 人工智能
ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用
本文整理自2024年云栖大会阿里云智能集团高级技术专家金吉祥的演讲《ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用》。
|
13天前
|
设计模式 测试技术 持续交付
架构视角下的NHibernate:设计模式与企业级应用考量
【10月更文挑战第13天】随着软件开发向更复杂、更大规模的应用转变,数据访问层的设计变得尤为重要。NHibernate作为一个成熟的对象关系映射(ORM)框架,为企业级.NET应用程序提供了强大的支持。本文旨在为有一定经验的开发者提供一个全面的指南,介绍如何在架构层面有效地使用NHibernate,并结合领域驱动设计(DDD)原则来构建既强大又易于维护的数据层。
30 2
|
14天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
41 3