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

472 阅读6分钟

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

今儿是第二篇关于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

(2)逻辑架构

image.png

(3)系统架构

image.png

(4)怎么读?

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

(6)怎么写数据?

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

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

(9)HFILE是什么鬼?

上一篇文章解决了这些问题!更新来啦,我直接接着写吧

(10)什么时候会触发读合并?

上一篇说了,当我们读取数据时,首先是定位,从 Meta table 获取 rowkey 属于哪个 Region Server 管理,而Region Server又有读缓存、写缓存、HFILE

因此我们读一个数据,它有可能在读缓存(LRU),也有可能刚刚才写入还在写缓存,或者都不在,则HBase 会使用 Block Cache 中的索引和布隆过滤器来加载对应的 HFile 到内存,因此数据可能来自读缓存、scanner 读取写缓存和HFILE,这就叫左HBASE的读合并

之前说过写缓存可能存在多个HFILE,因此一个读请求可能会读多个文件,影响性能,这也被称为读放大(read amplification)。

(11)既然存在读放大,那么有没有少去读多个文件的办法? --写合并

简单的说就是,HBase 会自动合并一些小的 HFile,重写成少量更大的 HFiles

它使用归并排序算法,将小文件合并成大文件,有效减少 HFile 的数量

这个过程被称为 写合并(minor compaction)

(12)写合并针对的是哪些HFILE?

1.它合并重写每个 列族(Column Family) 下的所有的 HFiles

2.在这个过程中,被删除的和过期的 cell 会被真正从物理上删除,这能提高读的性能

3.但是因为 major compaction 会重写所有的 HFile,会产生大量的硬盘 I/O 和网络开销。这被称为写放大(Write Amplification)。

4.HBASE默认是自动调度,因为存在写放大,建议在凌晨或周末进行

5.Major compaction 还能将因为服务器 crash 或者负载均衡导致的数据迁移重新移回到离 Region Server 的地方,这样就能恢复本地数据( data locality)。

(13)不是说Region Server管理多个Region,到底管理几个呢,Region什么时候会扩容? --Region分裂

我们再来回顾一下 region 的概念:

  • HBase Table 被水平切分成一个或数个 regions。每个 region 包含了连续的,有序的一段 rows,以 start key 和 end key 为边界。
  • 每个 region 的默认大小为 1GB。
  • region 里的数据由 Region Server 负责读写,和 client 交互。
  • 每个 Region Server 可以管理约 1000 个 regions(它们可能来自一张表或者多张表)。

一开始每个 table 默认只有一个 region。当一个 region 逐渐变得很大时,它会分裂(split)成两个子 region,每个子 region 都包含了原来 region 一半的数据,这两个子 region 并行地在原来这个 region server 上创建,这个分裂动作会被报告给 HMaster。处于负载均衡的目的,HMaster 可能会将新的 region 迁移给其它 region server。

(14)因为分裂了,为了负载均衡可能在多个region server,造成了读放大,直到写合并的到来,重新迁移或合并到离 region server 节点附近的地方

(15)HBASE的数据怎么备份的?

所有的读写都发生在 HDFS 的主 DataNode 节点上。HDFS 会自动备份 WAL(写前日志) 和 HFile 的文件 blocks。HBase 依赖于 HDFS 来保证数据完整安全。当数据被写入 HDFS 时,一份会写入本地节点,另外两个备份会被写入其它节点。

WAL 和 HFiles 都会持久化到硬盘并备份。那么 HBase 是怎么恢复 MemStore 中还未被持久化到 HFile 的数据呢?

(16)HBASE的数据怎么宕机恢复的?

  1. 当某个 Region Server 发生 crash 时,它所管理的 region 就无法被访问了,直到 crash 被检测到,然后故障恢复完成,这些 region 才能恢复访问。Zookeeper 依靠心跳检测发现节点故障,然后 HMaster 会收到 region server 故障的通知。

  2. 当 HMaster 发现某个 region server 故障,HMaster 会将这个 region server 所管理的 regions 分配给其它健康的 region servers。为了恢复故障的 region server 的 MemStore 中还未被持久化到 HFile 的数据,HMaster 会将 WAL 分割成几个文件,将它们保存在新的 region server 上。每个 region server 然后回放各自拿到的 WAL 碎片中的数据,来为它所分配到的新 region 建立 MemStore。

  3. WAL 包含了一系列的修改操作,每个修改都表示一个 put 或者 delete 操作。这些修改按照时间顺序依次写入,持久化时它们被依次写入 WAL 文件的尾部。

  4. 当数据仍然在 MemStore 还未被持久化到 HFile 怎么办呢?WAL 文件会被回放。操作的方法是读取 WAL 文件,排序并添加所有的修改记录到 MemStore,最后 MemStore 会被刷写到 HFile。

HBASE基本讲解就到此结束了,明天开始讲解实战演练吧!

❤️❤️❤️❤️

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

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

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