讲讲HBase Master(HMaster)和 RegionServer(HRegionServer)
HBase 是一个分布式的、面向列的 NoSQL 数据库,它的核心架构是典型的主从(Master-Slave)架构。在这个架构中,HMaster 扮演“管理者”的角色,而 HRegionServer 扮演“干活的工人”的角色。此外,Zookeeper 在它们之间充当了极其重要的“协调者”。
下面为你详细拆解这两个核心组件的概念、职责以及它们内部的工作机制。
一、 HMaster(管理者)
HMaster 是 HBase 集群的大脑,但它不负责存储实际的用户数据,也不参与用户的读写请求。它的存在主要是为了管理集群的元数据、监控节点状态以及进行负载均衡。
1. 核心职责
- 处理 DDL 操作(表级管理): 响应客户端对于表的创建(Create)、删除(Drop)、修改(Alter)等结构定义操作。
- Region 分配: 在 HBase 集群启动时,或者有新的表创建时,HMaster 负责将 Region(表的物理分片)分配给各个 HRegionServer。
- 负载均衡(Load Balancing): HMaster 会监控各个 HRegionServer 上的 Region 数量和负载情况。如果发现某个 Server 太忙或太闲,它会在 Server 之间迁移 Region,以保证集群整体性能均衡。
- 故障恢复(Failover): 当某个 HRegionServer 宕机时,Zookeeper 会通知 HMaster。HMaster 会接管该宕机节点上的数据,将它的预写日志(WAL)切分,并把它负责的 Region 重新分配给其他健康的 HRegionServer。
- 清理垃圾(GC): 定期清理废弃的 HFile(底层的物理数据文件)和 WAL 日志。
2. 特点
- 轻量级: 因为客户端读写数据不需要经过 HMaster,所以 HMaster 的负载通常很低。即便 HMaster 短暂宕机,只要表结构不发生变化,客户端依然可以正常读写数据。
- 高可用(HA): 生产环境中通常会部署多个 HMaster(Active-Backup 模式),由 Zookeeper 负责选举。如果主 HMaster 挂了,备用 HMaster 会迅速接管。
二、 HRegionServer(工作节点)
HRegionServer 是 HBase 的主力军,负责实际数据的读写、存储和维护。在部署上,HRegionServer 通常和 HDFS 的 DataNode 部署在同一台物理机上,以实现数据的本地化(Data Locality),减少网络传输。
1. 核心职责
- 处理 DML 操作(数据级操作): 响应客户端的数据插入(Put)、查询(Get/Scan)、删除(Delete)请求。
- 管理 Region: 一个 HRegionServer 会管理多个 Region。它负责维护这些 Region 的生命周期。
- MemStore 刷写(Flush): 将内存中的数据定期写入到底层 HDFS 中,生成 HFile。
- 文件合并(Compaction): 随着数据不断写入,HFile 文件会越来越多。RegionServer 会在后台执行合并操作(Minor/Major Compaction),将小文件合并成大文件,并清理被删除或过期的数据。
- Region 分裂(Split): 当一个 Region 里的数据量增长到超过阈值时,RegionServer 负责将这个 Region 一分为二,从而保证单个 Region 不会过大。
2. 内部核心架构(极其重要)
了解 RegionServer 的内部组件是理解 HBase 读写原理的关键:
- WAL (Write-Ahead Log) 预写日志:
- 由于数据是先写内存的,为了防止服务器断电导致数据丢失,任何写操作都会先记录到 WAL 中。它是存储在 HDFS 上的日志文件。
- BlockCache (读缓存):
- 存在于内存中,用于缓存经常被读取的数据。客户端读数据时,优先查这里。
- Region (数据分片):
- 表的数据被按 RowKey 范围切分成多个 Region。一个 Region 内部包含多个 Store。通常一个列族(Column Family)对应一个 Store。
- MemStore (写缓存):
- 存在于 Store 内部,基于内存。客户端写入的数据会先放到 MemStore 中,并排序。当 MemStore 满了,就会触发 Flush 操作,生成磁盘上的 HFile。
- HFile (物理存储文件):
- HBase 数据在 HDFS 上的实际存储格式。
三、 它们是如何协同工作的?
为了让你更直观地理解,我们来看看日常场景下它们的互动机制:
场景 1:客户端读写数据(HMaster 不参与)
- 客户端先访问 Zookeeper,获取
hbase:meta表(记录了所有 Region 位置信息的系统表)位于哪个 HRegionServer 上。 - 客户端访问该 HRegionServer,读取
meta表,找到自己想要读写的 RowKey 属于哪个 Region,以及这个 Region 在哪台 HRegionServer 上。 - 客户端直接连接目标 HRegionServer 进行读写(Put/Get)。
(注意:整个过程完全没有 HMaster 的事,这避免了单点性能瓶颈)
场景 2:某个 HRegionServer 突然宕机
- 该 HRegionServer 停止向 Zookeeper 发送心跳。
- Zookeeper 发现后,删除了该节点的临时目录,并通知 HMaster。
- HMaster 接到通知,知道某个兄弟倒下了。
- HMaster 把该节点留下的 WAL 日志进行拆分(Split Log),分配给其他存活的 HRegionServer 去回放。
- HMaster 将倒下节点原本负责的 Regions 重新分配给其他 HRegionServer,恢复服务。
四、 总结与通俗比喻
如果你把 HBase 想象成一家大型快递公司:
- Zookeeper 是公司的调度中心/GPS监控系统,实时监控谁活着、谁死了,并保存最重要的联络名册。
- HMaster 是公司的总经理。他不亲自送快递(不处理读写),他只负责规划路线(分配 Region)、买卖货车(建表/删表)、考核员工(负载均衡)、以及处理车祸善后(故障恢复)。
- HRegionServer 是快递员/货车。他们负责装货卸货(处理 Put/Get),把包裹分类放进不同的货厢(Region/MemStore),并在货厢满了之后打包放到仓库(Flush 到 HFile)。
- 客户端 是寄件人/收件人。寄件人要寄包裹时,直接通过调度中心(ZK)找到快递员(RegionServer)交接,完全不需要给总经理(HMaster)打电话。
右滑查看面试常问