Hbase_架构与运行机制

来源:互联网 发布:mac系统下载栏 编辑:程序博客网 时间:2024/05/23 15:36
  1. HBase的组件和功能

    ·Zookeeper

    用来选举集群主节点,以便跟踪可用的在线服务器,同时维护集群的元数据。
    Zookeeper以树形维护Zookeeper数据znode,它有两种形式:
    ①临时节点,适合应用程序检验某个分布式系统资源是否可用
    ②持久节点,保存了应用程序的一些数据

    ·HMaster
    管理运行在不同服务器上的RegionServer,也为客户端操作HBase的所有元数据提供接口,同时负责RegionServer的故障处理和region的切分。在HBase集群中可以有多个HMaster,实现集群的高可用
    HMaster功能:
    ① 监控RegionServer
    ② 处理RegionServer故障转移
    ③ 处理元数据变更
    ④ region的分配或移除
    ⑤ 所有元数据变更接口
    ⑥ 在空闲时间进行数据均衡
    ⑦ 通过Zookeeper发布自己的位置给客户端
    ⑧ HMaster Web界面提供HBase集群的所有信息(table、region、RegionServer等)
    如果Master节点宕机,由于客户端是直接跟RegionServer交互的,整个集群会继续正常工作。HBase的目录表(.META.和.ROOT.)是作为HBase表存在的,它们不是存储在master的内存中。但master会执行一些关键功能,如RegionServer的故障转移、region切分等,因此master节点需要尽可能快的恢复

    ·RegionServer
    RegionServer负责存储HBase的实际数据,其工作包括:
    ① 处理分配给它的region(或者表)
    ② 处理客户端读写请求
    ③ 刷新缓存到HDFS中
    ④ 维护HLog:HLogs保存了所有的修改日志,它存储在HStore文件中,也就是WAL
    ⑤ 执行压缩
    ⑥ 负责处理region分片
    这里写图片描述
    RegionServer组件介绍:
    ① Write-Ahead logs:修改记录。数据会先写在这个文件,然后写入内存。系统出现故障时便于重建
    ② MemStore:内存数据存储,用来保存当前的数据操作。当数据保存在WAL的时候,RegionServer会在内存中存储键值对
    ③ HFile:在磁盘上保持原始数据的实际的物理文件,内部由HFile块组成,块是HFile的组成单元
    ④ Store:HFile存储于此,一个Store对应HBase表的一个列族。Block是Store文件的基本存储块
    ⑤ Region:HBase表的分片,表会根据不同的键值被切分为不同的region存储在RegionServer中,一个RegionServer可以有多个不同的region
    这里写图片描述

    ·Client

    ·目录表(Catalog tables):

    ·-ROOT-:存储了.META.表的位置信息

    ·-META.:存储了所有region信息和它们的位置

  2. HBase的内部存储架构

    HBase使用LSM树存储文件,LSM树把数据存储分为两个独立的部分,并对底层存储进行优化。一部分是当前使用的,比较小,存在内存中;另一个比较大,持久化在磁盘中。当内存中的数据不断增大并超过一个阈值时,它会在磁盘中的大的结构体中进行合并,使用的是一种有序的合并算法。同时,一个新的在内存中的结构体树被创建,以便实现新的插入需求。这把随机数据访问转化为了顺序数据访问,提高了数据读的性能,并且数据是在后台进行的,不影响前端进程。

    ① 哈希存储引擎 是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统(Reids)。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快
    ② B树存储引擎是B树的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针),对应的存储系统就是关系数据库(Mysql等)。
    ③ LSM树(Log-Structured Merge Tree)存储引擎和B树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。当然凡事有利有弊,LSM树和B+树相比,LSM树牺牲了部分读性能,用来大幅提高写性能。

    LSM树的设计思想:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。极端的说,基于LSM树实现的HBase的写性能比Mysql高了一个数量级,读性能低了一个数量级。

  3. HBase内部管理

    当新数据写入HBase的时候,生成了HFile,HFile的数量会增加I/O负载。为降低此影响,HFile会被周期性地合并成一个。

    ① Minor合并:Minor合并在HStore中发生在多个HFile上。几个相邻的HFile被取出来合并后,重新写入到一个大的HFile中。完成时,删除的或者过期的文件没有被移除。Minor合并会影响HBase的性能,所以合并文件的数目是有限制的。默认10个

    ② Major合并:把所有的HFile合并为一个HFile,被删除或者过期的记录会被丢弃。一般的,在大型集群,它是手动触发的。这个操作非常耗时和耗费资源,必须在集群查询请求小的时候触发

    ③ Region分裂:Region分裂由RegionServer操作,一旦一个region的负载过大或者超过阈值256MB,便会被分裂成新的region

    ④ Region合并:新的region都是根据region-size阈值(一般是每个RegionServer100个)创建的,这会导致region的数量很大,浪费大量的内存和I/O以及吞吐性能。

    ⑤ RegionServer故障转移:一旦HMaster检测到RegionServer故障,会让其分配的region失效,region会分配到另外一个RegionServer上。

    ⑥ HBase删除请求:需要删除的数据会先被打上删除标记。Major合并进行的时候,被标记的数据会被丢弃,同时一个新的不含删除标记数据的HFile被创建。

  4. 客户端和服务器使用RPC通信的工作流程:

    ①客户端联系zookeeper去查找主HMaster以及根RegionServer的位置

    ②客户端通过HRegionInterface跟RegionServer通信来读写表

    ③客户端应用使用HMasterInterface操作HMaster来实现动态建表、添加列族以及其他操作

    ④然后,HMaster使用HRegionInterface通信去打开、关闭、移动、切分或者刷新regional

    ⑤主HMaster的数据以及根RegionServer的位置被HMastrer缓存在Zookeeper中

    ⑥RegionServer从Zookeeper中读取数据以获取日志分类任务信息,这是用来更新获取任务状态报告的

    ⑦RegionServer通过HMasterRegionServer与HMaster通信以传输一些信息,例如RegionServer的负载、RegionServer的错误以及RegionServer的启动的进程。有时候,ReginServer也通过HRegionInterface与根region或者元region通信,检查一个region的当前状态或者region分裂的时候去创建一个子region

    ⑧这种通信是以CPU时间或者一个阈值时间为间隔不断重复,以确保一切照常更新

  5. 读写周期:

    客户端首先将数据写入到WAL,然后写入HBase Memstore(内存),并被一个HStore共享,后来才被刷写到HFile

    ① Write-Ahead Logs:位于HDFS上,它实现了数据的可靠性。每个RegionServer上都有一个WAL。当RegionServer宕机而且MemStore没有被刷到磁盘的时候,WAL可以恢复数据到一个新的RegionServer上。

    ② MemStore:充当内存写缓存,默认大小为64MB。一旦MStore中的数据达到阈值(默认是堆大小的40%或者64MB),就会被刷到HDFS上的一个新的HFile中来持久化。块缓存使用最近最少使用(LRU)算法

  6. HBase数据类型

    HBase只有一种数据类型:字节数组。最多可以存储10~15MB的值到HBase的单元格中,如果值太大,可以将文件存储到HDFS中,然后在HBase中存储文件的路径。定义表时,列族的数量和名称是必须设置的,不包含值的列不进行存储(不同于传统数据库)