深入浅出 HBase 实战| 青训营笔记

78 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第8天

HBase 适用场景

什么是 HBase ?

开源的 NoSQL 分布式数据库。参考 Google BigTable 的设计,对稀疏表提供更高的存储空间使用率和读写效率。采用存储计算分离架构,

  • 存储层基于 HDFS 存储数据,提供容错机制和高可靠性
  • 计算层提供灵活快速的水平扩展、负载均衡和故障恢复能力

提供强一致性语义,在CAP理论(Consistency, Availability, Partition Tolerance)中属于CP系统

HBase 与关系型数据库的区别

  • 数据结构:半结构化,无数据类型;按列族稀疏存储,缺省数据不占用存储空间;支持多版本数据
  • 读写模式:支持按需读写部分列
  • 事务支持:仅支持行内原子性
  • 数据规模:适用于TB、PB级海量数据,水平扩展快速平滑
  • 索引支持:仅支持rowkey主键索引

HBase 数据模型

HBase以列族(column family)组织数据,以行键(rowkey)索引数据

  • 列族需要在使用前预先创建,列名(column qualifier)不需要预先声明,因此支持半结构化数据模型
  • (行键 + 列族 + 列名 + 版本号) 定位一个具体的值

物理结构

  • 物理数据结构的最小单元是 KeyValue 结构
  • 每个版本的数据都携带全部行列信息
  • 同一行、同一列族的数据物理上连续有序存储

使用场景

  • “近在线”的海量分布式KV/宽表存储,数据量级达到PB级以上
  • 写密集型应用,高吞吐,可接受一定的时延抖动
  • 字典序主键索引、批量顺序扫描多行数据的场景
  • Hadoop大数据生态友好兼容
  • 结构化、半结构化数据,行列稀疏的数据分布,可以经常新增/更新列属性
  • 平滑的水平扩展能力,快速响应数据体量、流量变化

HBase 数据模型的缺点

  • 每条数据都要冗余存储行列信息
  • 不支持二级索引,只能通过 rowkey 索引,查询效率依赖 rowkey 设计
  • column family 数量较多时可能引发性能衰退
  • 不支持数据类型,一律按照字节数组存储
  • 仅支持单行内的原子性操作,无跨行事务保障

HBase 架构设计

image.png

主要组件:

  • HMaster:元数据管理,集群调度、保活
    • 管理RegionServer的生命周期,保证服务可用性
    • 协调RegionServer数据故障恢复,保证数据正确性
    • 集中管理集群元数据,执行负载均衡等维护集群稳定性
    • 定期巡检元数据,调整数据分布,清理废弃数据等
    • 处理用户主动发起的元数据操作,如建表、删表等
  • RegionServer:提供数据读写服务,每个实例负责若干个互不重叠的rowkey区间内的数据
    • 提供部分rowkey区间数据的读写服务
    • 如果负责meta表,向客户端SDK提供rowkey位置信息
    • 认领HMaster发布的故障恢复任务,帮助加快数据恢复过程
    • 处理HMaster下达的元数据操作,如region打开/关闭/分裂/合并操作等
  • ThriftServer:提供Thrift API读写的代理层

依赖组件:

  • ZooKeeper:分布式一致性共识协作管理,例如HMaster选主、任务分发、元数据变更管理等
  • HDFS:分布式文件系统,HBase的数据存储底座

大数据支撑

水平扩展能力

  • 增加RegionServer实例,分配部分region到新实例
  • 扩展过程平滑,无需搬迁实际数据
  • 可用性影响时间很短,用户基本无感知

负载均衡策略

故障恢复机制