Region 是 HBase 分布式存储和负载均衡的最小单元,一个 Regionserver 服务中有多个 Region,每一个 Region 对应一张表的部分行数据(一张表的数据可能会分成多段存储在不同的 RegionServer 中的不同 Region 上)。
当数据不断插入到达 Region 阈值时,Region 会被水平拆分成俩个 Region 。当某一个 Region Server 挂掉,或 master 触发负载均衡策略时, Region 可能会从一个 Region Server 移动到另一个 Region Server 上
Region Server 拆分 Region 的过程如下
先将 Region 下线,然后拆分
然后将拆分出来的 Region 的信息加入到元信息表 Mete Table 中
最后上线拆分出来的 Region
每一个 Region 会有三个信息标示自己
tableName : 表名称 startRowKey : 从哪个 RowKey 开始 createTime : Region 的创建时间,也是最早的一条数据插入进来的时间。也就是说 Region 是按需创建的
Region 特点
Region 是 HBase 分布式存储和负载均衡的最小单元是 HBase 分布式存储和负载均衡的最小单元,但不是存储的最小单元。
Region 数据过多会导致数量下降,Region 数量太少会影响并行查找速度以及压力不够分散,Region 最好不要低于集群中节点的数量
Region 的拆分过程是不可见的,因为 master 不会参与 HBase HFile
HBase 将数据以 HFile 文件格式保存咋 HDFS 上 HFile 与其他组件
store、memStore、storeFile 、HFile 之间的关系如下
一个 Region 中可能有多个 store ,每一个 store 代表一个列族,一个 store 有一个 memStore ,它是一个内存型的数据结构,保存用户修改的数据。 store 还可能有多个 storeFile ,它是文件系统级别的数据结构。
store 由 Region 管理,用于维护列族数据,Region 中存储的表有一个列族,该 Region 就有几个 store ,HBase 会根据 store 大小去判断是否拆分
Minor Compaction 是选取相邻的 storeFile 合并成一个大的 storeFile
major Compaction 是将 store 中所有的 storeFile 合并成一个大的 storeFile,由于 major Compaction 合并的文件较多,持续的时间较长,整个过程会消耗大量的系统资源,对上层业务会有比较大的影响,因此在生产环境中,一般都会将自动触发的 major Compaction 关掉,改为手动在业务低锋期触发。
HBase Client 请求 Zookeeper 获取 HBase Mete Table(元信息表),从 Mete Table 中获取 Region Server 的地址
根据 Region Server 的地址找到 Region Server 服务
获取 Region Server 服务中各 Region 的元信息(Table Name、startRowKey等)
用户提交 Put、Delete 请求时,HBase Client 先将请求放入本地 buffer 中(autoFlash 默认为 true,也可以配置成关闭,关闭后,一次一提交),直到满足阈值条件(默认2M)后,会通过异步批量提交到 HBase 服务端
服务端
存储数据(Put、Delete)时, HBase Server 的主要流程如下
当数据到达 Region Server 的某一个 Region 后,首先会获取 RowLock(行锁),并创建共享锁。Hbase 通过 RowLock 来保证对一行数据的操作的原子性
当数据到达 Region Server 后,根据 Scan 的内容,HBase 会在 Region Server 的 Region 上构建 Region Scanner
Region Scanner 会根据列族,构建 Store Scanner,负责对 列族的数据检索 (有多少个列族,就会构建多少个 Store Scanner)
每个 Store Scanner 会为当前 Store 中的每个 HFIle 构造一个 Store File Scanner 用于执行实际的文件检索,此外,还会对 Store 中的 Mem Store 构建 Mem Store Scanner 用于检索 Mem Store 中的数据
将 Mem Store Scanner 、Store File Scanner 扫描到的 Key - value 结构的数据封装之后返回给客户端
**HBase ** 读取数据的核心是 3层 Scanner
第一层 : Region Scanner
第二层 : Store Scanner
第三层 : Mem Store Scanner 、Store File Scanner
一个 Region Scanner 由多个(列族个) Store Scanner 组成,一个 Store Scanner,由多个 Store File Scanner 以及一个 Mem Store Scanner 组成