今天分享的内容是关于HBASE相关设计的实战经验,记录学到的东西。
– HBASE简介
– 详解HBASE的读和写、读放大、合并等
– HBASE在告警信息的使用
– HBASE的优化经验
HBASE是什么?
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。
HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
(1)数据模型
这就是一张表,我们可以根据行键(roykey)获取一列族数据或多列族数据,每一个列族下面有不限量的列,每一个列上可以存储数据,每一个数据都是有版本的,可以通过时间戳来区别。所以我们在一张表中,知道行键,列族,列,版本时间戳可以确定一个唯一的值
(2)逻辑架构
任何一张表,他的rowkey是全局有序的,由于对物理存储上的考虑,我们把它放在多个机器上,我们按照大小或者其他策略,分为多个region。每一个region负责表示一份数据,region会在物理机器上,保证是一个均衡的状态。
(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之上。
HBase 使用 Zookeeper 做分布式管理服务,来维护集群中所有服务的状态。Zookeeper 维护了哪些 servers 是健康可用的,并且在 server 故障时做出通知。Zookeeper 使用一致性协议来保证分布式状态的一致性。注意这需要三台或者五台机器来做一致性协议。
zk的分布式协议还是必须要掌握的,毕竟大数据中的香饽饽flink,hbase这些都是是用zk来做分布式协议的。
(4)怎么读?
- 定位,从 Meta table 获取 rowkey 属于哪个 Region Server 管理
- 相应的 Region Server 读写数据
- 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)怎么写数据?
-
首先是将数据写入到 WAL 中(WAL 是在文件尾部追加,性能高)
-
加入到 MemStore 即写缓存, 服务端就可以向客户端返回 ack 表示写数据完成
(7)MemStore 即写缓存是个什么东西?
- 缓存 HBase 的数据,这和 HFile 中的存储形式一样
- 更新都以 Column Family 为单位进行排序
(8)缓存写完了怎么刷盘呢,总要写到磁盘上去吧?
-
MemStore 中累积了足够多
-
整个有序数据集就会被写入一个新的 HFile 文件到 HDFS 上(顺序写)
-
这也是为什么 HBase 要限制 Column Family 数量的一个原因(列族不能太多)
-
维护一个最大序列号,这样就知道哪些数据被持久化了
(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…,更多内容关注公号:汀雨笔记,陆续奉上。