文章目录

  • HBase 系统架构
  • 客户端
  • ZooKeeper 服务器
  • Master 主服务器
  • Region 服务器
  • Region 服务器工作原理
  • 用户读写数据的过程
  • 缓存的刷新
  • StoreFile合并
  • Store 的工作原理
  • HLog 的工作原理


HBase 系统架构

  • HBase 的系统架构包括客户端、ZooKeeper 服务器、Master 主服务器、Region服务器
  • HBase 一般采用 HDFS 作为底层数据存储系统

客户端

  • 客户端包含访问 HBase 的接口,同时在缓存中维护着已经访问过的 Region 位置信息,用来加快后续数据访问过程。HBase 客户端使用 HBase 的 RPC 机制与 Master 和 Region 服务器进行通信。
  • 对于管理类操作,客户端与 Master 进行 RPC;而对于数据读写类操作,客户端会与Region 服务器进行 RPC。

ZooKeeper 服务器

  • HBase 服务器集群包含一个 Master 主服务器和多个 Region 服务器。Master是HBase 集群的“总管”,它必须知道 Region 服务器的状态。ZooKeeper 服务器就可以轻松做到这一点,每个 Region 服务器都需要到 ZooKeeper 服务器中进行注册,ZooKeeper 服务器会实时监控每个 Region 服务器的状态并通知 Master 主服务器,这样,Master 主服务器就可以通过 ZooKeeper服务器随时感知到各个 Region 服务器的工作状态。
  • ZooKeeper 服务器并非一台单一的机器,可能是由多台机器构成的集群来提供稳定可靠的协同服务。ZooKeeper 服务器能够很容易地实现集群管理的功能,如果有多台服务器组成一个服务器集群,那么必须有一个Master知道当前集群中每台机器的服务状态,一旦某台机器不能提供服务,集群中其他机器必须知道,从而做出调整、重新分配服务策略。同样,当增加一台或多台服务器,也必须让Master知道。
  • ZooKeeper 服务器不仅能够帮助维护当前的集群中机器的服务状态,而且能够帮助选出一个“总管”,让总管来管理集群。HBase 中可以启动多个 Master,但是 ZooKeeper 服务器可以帮助选举出一个 Master 主服务器作为集群的总管,并保证在任何时刻总有唯一一个 Master 主服务器在运行,避免 Master 主服务器的“单点失效”问题。
  • ZooKeeper 服务器中保存-ROOT-表的地址和 Master 主服务器的地址,客户端可以通过访问ZooKeeper 服务器获得-ROOT-表的地址,并最终通过“三级寻址”找到所需的数据。ZooKeeper服务器中还存储 HBase的模式,包括 Hbase的表,每个表的列族。

Master 主服务器

Master 主服务器主要负责表和 Region 的管理工作。

  • 管理用户对表的增加、删除、修改、查询
  • 实现不同 Region 服务器之间的负载均衡
  • 在 Region 分裂或合并后,负责重新调整 Region 的分布
  • 对发生故障失效的 Region服务器上的Region 进行迁移

  • 客户端访问 HBase 上数据的过程不需要 Master 主服务器的参与,客户端访问ZooKeeper 服务器获取-ROOT-表的地址,并最终到相应的 Region 服务器进行数据读写,Master主服务器仅维护着表和 Region 的元数据信息,因此负载很低。
  • 一个 Region 只能分配给一个 Region 服务器。Master 主服务器维护当前可用的Region 服务器列表,以及Reginon的分布情况。当存在未被分配的 Region,并且有一个 Region 服务器上有可用空间时,Master 主服务器就给这个 Region 服务器发送一个请求,把该 Region 分配给它。Region 服务器接收请求并完成数据加载后,就开始负责管理该 Region 对象,并对外提供服务。

Region 服务器

  • Region 服务器是 HBase 中最核心的模块,负责维护分配给自己的 Region,并响应用户的读写请求。
  • HBase一般采用 HDFS 作为底层存储的文件系统,因此 Region 服务器需要向HDFS 中读写数据。采用 HDFS 作为底层存储系统,可以为 HBase 提供可靠稳定的数据存储,HBase自身并不具备数据复制和维护数据副本的功能,HDFS可以为HBase提供这些支持。

Region 服务器工作原理

  • Region 服务器内部管理一系列 Region 对象和一个 HLog 文件。HLog是磁盘上面的记录文件,它记录着所有的更新操作。每个 Region 对象由多个 Store 组成,每个 Store 对应表中的一个列族的存储。每个 Store 又包含一个 MemStore 和若干个 StoreFile。其中,MemStore 是在内存中的缓存,保存最近更新的数据;StoreFile 是磁盘中的文件,文件是 B 树结构的,方便快速读取。

用户读写数据的过程

  • 当用户写入数据时,会被分配到相应的 Region 服务器去执行操作。用户数据首先被写入MemStore 和 HLog 中,当操作写入 HLog 之后,commit()调用才会将其返回给客户端。当用户读取数据时,Region 服务器会首先访问 MemStore 缓存,如果数据不在缓存中,才会到磁盘上面的 StoreFile 中去寻找。

缓存的刷新

  • MemStore 缓存的容量有限,系统会周期性地调用 Region.flushcache()把 MemStore 缓存里面的内容写到磁盘的 StoreFile 文件中,清空缓存,并在 HLog 文件中写入一个标记,用来表示缓存中的内容已经被写入 StoreFile 文件中。每次缓存刷新操作都会在磁盘上生成一个新的 StoreFile 文件,因此每个 Store 会包含多个 StoreFile 文件
  • 每个Region服务器都有一个自己的 HLog 文件。在启动的时候,每个Region服务器会检查自己的 HLog 文件,确认最近一次执行缓存刷新操作之后是否发生新的写入操作。如果没有更新,说明所有数据已经被永久保存到磁盘的 StoreFile 文件中;如果发现更新,就先把这些更新写入 MemStore,然后刷新缓存,写入磁盘的StoreFile文件中。最后删除旧的 HLog 文件,并开始为用户提供数据访问服务。

StoreFile合并

  • 每次 MemStore 缓存的刷新操作都会在磁盘上生成一个新的 StoreFile 文件,系统中的每个 Store 可能存在多个 StoreFile 文件。当需要访问某个 Store 中的某个值时,必须查找所有StoreFile文件,非常耗费时间。因此,为了减少查找时间,系统一般会调用 Store.compact()把多个StoreFile文件合并成一个大文件。由于合并操作比较耗费资源,因此只会在StoreFile文件的数量达到一个阈值的时候才会触发合并操作。

Store 的工作原理

  • Region 服务器是 HBase 的核心模块,而 Store 是 Region 服务器的核心。每个 Store 对应了表中的一个列族的存储。每个 Store 包含一个 MemStore 缓存和若干个 StoreFile 文件。
  • MemStore 是排序的内存缓冲区,当用户写入数据,系统首先把数据放入 MemStore 缓存,当 MemStore 缓存满时,就会刷新到磁盘中的一个 StoreFile 文件中。随着 StoreFile 文件数量的不断增加,当达到事先设定的数量时,就会触发文件合并操作,多个 StoreFile 文件会被合并成一个大的 StoreFile 文件。当多个 StoreFile 文件合并后,会逐步形成越来越大的 StoreFile 文件,当单个StoreFile 文件大小超过一定阈值时,就会触发文件分裂操作。同时,当前的一个父 Region 会被分裂成两个子 Region,父 Region 会下线,新分裂出的两个子 Region 会被 Master 主服务器分配到相应的 Region 服务器上
  • HBASE writebuffer关闭_HBASE writebuffer关闭

HLog 的工作原理

  • HBase 系统为每个 Region 服务器配置了一个 HLog 文件,它是一种预写式日志(Write Ahead Log),也就是说,用户更新数据必须首先被记入日志才能写入 MemStore 缓存,并且直到 MemStore缓存内容对应的日志已经被写入磁盘之后,该缓存内容才会被刷新写入磁盘。
  • ZooKeeper 服务器会实时监测每个 Region 服务器的状态,当某个 Region 服务器发生故障时,ZooKeeper 服务器会通知 Master 主服务器。Master 主服务器首先会处理该故障 Region 服务器上面遗留的 HLog 文件,由于一个 Region 服务器上面可能会维护多个 Region 对象,这些 Region 对象共用一个 HLog 文件,因此遗留的 HLog 文件中包含来自多个 Region 对象的日志记录。
  • 系统根据每条日志记录所属的 Region 对象对 HLog 数据进行拆分,分别放到相应 Region 对象的目录下,然后将失效的 Region 重新分配到可用的 Region 服务器中,并把与该 Region 对象相关的HLog 日志记录也发送给相应的 Region 服务器。Region 服务器领取分配给自己的 Region 对象以及与之相关的 HLog 日志记录以后,会重新做一遍日志记录中的各种操作,把日志记录中的数据写入 MemStore 缓存,然后刷新到磁盘的 StoreFile 文件中,完成数据恢复。
  • HBase 系统中,每个 Region 服务器只需维护一个 HLog 文件,所有Region 对象共用一个 HLog,而不是每个 Region 对象使用一个 HLog。在这种 Region 对象共用一个 HLog 的方式中,多个 Region 对象的更新操作所发生的日志修改,只需要不断把日志记录追加到单个日志文件中,而不需要同时打开、写入多个日志文件中,可以减少磁盘寻址次数,提高对表的写操作性能。这种方式的缺点:如果一个 Region 服务器发生故障,为恢复其上的Region 对象,需要将 Region 服务器上的 HLog 按照其所属的 Region 对象进行拆分,然后分发到其他 Region 服务器上执行恢复操作。