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

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

Hbase适用场景

什么是HBase ?

HBase是一个开源的NoSQL分布式数据库,是Apache软件基金会顶级项目之一。 参考Google BigTable的设计,对稀疏表提供更高的存储空间使用率和读写效率。 采用存储计算分离架构,

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

提供强一致语义,在CAP理论中属于CP系统。

HBase数据模型

HBase以列族(column family)为单位存储数据,以行键(rowkey) 索引数据。
列族需要在使用前预先创建,列名(column qualifier)不需要预先声明,因此支持半结构化数据模型。
支持保留多个版本的数据,(行键+列族+列名+版本号)定位一个具体的值。
HBase是半结构化数据模型。以列族(column family)为单位存储数据,以行键(rowkey) 索引数据。

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

HBase数据模型-物理结构

  • 物理数据结构最小单元是KeyValue结构:
  • 每个版本的数据都携带全部行列信息。
  • 同一行,同一列族的数据物理上连续有序存储。
  • 同列族内的KeyValue按rowkey字典序升序,column qualifier 升序,version 降序排列。
  • 不同列族的数据存储在相互独立的物理文件,列族间不保证数据全局有序。
  • 同列族下不同物理文件间不保证数据全局有序。
  • 仅单个物理文件内有序。

Hbase架构设计

HBase架构设计

主要组件包括:

  • HMaster:元数据管理,集群调度、保活。RegionServer:提供数据读写服务,每个实例负责若千个互不重叠的rowkey区间内的数据。
  • ThriftServer:提供Thrift API读写的代理层。

依赖组件包括:

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

Hmaster主要职责

  • 管理RegionServer实例生命周期,保证服务可用性
  • 协调RegionServer数据故障恢复,保证数据正确性
  • 集中管理集群元数据,执行负载均衡等维护集群稳定性
  • 定期巡检元数据,调整数据分布,清理废弃数据等
  • 处理用户主动发起的元数据操作如建表、删表等

RegionServer主要职责

  • 提供部分rowkey区间数据的读写服务
  • 如果负责meta表,向客户端SDK提供rowkey位置信息
  • 认领HMaster发布的故障恢复任务,帮助加速数据恢复过程
  • 处理HMaster下达的元数据操作,如region开/关闭分裂合并操作等

ZooKeeper主要职责

  • HMaster登记信息,对active/backup分I达成共识
  • RegionServer登记信息,失联时HMaster保活处理
  • 登记meta表位置信息,供SDK查询读写位置信息
  • 供HMaster和RegionServer协作处理分布式任务

大数据支撑

HBase在大数据生态的定位

  • 对TB、PB 级海量数据支持强一致、近实时的读写性能,支持快速的ad-hoc分析查询任务;
  • 支持字典序批量打3描大量数据,支持只读取部分列族的数据,
  • 灵活支持不同查询模式,避免读取不必要的数据;
  • 由存储大规模任务(例如MapReduce, Spark, Flink) 的中间/最终计算结果;
  • 的平滑快速的水平扩展能力,能够敏捷应对大数据场景高速增长的数据体量和大规模的并发访问;
  • 中精细化的资源成本控制,计算层和存储层分别按需扩展,避免资源浪费。

水平扩展能力

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

Region热点切分

  • 当某个region数据量过多,切分成两个独立的子region分摊负载。
  • RegionServer 在特定时机(flush、 compaction) 检查region是否应该切分,计算切分点并RPC上报HMaster,由AssignmentManager负责执行RegionState' Transition。
  • 不搬迁实际数据,切分产生的新region数据目录下生成一个以原region文件信息命名的文件,内容是切分点对应的rowkey,以及标识新region是上下半部分的数据。

Region热点切分-切分过程

  • 所有Column Family都按照统的切分点来切分数据。
  • 目的是优先均分最大的文件,不保证所有Column Family的所有文件都被均分。
  • HFile 1作为最大的文件被均分,其他文件也必须以相同的rowkey切分以保证对齐新region的rowkey区间。

Region负载均衡

  • 定期巡检各RegionServer 上的region数量,保持region的数量均匀分布在各个RegionServer上。SimpleL oadBalancer具体步骤:
  • 根据总region数量和RegionServer数量计算平均region数,设定弹性上下界避免不必要的操作。例如默认slop为0.2,平均region数为5,负载均衡的RS.上region数量应该在[4, 6]区间内。
  • 将RegionServer按照region数量降序排序,对region数量超出.上限的选取要迁出的region并按创建时间从新到老排序;
  • 选取出region数量低于下限的RegionServer列表,round-robin分配步骤2选取的regions,尽量使每个RS的region数量都不低于下限;
  • 处理边界情况,无法满足所有RS的region数量都在合理范围内时,尽量保持region数量相近。

故障恢复机制- RegionServer恢复流程

启动流程:

  • 启动时去Zookeeper登记自身信息,告知主HMaster实例有新RS实例接入集群
  • 接收和执行来自HMaster的region调度命令
  • 打开region前先从HDFS读取该region的recovered edits目录下的WAL记录,回放恢复数据
  • 恢复完成,认领Zookeeper. 上发布的分布式任务(如WAL切分)帮助其他数据恢复