阅读 872

熬夜肝 - 回顾·HBase设计的实践经验(一)|Java 开发实战

今天分享的内容是关于HBASE相关设计的实战经验,记录学到的东西。

- HBASE简介

- 详解HBASE的读和写、读放大、合并等

- HBASE在告警信息的使用

- HBASE的优化经验

HBASE是什么?

HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。

HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

(1)数据模型

image.png

这就是一张表,我们可以根据行键(roykey)获取一列族数据或多列族数据,每一个列族下面有不限量的列,每一个列上可以存储数据,每一个数据都是有版本的,可以通过时间戳来区别。所以我们在一张表中,知道行键,列族,列,版本时间戳可以确定一个唯一的值

(2)逻辑架构

任何一张表,他的rowkey是全局有序的,由于对物理存储上的考虑,我们把它放在多个机器上,我们按照大小或者其他策略,分为多个region。每一个region负责表示一份数据,region会在物理机器上,保证是一个均衡的状态。

image.png

(3)系统架构

首先它也是一套标准的存储架构。他的Hmaster主要负责简单的协调服务,比如region的转移,均衡,以及错误的恢复,实际上他并不参与查询,真正的查询是发生在region server。region server事负责存储的,刚才我们说过,每一个表会分为几个region。然后存储在region server。

这里最重要的部分是hlog。为了保证数据一致性,首先会写一份日志文件,这是数据库系统里面以来的一种特性,创建了日志以后,我们才能写入成功。我们刚才提到HBase里面有很多column-family列族,没个列族在一个region里对应一个store,store分别包含storefile和menstore。

为了后续对HBase可以优化,我们首先考虑把文件写入menstore里面,随着menstore里面的数据满了之后,会把数据分发到磁盘里,然后storefile和memstore整体的话,依赖一个数据模型,叫做lmstree

然后,数据是采用append方式写入的,无论是插入,修改,删除。实际上都是不断的append的。比如说你的更新,删除的操作方式,都是以打标记方式写入,所以它避免了磁盘的随机io,提高了写入性能,当然的话,它的底层的话是建立在hdfs之上。

image.png

HBase 使用 Zookeeper 做分布式管理服务,来维护集群中所有服务的状态。Zookeeper 维护了哪些 servers 是健康可用的,并且在 server 故障时做出通知。Zookeeper 使用一致性协议来保证分布式状态的一致性。注意这需要三台或者五台机器来做一致性协议。

zk的分布式协议还是必须要掌握的,毕竟大数据中的香饽饽flink,hbase这些都是是用zk来做分布式协议的。

(4)怎么读?

  1. 定位,从 Meta table 获取 rowkey 属于哪个 Region Server 管理
  2. 相应的 Region Server 读写数据
  3. Meta table,保存了系统中所有的 region 列表,结构如下
  • Key:table, region start key, region id
  • Value:region server

(5)Region Server 是什么,存的什么?

Region Server 运行在 HDFS DataNode 上,由以下组件组成:

  • WAL:Write Ahead Log (写前日志)是分布式文件系统上的一个文件,用于存储新的还未被持久化存储的数据,它被用来做故障恢复。
  • BlockCache:这是读缓存,在内存中存储了最常访问的数据,是 LRU(Least Recently Used)缓存。
  • MemStore:这是写缓存,在内存中存储了新的还未被持久化到硬盘的数据。当被写入硬盘时,数据会首先被排序。注意每个 Region 的每个 Column Family 都会有一个 MemStore。
  • HFile 在硬盘上(HDFS)存储 HBase 数据,以有序 KeyValue 的形式。

(6)怎么写数据?

  1. 首先是将数据写入到 WAL 中(WAL 是在文件尾部追加,性能高)

  2. 加入到 MemStore 即写缓存, 服务端就可以向客户端返回 ack 表示写数据完成

(7)MemStore 即写缓存是个什么东西?

  • 缓存 HBase 的数据,这和 HFile 中的存储形式一样
  • 更新都以 Column Family 为单位进行排序

(8)缓存写完了怎么刷盘呢,总要写到磁盘上去吧?

  1. MemStore 中累积了足够多

  2. 整个有序数据集就会被写入一个新的 HFile 文件到 HDFS 上(顺序写)

  3. 这也是为什么 HBase 要限制 Column Family 数量的一个原因(列族不能太多)

  4. 维护一个最大序列号,这样就知道哪些数据被持久化了

(9)HFILE是什么鬼?

HFile 使用多层索引来查询数据而不必读取整个文件,这种多层索引类似于一个 B+ tree:

  • KeyValues 有序存储。
  • rowkey 指向 index,而 index 则指向了具体的 data block,以 64 KB 为单位。
  • 每个 block 都有它的叶索引。
  • 每个 block 的最后一个 key 都被存储在中间层索引。
  • 索引根节点指向中间层索引。

trailer 指向原信息数据块,它是在数据持久化为 HFile 时被写在 HFile 文件尾部。trailer 还包含例如布隆过滤器和时间范围等信息。

布隆过滤器用来跳过那些不包含指定 rowkey 的文件时间范围信息则是根据时间来过滤,跳过那些不在请求的时间范围之内的文件。

刚才讨论的索引,在 HFile 被打开时会被载入内存,这样数据查询只要一次硬盘查询。

好了,今天就分享到这儿,熬夜肝不易,休息一下~

下篇讲合并 ~

❤️❤️❤️❤️

非常感谢人才们能看到这里,如果这个文章写得还不错,觉得有点东西的话 求点赞👍 求关注❤️ 求分享👥 对帅气欧巴的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !

文末福利,最近整理一份面试资料《Java面试通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:GitHub github.com/Tingyu-Note…,更多内容关注公号:汀雨笔记,陆续奉上。

文章分类
后端
文章标签