HBase浅析

173 阅读2分钟

简介

HBase是一款分布式的列式存储数据库,适用于需要处理大量数据并且对读写性能有较高要求的场景,具有以下特性:

  • 高可用
  • 高读写性能
  • 强读写一致性
  • 列式存储(核心能力)

架构

image.png

zk

  • 负责元数据的存储,包含HMaster的地址
  • 负责HMaster的高可用,如果故障了重新选新的HMaster

HMaster

  • HMaster负责维护整个集群的数据元信息,提供HRegion的元信息(地址、存储的数据ROWKEY范围,所在的HRegionServer地址),元数据还是存储子啊zk中。
  • 负责HRegionServer的故障转移

HRegionServer

  • 负责管理物理机上的HRegion(单个region数据量太大,需要分裂成两个)
  • 接收客户端的读写请求,并与hregion交互
  • 维护Write-Ahead Log(WAL),用于记录所有数据变更,支持数据恢复

HRegion

HRegion负责数据的读写,类似MySql中的引擎层(innodb等)。

核心原理

高性能写读操作-LSM

image.png

对于写操作,会先记操作日志到HLog中(顺序写磁盘),然后会写到内存中(memstore),最终异步写入HFile中,因此避免了随机写磁盘的高耗时io操作。memstore使用跳表有序地存储最近的数据,当数目超过阈值时,则写入磁盘。
当处理读操作时,如果数据不在内存中,则需要到所有磁盘文件中寻找,当写入操作越来越多,磁盘文件也会随之增加,读性能会下降。因此,磁盘上会存在多个文件,为了提高效率,Hbase使用布隆过滤器快速过滤无效的请求;并异步合并文件,会删除过期、已删除和超过最大版本号的数据,能减少文件的数目。

列簇

image.png 文件的存储粒度既不是rowkey对应的所有字段,也不是每个字段单独存一个文件,HBase采用了折中的方式。一张表包含多个列簇,列簇则是包含多个列,业务上使用紧密相关的多个列可以放在一个列簇中,查询或者写入时,避免操作多个文件。{row, column, version} 元组就是一个HBase中的一个 cell,Cell的内容是不可分割的字节数组。cell是用户操作的最小数据粒度。

最佳实践

  • 列族数量最好小于或等于3
  • 使用批量API(如批量Get和批量Put)来减少网络IO,提高写入和读取性能
  • 合理设置列族的版本数量,以控制StoreFile的大小和避免过多的IO操作
  • GET操作指定需要的列或者列簇,避免多余的数据传输
  • 接口放在领域层,数据读写接口的实现放在基础设施层

参考

mp.weixin.qq.com/s/YFrc8J0qm… abloz.com/hbase/book.…