Region与RegionServer #
一、Region概述 #
Region是HBase数据分片的基本单位,每个Region存储表中一段连续的RowKey范围。
1.1 Region结构 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ Region 结构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Table: user │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Region 1 Region 2 Region 3 │ │
│ │ [ , user001) [user001, user002) [user002, ) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ Store │ │ Store │ │ Store │ │ │
│ │ │ (info) │ │ (info) │ │ (info) │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ Store │ │ Store │ │ Store │ │ │
│ │ │ (history) │ │ (history) │ │ (history) │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ RowKey范围: │
│ - Region 1: RowKey < user001 │
│ - Region 2: user001 <= RowKey < user002 │
│ - Region 3: RowKey >= user002 │
│ │
└─────────────────────────────────────────────────────────────────────┘
1.2 Region组成 #
text
Region组成
├── Region ID
│ └── 唯一标识,格式:表名+起始Key+时间戳+编码
│
├── Start Key
│ └── Region起始RowKey(包含)
│
├── End Key
│ └── Region结束RowKey(不包含)
│
└── Stores
└── 每个列族对应一个Store
1.3 Region元数据 #
text
hbase:meta 表结构
┌─────────────────────────────────────────────────────────────────────┐
│ │
│ RowKey: 表名,起始Key,时间戳 │
│ │
│ 列族: info │
│ ├── regioninfo │
│ │ └── Region信息(编码、起始Key、结束Key) │
│ │ │
│ └── server │
│ └── RegionServer地址 │
│ │
│ 示例: │
│ RowKey: user,,1704067200000.abc123 │
│ info:regioninfo = {ENCODED => abc123, START => '', END => 'u'} │
│ info:server = regionserver1:16020 │
│ │
└─────────────────────────────────────────────────────────────────────┘
二、RegionServer详解 #
2.1 RegionServer架构 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ RegionServer 架构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ RegionServer │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ RPC Server │ │ │
│ │ │ - 处理客户端请求 │ │ │
│ │ │ - Handler线程池 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ Region 1 │ │ │
│ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │
│ │ │ │ Store │ │ Store │ │ │ │
│ │ │ │ (info) │ │ (data) │ │ │ │
│ │ │ └─────────────┘ └─────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ Region 2 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ ... │ │
│ │ │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ BlockCache │ │ MemStore │ │ │
│ │ │ (读缓存) │ │ (写缓存) │ │ │
│ │ └──────────────────┘ └──────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ WAL │ │ Compaction │ │ │
│ │ │ (日志) │ │ (合并) │ │ │
│ │ └──────────────────┘ └──────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
2.2 RegionServer职责 #
text
RegionServer核心职责
├── 请求处理
│ ├── 处理读写请求
│ ├── 执行Scan操作
│ └── 执行过滤器
│
├── Region管理
│ ├── 管理多个Region
│ ├── Region切分
│ └── Region合并
│
├── 数据管理
│ ├── MemStore Flush
│ ├── Compaction
│ └── WAL管理
│
└── 心跳维护
└── 向ZooKeeper发送心跳
2.3 RegionServer配置 #
xml
<!-- hbase-site.xml -->
<!-- RPC处理线程数 -->
<property>
<name>hbase.regionserver.handler.count</name>
<value>30</value>
</property>
<!-- 最大Region数 -->
<property>
<name>hbase.regionserver.maxlogs</name>
<value>32</value>
</property>
<!-- RegionServer内存配置 -->
<property>
<name>hbase.regionserver.global.memstore.size</name>
<value>0.4</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.4</value>
</property>
三、Region切分 #
3.1 切分触发条件 #
text
Region切分触发条件
├── 自动切分
│ ├── Region大小达到阈值(默认10GB)
│ └── StoreFile数量过多
│
├── 手动切分
│ └── split命令
│
└── 预分区
└── 建表时预定义分区
3.2 切分流程 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ Region 切分流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 切分准备 │
│ └── 计算切分点(中间RowKey) │
│ │
│ 2. 创建子Region │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Parent Region │ │
│ │ [startKey, endKey) │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌────────────────┐ ┌────────────────┐ │ │
│ │ │ Child Region A │ │ Child Region B │ │ │
│ │ │ [startKey, splitKey) │ [splitKey, endKey) │ │ │
│ │ └────────────────┘ └────────────────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ 3. 数据迁移 │
│ └── 子Region继承父Region的HFile引用 │
│ │
│ 4. 更新元数据 │
│ └── 更新hbase:meta表 │
│ │
│ 5. 父Region下线 │
│ └── 父Region标记为离线 │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.3 切分配置 #
xml
<!-- hbase-site.xml -->
<!-- Region切分大小阈值 -->
<property>
<name>hbase.hregion.max.filesize</name>
<value>10737418240</value> <!-- 10GB -->
</property>
<!-- 禁用自动切分 -->
<property>
<name>hbase.hregion.max.filesize</name>
<value>9223372036854775807</value> <!-- Long.MAX_VALUE -->
</property>
3.4 手动切分 #
ruby
# 切分指定Region
split 'user', 'user005'
# 切分指定表
split 'user'
# 通过Region名切分
split 'user,,1704067200000.abc123'
3.5 预分区 #
ruby
# 创建表时预分区
create 'user', 'info', SPLITS => ['10', '20', '30', '40']
# 使用分区文件
create 'user', 'info', SPLITS_FILE => '/path/to/splits.txt'
# 使用HexStringSplit算法
create 'user', 'info', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
四、Region合并 #
4.1 合并场景 #
text
Region合并场景
├── 相邻Region合并
│ └── 两个相邻的小Region合并
│
├── 手动合并
│ └── merge_region命令
│
└── 自动合并
└── 通过配置启用(不推荐)
4.2 合并操作 #
ruby
# 合并两个相邻Region
merge_region 'region1_encoded', 'region2_encoded'
# 强制合并(非相邻Region)
merge_region 'region1_encoded', 'region2_encoded', true
4.3 Region合并流程 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ Region 合并流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 验证Region │
│ └── 检查是否相邻、是否可合并 │
│ │
│ 2. 创建新Region │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Region A [a, b) Region B [b, c) │ │
│ │ │ │ │ │
│ │ └────────┬───────┘ │ │
│ │ ▼ │ │
│ │ New Region [a, c) │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ 3. 数据迁移 │
│ └── 合并两个Region的StoreFile │
│ │
│ 4. 更新元数据 │
│ └── 更新hbase:meta表 │
│ │
│ 5. 旧Region下线 │
│ └── 原Region标记为离线 │
│ │
└─────────────────────────────────────────────────────────────────────┘
五、Region分配 #
5.1 分配流程 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ Region 分配流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. RegionServer上线 │
│ └── 向ZooKeeper注册 │
│ │
│ 2. Master检测 │
│ └── 发现新RegionServer │
│ │
│ 3. Region分配 │
│ ├── 计算Region分配计划 │
│ └── 发送分配请求 │
│ │
│ 4. RegionServer处理 │
│ ├── 接收Region │
│ ├── 初始化Region │
│ └── 恢复WAL(如有) │
│ │
│ 5. 更新元数据 │
│ └── 更新hbase:meta表 │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.2 分配策略 #
text
Region分配策略
├── 随机分配
│ └── 默认策略,随机选择RegionServer
│
├── 负载均衡
│ └── 选择Region数最少的RegionServer
│
├── 机架感知
│ └── 考虑机架位置,优先本地性
│
└── 热点避免
└── 避免热点Region集中
六、负载均衡 #
6.1 负载均衡器 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ 负载均衡器 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 默认负载均衡器:StochasticLoadBalancer │
│ │
│ 均衡策略: │
│ ├── Region数量均衡 │
│ ├── 存储大小均衡 │
│ ├── 读写请求均衡 │
│ └── 数据本地性优化 │
│ │
│ 执行周期: │
│ └── 默认5分钟检查一次 │
│ │
└─────────────────────────────────────────────────────────────────────┘
6.2 负载均衡配置 #
xml
<!-- hbase-site.xml -->
<!-- 负载均衡器类 -->
<property>
<name>hbase.balancer.period</name>
<value>300000</value> <!-- 5分钟 -->
</property>
<!-- 禁用负载均衡 -->
<property>
<name>hbase.balancer.period</name>
<value>-1</value>
</property>
6.3 手动负载均衡 #
ruby
# 查看Region分布
status 'detailed'
# 移动Region
move 'region_encoded', 'server_name'
# 手动触发负载均衡
balancer
# 检查负载均衡状态
balancer_enabled
七、Region定位 #
7.1 Region定位流程 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ Region 定位流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Client读取流程: │
│ │
│ 1. 连接ZooKeeper │
│ └── 获取meta表位置 │
│ │
│ 2. 查询meta表 │
│ └── 根据RowKey定位Region │
│ │
│ 3. 缓存Region位置 │
│ └── 缓存到Client本地 │
│ │
│ 4. 直接访问RegionServer │
│ └── 发送读写请求 │
│ │
│ 定位链路: │
│ ZooKeeper → meta表 → RegionServer │
│ │
└─────────────────────────────────────────────────────────────────────┘
7.2 元数据缓存 #
text
Client元数据缓存
├── 缓存内容
│ ├── Region位置信息
│ └── RegionServer地址
│
├── 缓存更新
│ ├── Region移动时失效
│ └── 访问失败时刷新
│
└── 缓存配置
└── hbase.client.scanner.caching
八、RegionServer故障处理 #
8.1 故障检测 #
text
RegionServer故障检测
├── ZooKeeper会话超时
│ └── 默认180秒
│
├── 心跳检测
│ └── RegionServer定期发送心跳
│
└── Master监控
└── Master定期检查RegionServer状态
8.2 故障恢复流程 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ RegionServer 故障恢复 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 故障检测 │
│ └── ZooKeeper检测到RegionServer下线 │
│ │
│ 2. Master处理 │
│ ├── 标记Region为离线 │
│ └── 分配Region到其他RegionServer │
│ │
│ 3. WAL切分 │
│ └── 将WAL按Region切分 │
│ │
│ 4. WAL重放 │
│ └── 新RegionServer重放WAL恢复数据 │
│ │
│ 5. Region上线 │
│ └── Region恢复完成,开始服务 │
│ │
│ 恢复时间: │
│ - 取决于WAL大小 │
│ - 通常几分钟到十几分钟 │
│ │
└─────────────────────────────────────────────────────────────────────┘
8.3 故障恢复配置 #
xml
<!-- hbase-site.xml -->
<!-- ZooKeeper会话超时 -->
<property>
<name>zookeeper.session.timeout</name>
<value>180000</value> <!-- 3分钟 -->
</property>
<!-- WAL切分线程数 -->
<property>
<name>hbase.regionserver.wal.max.splitters</name>
<value>2</value>
</property>
九、Region最佳实践 #
9.1 Region大小建议 #
text
Region大小建议
├── 推荐大小:10-20GB
│
├── 过小问题
│ ├── Region数量过多
│ ├── Master压力大
│ └── 文件句柄过多
│
└── 过大问题
├── Compaction时间长
├── 切分时间长
└── 故障恢复慢
9.2 预分区建议 #
text
预分区建议
├── 建表时预分区
│ └── 避免初始Region切分
│
├── 根据数据量规划
│ └── 预估数据量,合理分区
│
└── RowKey设计配合
└── 确保数据均匀分布
9.3 Region数量建议 #
text
Region数量建议
├── 每个RegionServer
│ └── 推荐100-200个Region
│
├── 总Region数
│ └── Region数 = RegionServer数 × 每RS Region数
│
└── 文件句柄
└── 确保系统文件句柄足够
十、总结 #
本节介绍了Region与RegionServer:
| 概念 | 要点 |
|---|---|
| Region | 数据分片单位,按RowKey范围划分 |
| RegionServer | 工作节点,管理多个Region |
| Region切分 | 自动/手动切分,预分区避免热点 |
| Region合并 | 合并小Region,减少Region数量 |
| 负载均衡 | 自动/手动均衡Region分布 |
| 故障恢复 | WAL重放恢复数据 |
下一步,让我们学习HBase的读写流程!
最后更新:2026-03-27