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