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'}

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库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
目录
相关文章
|
6天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
20天前
|
人工智能 前端开发 编译器
【AI系统】LLVM 架构设计和原理
本文介绍了LLVM的诞生背景及其与GCC的区别,重点阐述了LLVM的架构特点,包括其组件独立性、中间表示(IR)的优势及整体架构。通过Clang+LLVM的实际编译案例,展示了从C代码到可执行文件的全过程,突显了LLVM在编译器领域的创新与优势。
40 3
|
23天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
56 1
|
2天前
|
设计模式 监控 Java
分布式系统架构4:容错设计模式
这是小卷对分布式系统架构学习的第4篇文章,重点介绍了三种常见的容错设计模式:断路器模式、舱壁隔离模式和重试模式。断路器模式防止服务故障蔓延,舱壁隔离模式通过资源隔离避免全局影响,重试模式提升短期故障下的调用成功率。文章还对比了这些模式的优缺点及适用场景,并解释了服务熔断与服务降级的区别。尽管技术文章阅读量不高,但小卷坚持每日更新以促进个人成长。
22 11
|
4天前
|
消息中间件 存储 安全
分布式系统架构3:服务容错
分布式系统因其复杂性,故障几乎是必然的。那么如何让系统在不可避免的故障中依然保持稳定?本文详细介绍了分布式架构中7种核心的服务容错策略,包括故障转移、快速失败、安全失败等,以及它们在实际业务场景中的应用。无论是支付场景的快速失败,还是日志采集的安全失败,每种策略都有自己的适用领域和优缺点。此外,文章还为技术面试提供了解题思路,助你在关键时刻脱颖而出。掌握这些策略,不仅能提升系统健壮性,还能让你的技术栈更上一层楼!快来深入学习,走向架构师之路吧!
33 11
|
6天前
|
自然语言处理 负载均衡 Kubernetes
分布式系统架构2:服务发现
服务发现是分布式系统中服务实例动态注册和发现机制,确保服务间通信。主要由注册中心和服务消费者组成,支持客户端和服务端两种发现模式。注册中心需具备高可用性,常用框架有Eureka、Zookeeper、Consul等。服务注册方式包括主动注册和被动注册,核心流程涵盖服务注册、心跳检测、服务发现、服务调用和注销。
38 12
|
14天前
|
存储 算法 安全
分布式系统架构1:共识算法Paxos
本文介绍了分布式系统中实现数据一致性的重要算法——Paxos及其改进版Multi Paxos。Paxos算法由Leslie Lamport提出,旨在解决分布式环境下的共识问题,通过提案节点、决策节点和记录节点的协作,确保数据在多台机器间的一致性和可用性。Multi Paxos通过引入主节点选举机制,优化了基本Paxos的效率,减少了网络通信次数,提高了系统的性能和可靠性。文中还简要讨论了数据复制的安全性和一致性保障措施。
31 1
|
18天前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
48 4
|
22天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
39 8
|
19天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
下一篇
DataWorks