HBase详细介绍及原理解析!( 四 )


StochasticLoadBalancer 策略:
它对于负载的定义不再是 Region 个数这么简单 , 而是由多种独立负载加权计算的复合值 , 这些独立负载包括:

  • Region 个数,Region 负载,读请求数,写请求数 , Storefile 大小,MemStore 大小,数据本地率,移动代价 。
这些独立负载经过加权计算会得到一个代价值 , 系统使用这个代价值来评估当前 Region 分布是否均衡,越均衡代价值越低 。
  • HBase 通过不断随机挑选迭代来找到一组 Region 迁移计划,使得代价值最小 。
Flush机制MemStore的大小超过某个值的时候 , 会Flush到磁盘,默认为128M 。
MemStore中的数据时间超过1小时,会Flush到磁盘 。
HRegionServer的全局MemStore的大小超过某大小会触发Flush到磁盘,默认是堆大小的40% 。
Compact机制HBase需要在必要的时候将小的Store File合并成相对较大的Store File , 这个过程为Compaction 。
  • 为了防止小文件过多 , 以保证查询效率 。
在HBase中主要存在两种类型的Compaction合并 。
Minor Compaction 小合并:
  • 在将Store中多个HFile合并为一个HFile 。
  • 这个过程中,达到TTL(记录保留时间)会被移除,删除和更新的数据仅仅只是做了标记,并没有物理移除 。
  • 这种合并的触发频率很高 。
Major Compaction 大合并:
  • 合并Store中所有的HFile为一个HFile 。
  • 这个过程有删除标记的数据会被真正移除 , 同时超过单元格maxVersion的版本记录也会被删除 。
  • 合并频率比较低,默认7天执行一次,并且性能消耗非常大 , 建议生产关闭(设置为0),在应用空闲时间手动触发 。
  • 一般可以是手动控制进行合并,防止出现在业务高峰期 。
Region拆分机制Region 中存储的是大量的 Rowkey 数据 , 当 Region 中的数据条数过多的时候,直接影响查询效率 。
  • 当 Region 过大的时候,HBase 会拆分 Region 。
HBase 的 Region Split 策略一共有以下几种 。
ConstantSizeRegionSplitPolicy:
0.94版本前默认切分策略 。
当Region大小大于某个阈值之后就会触发切分,一个Region等分为2个Region 。
  • 在生产线上这种切分策略有相当大的弊端:切分策略对于大表和小表没有明显的区分 。
阈值设置较大对大表比较友好 , 但是小表就有可能不会触发分裂,极端情况下可能就1个 。
如果设置较小则对小表友好,但一个大表就会在整个集群产生大量的Region,这对于集群的管理、资源使用、Failover不好 。
IncreasingToUpperBoundRegionSplitPolicy:
0.94版本~2.0版本默认切分策略 。
总体看和ConstantSizeRegionSplitPolicy思路相同,一个Region大小大于设置阈值就会触发切分 。
  • 但这个阈值并不是一个固定的值 。
  • 而是会在一定条件下不断调整,调整规则和Region所属表在当前RegionServer上的Region个数有关系 。
Region Split的计算公式是:
  • RegionCount^3 * 128M * 2,当Region达到该size的时候进行split 。
例如:
  • 第一次split:1^3 * 256 = 256MB
  • 第二次split:2^3 * 256 = 2048MB
  • 第三次split:3^3 * 256 = 6912MB
  • 第四次split:4^3 * 256 = 16384MB > 10GB,取较小的值10GB
后面每次split的size都是10GB了 。
SteppingSplitPolicy: