HBase—RegionServer详解

1.RegionServer

  • 概述
    • 一个RegionServer由一个(或多个,默认只有一个)HLog,一个BlockCache以及多个Region组成:

      • HLog保证数据写入的高可靠性
      • Region是HBase数据表中的一个数据分片,也是负载均衡的最小单位
      • BlockCache将数据块缓存在内存提升数据读取性能

                 

2.HLog

  • 概述
    • HLog是为了保证数据的高可靠性,所有数据的增删改操作都会先追加到HLog中再写MemStore
    • HLog是整个RegionServer中的所有Region共享的
    • HLog一般不会读取,只有在宕机恢复和主从复制的时候需要读取HLog
  • HLog文件结构

          

          HLog中,日志单元WALEntry表示一次行级更新的最小追加单元,它由HLogKey和WALEdit两部分组成

                    HLogKey:由table name,region name以及sequenceid等字段构成

                    WALEdit:表示一个事务中的更新集合,HBase将一个行级事务写入操作表示为一条记录

  • HLog生命周期
    • 构建:每次发送增删改操作都会先将记录追加到HLog
    • 回滚:后台线程默认每小时滚动一次
    • 失效:当MemStore的数据落盘那么对于的Hlog记录就会失效,一个HLog文件中的最后一条记录失效后该HLog文件就会被移除到oldWALs目录
    • 删除:后台线程默认每秒检查一次,如果oldWALs目录下的HLog文件已经存放了10分钟且没有被其他服务读取时则删除HLog文件
  • HLog持久化等级

    • SKIP_WAL:只写缓存,不写HLog日志,可以极大的提升性能,但有数据丢失的风险

    • ASYNC_WAL:异步将数据写入HLog日志

    • STNC_WAL:同步将数据写入HLog日志,但只是写入文件系统,并没有真正落盘

    • FSYNC_WAL:同步将数据写入日志文件并强制落盘,性能差但数据安全性高

    • USER_DEFAULT:默认的持久化等级

3.BlockCache

  • 概述
    • 为了提升读性能,将热点数据缓存在BlockCache
    • 一个RegionServer中的所有Region共享BlockCache
    • BlockCache缓存的是一系列的Block块,一个Block默认为64K,由物理上相邻的多个KV数据组成
  • BlockCache的3种实现
    • LRUBlockCache
      • 默认的BlockCache实现机制,本质是一个ConcurrentHashMap,使用LRU算法淘汰策略
      • 使用JVM管理内存,简单有效,但CMS回收器垃圾回收会带来大量的内存碎片
    • SlabBlockCache
      • 使用Java NIO DirectByteBuffer技术实现了对外内存存储,不再由JVM管理数据内存
      • 默认情况下系统在初始化时分配两个缓存区,一个存储小于等于64K的Block,一个存储小于等于128K的Block,因此导致其他大小的Block无法存储,因此实际实现中将SlabCache和LRUBlockCache搭配使用,也称DoubleBlockCache
      • 固定大小的Block设置导致内存利用率低下,且配合LRUBlockCache依然导致内存碎片化, 不建议使用
    • BucketCache
      • Bucket的size是可以动态调整的,其他空闲size的Bucket可以转换为紧缺size的Bucket,但至少要为每个size保留一个Bucket
      • HBase启动后再内存中申请大量的Bucket,每个Bucket默认大小2M,每个Bucket有一个baseoffset变量和size标签,offset代表Block在物理中存放的起始地址,size标签代表这个Bucket中可以存放的Block大小
      • 3种工作模式:heap(从JVM的heap区分配内存),offheap(从操作系统直接分配内存),file(使用SSD等作为存储介质)

                      

4.MemStore

  • 概述
    • MemStore采用了JDK实现的跳跃表结构ConcurrentSkipListMap,ConcurrentSkipListMap底层采用CAS原子性操作,是线程安全的
  • 内存管理
    • 内存碎片化
      • 一个RegionServer中包含多个MemStore,这些MemStore是共享内存的,对JVM而言,所有的MemStore都是混合在一起写入heap的,内存会逐渐被碎片化
    • MSLAB内存管理
      • MemStore的内存管理借鉴了线程本地分配缓存(TLAB)的内存管理方式,通过顺序化分配内存,内存数据分块等也行减少内存碎片来改善Full GC
      • 每个MemStore实例化一个MemStoreLAB对象,根据需要不断的申请大小为2M的Chunk数组,其管理每个MemStore在heap内存是连续写的,即清空MemStore后内存是连续的
      • 为了对MSLAB优化,使用了Chunk Pool来加大对Chunk数组的复用
  • MemStore的触发机制
    • MemStore级别限制:当Region中任意一个MemStore的大小达到阈值(默认128M)触发flush

    • Region级别:当Region中所有MemStore的大小到了上限

    • 当RegionServer中的MemStore大小总和超过低水位阈值 ,RegionServer开始强制执行flush,从最大的Region开始flush

    • 当RegionServer中的HLog数量达到上限,系统选取最早的HLog对应的一个或多个Region进行flush

    • 定期flush:默认周期1小时,确保MemStore不会长时间未持久化

    • 手动flush:用户通过shell命令flush一个表 或者一个Region

5.HFile

  • MemStore每次落盘就会形成一个HFile文件,存储在HDFS

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值