这是我参与「第四届青训营 」笔记创作活动的的第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切分)帮助其他数据恢复