HBase架构深度解析:HMaster、RegionServer与ZooKeeper三驾马车

HBase架构深度解析:HMaster、RegionServer与ZooKeeper三驾马车

HBase架构深度解析:HMaster、RegionServer与ZooKeeper三驾马车

🌺The Begin🌺点点关注,收藏不迷路🌺

关键词:HBase架构、HMaster、RegionServer、ZooKeeper、Region分裂、数据存储、分布式数据库

HBase作为一款分布式、可扩展、面向列的NoSQL数据库,其架构设计充分体现了分布式系统的核心思想。理解HBase的架构,是掌握其工作原理、进行性能调优和问题排查的基础。

今天,我们将深入剖析HBase的三大核心组件——HMasterRegionServerZooKeeper,以及它们如何协同工作,构建出一个高可用、高扩展的分布式存储系统。


一、HBase架构全景图

HDFS底层存储

RegionServer集群

HMaster集群

ZooKeeper集群

客户端

1. 请求路由2. 返回RegionServer地址3. 直接读写数据3. 直接读写数据

监控管理

监控管理

监控管理

数据持久化

数据持久化

数据持久化

选举/协调

选举/协调

监控

监控

监控

RS3内部

Region3-1

Region3-2

Region3-3

RS2内部

Region2-1

Region2-2

RS1内部

Region1-1

Region1-2

Region1-3

Client

ZK Server1

ZK Server2

ZK Server3

Active HMaster

Standby HMaster

RegionServer1

RegionServer2

RegionServer3

DataNode1

DataNode2

DataNode3


二、三大核心组件职责

2.1 组件职责总览

组件主要职责类比
HMaster管理元数据、DDL操作、负载均衡、故障恢复公司的总经理
RegionServer处理数据读写、管理Region一线业务经理
ZooKeeper集群协调、状态监控、元数据入口公司的秘书处

2.2 HMaster:集群的"大脑"

HMaster是HBase集群的主节点,负责管理整个集群的元数据和状态。

root(HMaster核心职责)

DDL操作

创建表

删除表

修改表结构

Region管理

分配Region到RegionServer

监控Region状态

负载均衡

故障恢复

检测RegionServer宕机

重新分配Region

元数据管理

维护表结构信息

记录Region位置

HMaster的高可用

// HMaster的高可用架构// 集群中可以有多个HMaster,但只有一个Active,其他为Standby// Active HMaster的职责:- 处理所有管理操作 - 分配Region- 负载均衡 // Standby HMaster的职责:- 同步Active的状态 - 监控Active的健康状态 -Active宕机时接管服务 // 切换过程由ZooKeeper协调

2.3 RegionServer:数据的"执行者"

RegionServer负责实际的数据读写操作,是HBase中最繁忙的组件。

RegionServer内部结构

Region2

Region1

Region
RowKey范围: 101-200

RegionServer

Region
RowKey范围: 001-100

MemStore
内存写缓存

StoreFile
HFile

WAL
预写日志

MemStore

StoreFile

WAL

RegionServer的核心组件

组件作用特点
Region表的分片,包含一段RowKey范围的数据数据分布的基本单位
MemStore内存写缓存先写内存,后刷写到磁盘
StoreFile/HFile磁盘存储文件最终数据持久化格式
WAL预写日志故障恢复的关键

2.4 ZooKeeper:集群的"协调者"

ZooKeeper在HBase中扮演着至关重要的协调角色。

root(ZooKeeper核心职责)

集群状态维护

记录RegionServer存活状态

监控服务器心跳

元数据入口

存储hbase:meta表位置

客户端通过ZK找到meta表

HMaster选举

协调Active/Standby切换

保证唯一Active

分布式协调

维护集群配置

同步集群状态

ZooKeeper中存储的关键信息

# ZooKeeper中HBase的znode结构 /hbase /meta-region-server # meta表所在的RegionServer /master # Active HMaster地址 /backup-masters # Standby HMaster列表 /region-in-transition # 正在迁移的Region /rs # 所有RegionServer列表 /rs1 /rs2 /rs3 

三、HBase的数据存储单元:Region

3.1 Region是什么?

Region是HBase表数据分布的基本单位。一个HBase表根据RowKey的范围被分成多个Region,每个Region包含这个区域内所有数据。

HBase表

Region划分

Region1
RowKey: 001-100

User表
RowKey: 用户ID

Region2
RowKey: 101-200

Region3
RowKey: 201-300

Region4
RowKey: 301-400

3.2 Region的内部结构

// 每个Region包含的内容Region{// 1. RowKey范围 startKey:"001" endKey:"100"// 2. 包含的列族Map<ColumnFamily,Store> stores;// 3. 每个Store对应一个列族Store{MemStore memStore;// 内存缓存List<StoreFile> storeFiles;// 磁盘文件}// 4. WAL预写日志WAL wal;}

3.3 Region的分配与迁移

Region分配过程

1. 决定Region数量2. 分配Region到RS3. 更新

客户端创建表

HMaster

创建Region

分配

RegionServer1
分配Region A,B

RegionServer2
分配Region C,D

RegionServer3
分配Region E,F

ZooKeeper记录位置


四、HBase的读写流程

4.1 读数据流程

HDFSRegionServerZooKeeper客户端HDFSRegionServerZooKeeper客户端1. 获取meta表位置2. 返回meta表所在RS3. 查询meta表获取目标Region位置4. 返回目标Region所在RS5. 直接读取数据6. 先从MemStore读7. 再从StoreFile读8. 返回数据9. 返回最终结果

读流程要点

  1. 客户端先从ZooKeeper获取hbase:meta表的位置
  2. 从meta表查询目标RowKey所在的Region和RegionServer
  3. 直接连接目标RegionServer读取数据
  4. 读数据时,先查MemStore(内存),再查StoreFile(磁盘)

4.2 写数据流程

HDFSRegionServerZooKeeper客户端HDFSRegionServerZooKeeper客户端异步刷盘1. 获取meta表位置2. 返回meta表所在RS3. 查询meta表获取目标Region位置4. 返回目标Region所在RS5. 直接写入数据6. 写入WAL(顺序写)7. 写入MemStore8. 返回写入成功9. MemStore达到阈值刷写成StoreFile

写流程要点

  1. 先写WAL(保证数据不丢)
  2. 再写MemStore(内存)
  3. 返回客户端成功
  4. 异步将MemStore刷写到HDFS成为StoreFile

五、HBase的关键机制

5.1 Region分裂

随着数据增长,Region会不断变大,当达到阈值时触发分裂:

分裂后

分裂前

达到分裂阈值

大Region
RowKey: 000-999
100GB

触发分裂

Region1
RowKey: 000-499
50GB

Region2
RowKey: 500-999
50GB

可能分配到不同RegionServer

实现负载均衡

分裂触发条件

  • 单个Region的StoreFile大小超过hbase.hregion.max.filesize(默认10GB)
  • 由RegionServer自行决定,不需要HMaster参与

5.2 负载均衡

// HMaster定期执行负载均衡publicclassLoadBalancer{publicvoidbalance(){// 1. 获取所有RegionServer的负载Map<RegionServer,Integer> loads =getRegionServerLoads();// 2. 计算平均负载double avgLoad =calculateAverage(loads);// 3. 找出过载和低载的RegionServerList<RegionServer> overloaded =findOverloaded(loads, avgLoad);List<RegionServer> underloaded =findUnderloaded(loads, avgLoad);// 4. 将过载RS的Region迁移到低载RSfor(RegionServer from : overloaded){for(RegionServerto: underloaded){moveRegion(from,to);}}}}

5.3 故障恢复

当RegionServer宕机时:

数据恢复

Region重新分配

日志分割

故障检测

1. 检测到RS1心跳超时2. 通知其他RS2. 通知其他RS3. 分割RS1的WAL3. 分割RS1的WAL4. 获取Region列表5. 重新分配5. 重新分配6. 从WAL恢复数据6. 从WAL恢复数据

ZooKeeper

HMaster

RS2

RS3

分割WAL

RS1管理的Region

恢复MemStore


六、架构设计亮点

6.1 无单点故障设计

组件高可用方案
HMasterActive-Standby模式,ZooKeeper协调切换
RegionServer数据存储在HDFS,故障时Region重新分配
ZooKeeper集群模式,多数节点存活即可服务
HDFS数据多副本,NameNode HA

6.2 读写分离设计

读路径

写路径

写请求

MemStore
内存

HFile
磁盘

读请求

BlockCache
读缓存

6.3 数据本地性

// HBase充分利用数据本地性// 当Region在某个RegionServer上时,它会优先读取本地的HDFS数据// 但如果Region迁移了,新的RegionServer可能需要远程读数据// 通过Compaction机制,可以逐步将数据转为本地

七、面试高频问题

Q1:HBase有哪些核心组件?各有什么作用?

:三大核心组件:

  • HMaster:管理元数据、DDL操作、负载均衡、故障恢复
  • RegionServer:处理数据读写、管理Region
  • ZooKeeper:集群协调、状态监控、元数据入口

Q2:RegionServer宕机后会发生什么?

  1. ZooKeeper检测到心跳超时
  2. HMaster启动故障恢复流程
  3. 将宕机RS的WAL进行分割
  4. 将其管理的Region重新分配到其他RS
  5. 其他RS从WAL恢复数据

Q3:HBase的读写流程是怎样的?

  • 读流程:ZK → meta表 → 目标RS → 先读MemStore → 再读StoreFile
  • 写流程:ZK → meta表 → 目标RS → 写WAL → 写MemStore → 返回成功

Q4:HMaster的高可用是如何实现的?

:通过ZooKeeper协调Active-Standby模式:

  • 多个HMaster实例,只有一个Active
  • ZK记录Active的地址
  • Active宕机时,Standby通过ZK选举成为新的Active

Q5:Region是什么?如何分布?

:Region是HBase表数据分布的基本单位,根据RowKey范围划分。每个Region包含一段连续RowKey的数据,分布在不同的RegionServer上,实现负载均衡和水平扩展。


八、总结

8.1 架构核心要点

root(HBase架构精髓)

HMaster

元数据管理

负载均衡

故障恢复

RegionServer

数据读写

Region管理

MemStore/StoreFile

ZooKeeper

集群协调

状态监控

元数据入口

8.2 数据流向

写:Client → RegionServer → WAL → MemStore → HFile
读:Client → RegionServer → MemStore/BlockCache → HFile

8.3 一句话总结

HBase通过HMaster管控、RegionServer执行、ZooKeeper协调的三驾马车,构建了一个高可用、可扩展的分布式KV数据库。

掌握了HBase的架构,你就掌握了理解其所有行为的基础,无论是性能调优、问题排查还是二次开发,都能得心应手!


思考题:HBase 2.0中引入了Procedure V2框架,它对HMaster的故障恢复有什么改进?欢迎在评论区讨论!

在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺

Read more

微信小程序案例 - 自定义 tabBar

一、前言:为什么需要自定义 tabBar? 微信小程序原生 tabBar 虽然简单易用,但存在明显限制: * ❌ 不支持中间“+”号等凸起按钮 * ❌ 图标和文字样式无法高度自定义(如选中态动画) * ❌ 无法动态隐藏/显示 tabBar * ❌ 不能嵌入徽标(Badge)、红点等业务元素 解决方案:使用自定义 tabBar! 本文将带你从零实现一个支持中间凸起按钮、带动画、可扩展的自定义 tabBar,并封装为通用组件。 二、最终效果预览 ✅ 底部 5 个 tab(中间为“+”发布按钮) ✅ 点击 tab 平滑切换页面 ✅ 中间按钮跳转独立功能页(如发布内容) ✅ 支持徽标、选中高亮、图标切换 三、实现原理 由于小程序页面是全屏渲染,我们无法像 H5 那样用 fixed 布局直接覆盖原生

By Ne0inhk
【大作业-46】基于YOLO12的无人机(航拍)视角的目标检测系统

【大作业-46】基于YOLO12的无人机(航拍)视角的目标检测系统

基于YOLO12的无人机(航拍)视角的目标检测系统 🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳 【大作业-46】基于yolo12的航拍(无人机)视角目标检测与追踪系统 🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳🥳 各位小伙伴大家好,今天我们为大家带来的是基于无人机视角下的目标检测,主要是对常规的行人、车辆这些目标进行检测,并且接着这个机会我们对yolo12的新模块进行一下说明,和之前的内容一样,我们的教程中包含了标注好的数据集、训练好的yolov5、yolov8、yolo11以及yolo12的模型,还有一个配套的图形化界面。本次的数据集包含的类别如下: 0: pedestrian 行人 1: people 人 2: bicycle 自行车 3: car 汽车 4: van 货车 5: truck 卡车 6: tricycle 三轮车 7: awning-tricycle 遮阳篷三轮车 8: bus 公交车 9: motor 摩托车 以下是部分数据示例。

By Ne0inhk
Java 大视界 -- Java 大数据在智能家居环境监测与智能调节中的应用拓展(423)

Java 大视界 -- Java 大数据在智能家居环境监测与智能调节中的应用拓展(423)

Java 大视界 -- Java 大数据在智能家居环境监测与智能调节中的应用拓展(423) * 引言: * 快速上手指南:3 步跑通智能家居 Demo(新手友好) * Step 1:环境准备(必装软件清单) * Step 2:代码运行(按顺序执行) * Step 3:效果验证(用 Postman 模拟数据) * 正文: * 一、智能家居环境监测与调节的核心痛点 * 1.1 设备数据的 “异构化” 困境 * 1.1.1 多源数据的 “协议壁垒” * 1.1.2 数据规模的 “爆发式增长” * 1.2 实时调节的 “滞后性” 痛点 * 1.

By Ne0inhk
【征文计划】AR健身教练:形随心动 - 基于Rokid CXR-M SDK的实践落地

【征文计划】AR健身教练:形随心动 - 基于Rokid CXR-M SDK的实践落地

一、项目背景与创意起源 在当今快节奏的都市生活中,健身已成为许多人保持健康的重要方式。然而,居家健身面临一个普遍痛点:缺乏专业指导,容易因动作不规范导致运动损伤,同时低头看手机或平板的体验也大大降低了健身的沉浸感和效率。 根据《2024年中国健身行业白皮书》显示,超过65%的居家健身用户表示"缺乏专业指导"是他们放弃健身的主要原因。而Rokid Glasses作为一款轻量级AR眼镜,其独特的"抬头即见"交互方式,为解决这一问题提供了绝佳的硬件基础。 "形随心动"创意的诞生源于一个简单但关键的观察:如果能将专业教练"投射"到用户视野中,实时指导动作,同时提供直观的数据反馈,那么居家健身体验将发生质的飞跃。通过Rokid CXR-M SDK的AI场景、自定义页面和提词器功能,我们能够实现这一愿景。 二、Rokid CXR-M SDK 相关 1. Rokid

By Ne0inhk