HBase 核心架构和增删改查

一、HBase 核心架构

HBase 架构采用 "主从模式",由客户端(Client)、主节点(HMaster)、从节点(RegionServer)、ZooKeeper、HDFS 五大核心组件构成,各组件职责明确且相互协作。

组件 核心职责
Client 1. 与 HMaster 交互完成表的创建 / 删除 / 修改(DDL 操作);2. 与 RegionServer 交互完成数据增删改查(DML 操作);3. 缓存 Region 位置信息,减少与 HMaster 的交互。
HMaster 1. 管理 RegionServer 集群(如 RegionServer 上线 / 下线检测、负载均衡);2. 负责 Region 的分配与拆分(当 Region 数据量超过阈值时拆分);3. 处理表的 DDL 操作(创建表、删除表、修改列族);4. 通常部署多个(1 主 N 备),由 ZooKeeper 选主,保证高可用。
RegionServer 1. 存储并管理 "Region"(HBase 的最小数据存储单元,一个 Region 对应表的一段 RowKey 范围);2. 处理客户端的 DML 请求(增删改查);3. 维护 Region 内的 MemStore(内存缓存)和 HFile(磁盘持久化文件);4. 定期将 MemStore 数据刷写到 HDFS 生成 HFile。
ZooKeeper 1. 存储 HBase 的元数据(如 HMaster 地址、表的 Region 分布信息);2. 实现 HMaster 的选主(主节点故障时自动切换备节点);3. 监控 RegionServer 的存活状态(通过心跳机制)。
HDFS 1. 持久化存储 HBase 的核心数据(HFile、WAL 日志);2. 依托 HDFS 的分布式存储能力,保证 HBase 数据的高可靠(多副本)和高扩展。
关键概念补充:
  • Region:HBase 表按 RowKey 范围拆分的 "数据分片",每个 Region 由 1 个 RegionServer 管理,一个 RegionServer 可管理多个 Region。
  • MemStore:Region 内的内存缓存,客户端写入数据先存 MemStore,满了之后刷写到 HDFS 生成 HFile(顺序写,效率高)。
  • WAL(Write-Ahead Log):写入 MemStore 前先写 WAL 日志,防止 MemStore 数据丢失(如 RegionServer 宕机,可通过 WAL 恢复数据)。
  • HFile:HBase 在 HDFS 上的持久化数据文件,按列族存储,内部数据按 RowKey 有序排列。

二、HBase 增删改查(CRUD)流程

HBase 的 CRUD 操作均由 Client 发起,依赖 RegionServer 完成实际数据处理,核心围绕 "MemStore 缓存 + WAL 保障 + HFile 持久化" 展开。

1. 写入(Create/Insert)流程
  1. 定位 Region:Client 通过 ZooKeeper 获取表的 Region 分布信息,找到待写入 RowKey 对应的 RegionServer。
  2. 写 WAL 日志:Client 将数据发送到目标 RegionServer,RegionServer 先将数据顺序写入 WAL 日志(确保数据不丢失)。
  3. 写 MemStore:WAL 写入成功后,数据被插入到对应 Region 的 MemStore(内存缓存,按 RowKey 有序排列)。
  4. 完成响应:MemStore 写入成功后,RegionServer 向 Client 返回 "写入成功"。
  5. 后台刷写:当 MemStore 大小达到阈值(默认 128MB),RegionServer 异步将 MemStore 数据刷写到 HDFS,生成 HFile(此时数据持久化)。
2. 查询(Read)流程
  1. 定位 Region:Client 通过 ZooKeeper 找到待查询 RowKey 对应的 RegionServer。
  2. 查询 MemStore:RegionServer 先查询目标 Region 的 MemStore,若找到对应 RowKey 数据,直接返回(内存查询快)。
  3. 查询 BlockCache:若 MemStore 未找到,查询 BlockCache(HFile 的内存缓存,缓存热点 HFile 块),命中则返回。
  4. 查询 HFile:若 BlockCache 未命中,从 HDFS 读取对应的 HFile,加载数据到 BlockCache(方便后续查询),并返回数据给 Client。
  5. 合并结果:若查询涉及多个 HFile(如历史版本数据),RegionServer 会合并多文件中的数据,返回最新版本给 Client。
3. 修改(Update)流程

HBase 无 "原地修改",而是通过 "写入新版本数据" 实现更新,本质是特殊的 "写入操作":

  1. 流程与 "写入" 完全一致,Client 写入一条相同 RowKey、相同列族的新数据。
  2. HBase 会为数据自动添加 "时间戳"(版本号),查询时默认返回时间戳最大的最新版本数据。
  3. 旧版本数据不会立即删除,会在后台 "Compaction"(合并 HFile)时清理(按列族配置的版本数保留策略,如保留最近 3 个版本)。
4. 删除(Delete)流程

HBase 无 "物理删除",而是通过 "标记删除"(Tombstone)实现,延迟到 Compaction 时清理:

  1. 写入删除标记:Client 发起删除请求,RegionServer 先写 WAL 日志,再向 MemStore 插入一条 "删除标记"(Tombstone,包含待删除 RowKey / 列族 / 时间戳)。
  2. 查询屏蔽:后续查询时,若遇到 "删除标记",会屏蔽对应版本的数据,不返回给 Client(看起来已删除)。
  3. 物理清理:后台 Compaction 合并 HFile 时,会过滤掉带 "删除标记" 的数据,彻底从 HDFS 中删除(释放存储空间)。

三、核心设计逻辑总结

  1. 写入优化:"先写 WAL 再写 MemStore"+"MemStore 满了刷 HFile",通过顺序写(WAL、HFile)规避磁盘随机写,提升写入效率。
  2. 查询优化:多级缓存(MemStore→BlockCache→HFile),优先从内存获取数据,减少 HDFS 读 IO,提升查询速度。
  3. 高可用保障:HMaster 主备切换(ZooKeeper 选主)+ WAL 日志恢复(RegionServer 宕机数据不丢)+ HDFS 多副本(HFile 高可靠)。

-HBase 中的 Compaction 触发情况

  • MemStore 刷盘后 :当 MemStore 刷写(Flush)生成新的 HFile 后,系统会检查当前 Store 中的 HFile 数量是否超过阈值hbase.hstore.compactionThreshold,其默认值为 3。若超过阈值,则触发 Minor Compaction。
  • 后台线程周期性检查 :后台线程 CompactionChecker 会定期检查是否需要执行 Compaction,检查周期为hbase.server.thread.wakefrequencyhbase.server.compactchecker.interval.multiplier的乘积,其中hbase.server.thread.wakefrequency默认值为 10000 毫秒,即 10 秒,hbase.server.compactchecker.interval.multiplier默认值为 1000,所以默认检查周期约为 2 小时 46 分 40 秒。该线程先检查文件数是否大于配置,一旦大于就会触发 Compaction,如果不满足,会接着检查是否满足 Major Compaction 条件,即当前 store 中 HFile 的最早更新时间早于某个值 mcTime,若满足则触发 Major Compaction。
  • 基于时间的 Major Compaction :默认每 7 天(由参数hbase.hregion.majorcompaction控制,默认值为 604800000 毫秒)尝试触发一次 Major Compaction,实际触发时间会加入抖动(由参数hbase.hregion.majorcompaction.jitter控制,默认值为 0.5),使时间窗口在 3.5 到 10.5 天内随机分布。
  • 手动触发 :可以通过 HBase Shell 或 API 执行compactmajor_compact命令来手动触发 Compaction。通常在业务低峰期手动触发 Major Compaction 以避免自动触发影响业务,或在执行完alter操作后希望立刻生效,以及 HBase 管理员发现硬盘容量不够的情况下手动触发 Major Compaction 来删除大量过期数据。
相关推荐
卡卡酷卡BUG4 小时前
Java 后端面试干货:四大核心模块高频考点深度解析
java·开发语言·面试
Yolo566Q4 小时前
OpenLCA生命周期评估模型构建与分析
java·开发语言·人工智能
lang201509285 小时前
Spring Boot日志配置完全指南
java·spring boot·单元测试
在坚持一下我可没意见5 小时前
HTTP 协议基本格式与 Fiddler 抓包工具实战指南
java·开发语言·网络协议·tcp/ip·http·java-ee·fiddler
蓝-萧5 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
故事不长丨5 小时前
【Java SpringBoot+Vue 实现视频文件上传与存储】
java·javascript·spring boot·vscode·后端·vue·intellij-idea
不修×蝙蝠6 小时前
Java 日志演进:一文读懂主流框架
java·log4j·logback·log4j2·日志·slf4j
robin_suli6 小时前
数据库之多版本控制MVCC
java·数据库
鬼火儿7 小时前
Golang笔记——Interface类型
java·后端