【熬夜肝了】HBase设计的实践经验(全)

今天分享的内容是关于HBASE相关设计的实战经验,记录学到的东西。主要是线上(集群规模10~20台,每秒读写数据量在几十万条记录的量级)出现了bug, 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 则指
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值