HBase分布式数据库架构及原理

简介: Client是操作HBase集群的入口,对于管理类的操作,如表的增、删、改操纵,Client通过RPC与HMaster通信完成,对于表数据的读写操作,Client通过RPC与RegionServer交互,读写数据。

@[TOC]

一、HBase的整体架构

1、Client客户端

Client是操作HBase集群的入口,对于管理类的操作,如表的增、删、改操纵,Client通过RPC与HMaster通信完成,对于表数据的读写操作,Client通过RPC与RegionServer交互,读写数据。
Client类型:

  • HBase shell
  • Java编程接口
  • Thrift、Avro、Rest等等
2、ZooKeeper集群

作用:
1、实现了HMaster的高可用,多HMaster间进行主备选举
2、保存了HBase的元数据信息meta表,提供了HBase表中region的寻址入口的线索数据
3、对HMaster和HRegionServer实现了监控

3、HMaster

HBase集群也是主从架构,HMaster是主的角色,主要负责Table表和Region的相关管理工作,管理Client对Table的增删改的操作,在Region分裂后,负责新Region分配到指定的HRegionServer上,管理HRegionServer间的负载均衡,迁移region分布。当HRegionServer宕机后,负责其上的region的迁移。

4、HRegionServer

HBase集群中从的角色,作用为响应客户端的读写数据请求、负责管理一系列的Region、切分在运行过程中变大的region。

5、Region

HBase集群中分布式存储的最小单元,一个Region对应一个Table表的部分数据。

如下为HBase的整体架构图:
在这里插入图片描述

1. HBase的数据存储原理

  • 一个HRegionServer会负责管理很多个region,一个region包含很多个store,一个列族就划分成一个store

( 如果一个表中只有1个列族,那么这个表的每一个region中只有一个store,如果一个表中有N个列族,那么这个表的每一个region中有N个store)

  • 一个store里面只有一个memstore,memstore是一块内存区域,写入的数据会先写入memstore进行缓冲,然后再把数据刷到磁盘。
  • 一个store里面有很多个StoreFile, 最后数据是以很多个HFile这种数据结构的文件保存在HDFS上。StoreFile是HFile的抽象对象,如果说到StoreFile就等于HFile。每次memstore刷写数据到磁盘,就生成对应的一个新的HFile文件出来。

在这里插入图片描述
在这里插入图片描述

2. HBase读数据流程

在这里插入图片描述

说明:HBase集群,只有一张meta表,此表只有一个region,该region数据保存在一个HRegionServer上
  • 1、客户端首先与zk进行连接;

    • 从zk找到meta表的region位置,即meta表的数据存储在某一HRegionServer上;
    • 客户端与此HRegionServer建立连接,然后读取meta表中的数据;meta表中存储了所有用户表的region信息,我们可以通过scan 'hbase:meta'来查看meta表信息
  • 2、根据要查询的namespace、表名和rowkey信息。找到写入数据对应的region信息
  • 3、找到这个region对应的regionServer,然后发送请求
  • 4、查找并定位到对应的region
  • 5、先从memstore查找数据,如果没有,再从BlockCache上读取

    • HBase上Regionserver的内存分为两个部分

      • 一部分作为Memstore,主要用来写;
      • 另外一部分作为BlockCache,主要用于读数据;
  • 6、如果BlockCache中也没有找到,再到StoreFile上进行读取

    • 从storeFile中读取到数据之后,不是直接把结果数据返回给客户端,而是把数据先写入到BlockCache中,目的是为了加快后续的查询;然后再返回结果给客户端。

3. HBase写数据流程

1、客户端首先从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息
2、根据namespace、表名和rowkey信息。找到写入数据对应的region信息
3、找到这个region对应的regionServer,然后发送请求
4、把数据分别写到HLog(write ahead log)和memstore各一份
5、memstore达到阈值后把数据刷到磁盘,生成storeFile文件
6、删除HLog中的历史数据

HLog(write ahead log):也称为WAL意为Write ahead log,类似mysql中的binlog,用来做灾难恢复时用,HLog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。

4. HBase的flush、compact机制

在这里插入图片描述

4.1 Flush触发条件

4.1.1 memstore级别限制
  • 当Region中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128MB),会触发Memstore刷新。

    <property>
       <name>hbase.hregion.memstore.flush.size</name>


##### 4.1.2 region级别限制
当Region中所有Memstore的大小总和达到了上限(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 2* 128M = 256M),会触发memstore刷新。

<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>


<name>hbase.hregion.memstore.block.multiplier</name>
<value>4</value>

##### 4.1.3 Region Server级别限制

- 当一个Region Server中所有Memstore的大小总和超过低水位阈值hbase.regionserver.global.memstore.size.lower.limit*hbase.regionserver.global.memstore.size(前者默认值0.95),RegionServer开始强制flush;
- 先Flush Memstore最大的Region,再执行次大的,依次执行;
- 如写入速度大于flush写出的速度,导致总MemStore大小超过高水位阈值hbase.regionserver.global.memstore.size(默认为JVM内存的40%),此时RegionServer会阻塞更新并强制执行flush,直到总MemStore大小低于低水位阈值

<name>hbase.regionserver.global.memstore.size.lower.limit</name>
<value>0.95</value>


<name>hbase.regionserver.global.memstore.size</name>
<value>0.4</value>

##### 4.1.4 HLog数量上限

当一个Region Server中HLog数量达到上限(可通过参数hbase.regionserver.maxlogs配置)时,系统会选取最早的一个 HLog对应的一个或多个Region进行flush

##### 4.1.5 定期刷新Memstore
默认周期为1小时,确保Memstore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致的问题,定期的flush操作有20000左右的随机延时。

##### 4.1.6 手动flush
用户可以通过shell命令`flush ‘tablename’`或者`flush ‘region name’`分别对一个表或者一个Region进行flush。
#### 4.2 flush的流程

- 为了减少flush过程对读写的影响,将整个flush过程分为三个阶段:
  - prepare阶段:遍历当前Region中所有的Memstore,将Memstore中当前数据集CellSkipListSet做一个**快照snapshot**;然后再新建一个CellSkipListSet。后期写入的数据都会写入新的CellSkipListSet中。prepare阶段需要加一把updateLock对**写请求阻塞**,结束之后会释放该锁。因为此阶段没有任何费时操作,因此持锁时间很短。

  - flush阶段:遍历所有Memstore,将prepare阶段生成的snapshot持久化为**临时文件**,临时文件会统一放到目录.tmp下。这个过程因为涉及到磁盘IO操作,因此相对比较耗时。
  - commit阶段:遍历所有Memstore,将flush阶段生成的临时文件移到指定的ColumnFamily目录下,针对HFile生成对应的storefile和Reader,把storefile添加到HStore的storefiles列表中,最后再**清空**prepare阶段生成的snapshot。

#### 4.3  Compact合并机制

- hbase为了==防止小文件过多==,以保证查询效率,hbase需要在必要的时候将这些小的store file合并成相对较大的store file,这个过程就称之为compaction。

- 在hbase中主要存在两种类型的compaction合并
  - **==minor compaction 小合并==**
  - **==major compaction 大合并==**

#### 4.3.1 minor compaction 小合并
在将Store中多个HFile合并为一个HFile,在这个过程中会选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,对于超过了==TTL的数据、更新的数据、删除的数据==仅仅只是做了标记。并没有进行物理删除,一次Minor Compaction的结果是更少并且更大的StoreFile。这种合并的触发频率很高。
minor compaction触发条件由以下几个参数共同决定:

<name>hbase.hstore.compactionThreshold</name>
<value>3</value>

<name>hbase.hstore.compaction.max</name>
<value>10</value>

<name>hbase.hstore.compaction.min.size</name>
<value>134217728</value>

<name>hbase.hstore.compaction.max.size</name>
<value>9223372036854775807</value>

#### 4.3.2 major compaction 大合并

合并Store中所有的HFile为一个HFile,将所有的StoreFile合并成一个StoreFile,这个过程还会清理三类无意义数据:被删除的数据、TTL过期数据、版本号超过设定版本号的数据。合并频率比较低,默认**7天**执行一次,并且性能消耗非常大,建议生产关闭(设置为0),在应用空闲时间手动触发。一般可以是手动控制进行合并,防止出现在业务高峰期。

major compaction触发时间条件

<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>

手动触发

使用major_compact命令

major_compact tableName

### 5. HBase表的预分区

当一个table刚被创建的时候,Hbase默认的分配一个region给table。也就是说这个时候,所有的读写请求都会访问到同一个regionServer的同一个region中,这个时候就达不到负载均衡的效果了,集群中的其他regionServer就可能会处于比较空闲的状态。
解决这个问题可以用**pre-splitting**,在创建table的时候就配置好,生成多个region。

#### 5.1 预分区意义

* 增加数据读写效率
* 负载均衡,防止数据倾斜
* 方便集群容灾调度region
* 优化Map数量,当要对HBase数据进行分析操作时,可以通过它来优化map数量,即一个region对应一个maptask。

#### 5.2 预分区原理
- 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。

#### 5.3 手动指定预分区
**方式一:直接创建时使用数组指定**

create 'person','info1','info2',SPLITS => ['1000','2000','3000','4000']

**方式二:也可以把分区规则创建于文件中**

cd /book/install
vim prepart.txt

文件内容

aaa
bbb
ccc
ddd

hbase shell中,执行命令

create 'student','info',SPLITS_FILE => '/book/install/prepart.txt'

**方式三: HexStringSplit 算法**
HexStringSplit会将数据从“00000000”到“FFFFFFFF”之间的数据长度按照**n等分**之后算出每一段的起始rowkey和结束rowkey,以此作为拆分点。

如:

create 'mytable', 'base_info',' extra_info', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7天前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
43 5
|
3月前
|
存储 缓存 NoSQL
分布式系统架构8:分布式缓存
本文介绍了分布式缓存的理论知识及Redis集群的应用,探讨了AP与CP的区别,Redis作为AP系统具备高性能和高可用性但不保证强一致性。文章还讲解了透明多级缓存(TMC)的概念及其优缺点,并详细分析了memcached和Redis的分布式实现方案。此外,针对缓存穿透、击穿、雪崩和污染等常见问题提供了应对策略,强调了Cache Aside模式在解决数据一致性方面的作用。最后指出,面试中关于缓存的问题多围绕Redis展开,建议深入学习相关知识点。
322 8
|
7天前
|
SQL 存储 分布式数据库
分布式存储数据恢复—hbase和hive数据库数据恢复案例
分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误删除,数据库不能使用。要求恢复hbase和hive数据库。
50 12
|
1月前
|
消息中间件 人工智能 监控
文生图架构设计原来如此简单之分布式服务
想象一下,当成千上万的用户同时要求AI画图,如何公平高效地处理这些请求?文生图/图生图大模型的架构设计看似复杂,实则遵循简单而有效的原则:合理排队、分工明确、防患未然。
90 14
文生图架构设计原来如此简单之分布式服务
|
1月前
|
并行计算 PyTorch 算法框架/工具
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
本文探讨了如何通过技术手段混合使用AMD与NVIDIA GPU集群以支持PyTorch分布式训练。面对CUDA与ROCm框架互操作性不足的问题,文章提出利用UCC和UCX等统一通信框架实现高效数据传输,并在异构Kubernetes集群中部署任务。通过解决轻度与强度异构环境下的挑战,如计算能力不平衡、内存容量差异及通信性能优化,文章展示了如何无需重构代码即可充分利用异构硬件资源。尽管存在RDMA验证不足、通信性能次优等局限性,但该方案为最大化GPU资源利用率、降低供应商锁定提供了可行路径。源代码已公开,供读者参考实践。
84 3
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
|
1月前
|
人工智能 运维 监控
领先AI企业经验谈:探究AI分布式推理网络架构实践
当前,AI行业正处于快速发展的关键时期。继DeepSeek大放异彩之后,又一款备受瞩目的AI智能体产品Manus横空出世。Manus具备独立思考、规划和执行复杂任务的能力,其多智能体架构能够自主调用工具。在GAIA基准测试中,Manus的性能超越了OpenAI同层次的大模型,展现出卓越的技术实力。
|
2月前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
2月前
|
SQL 运维 关系型数据库
体验用分布式数据库突破资源瓶颈,完成任务领智能台灯!
体验用分布式数据库突破资源瓶颈,完成任务领智能台灯!
|
3月前
|
存储 Prometheus Cloud Native
分布式系统架构6:链路追踪
本文深入探讨了分布式系统中的链路追踪理论,涵盖追踪与跨度的概念、追踪系统的模块划分及数据收集的三种方式。链路追踪旨在解决复杂分布式系统中请求流转路径不清晰的问题,帮助快速定位故障和性能瓶颈。文中介绍了基于日志、服务探针和边车代理的数据收集方法,并简述了OpenTracing、OpenCensus和OpenTelemetry等链路追踪协议的发展历程及其特点。通过理解这些概念,可以更好地掌握开源链路追踪框架的使用。
158 41
下一篇
oss创建bucket