摘要:HBase 是一个面向列的 NoSQL 数据库。
本文分享自华为云社区《HBase 架构:HBase 数据模型 & HBase 读 / 写机制》,作者:Donglian Lin。
HBase 架构:HBase 数据模型
家喻户晓,HBase 是一个面向列的 NoSQL 数据库。尽管它看起来相似于蕴含行和列的关系数据库,但它不是关系数据库。关系数据库是面向行的,而 HBase 是面向列的。那么,让咱们首先理解面向列和面向行的数据库之间的区别:
面向行与面向列的数据库:
• 面向行的数据库以行的顺序存储表记录。而面向列的数据库 将表记录存储在一系列列中,即列中的条目存储在磁盘上的间断地位。
为了更好地了解它,让咱们举个例子并思考下表。
如果此表存储在面向行的数据库中。它将存储如下所示的记录:
1 , 保罗沃克, 美国, 231 , 加拉多,
2, Vin Diesel , 巴西, 520 , Mustang
如上所示,在面向行的数据库中,数据是基于行或元组存储的。
尽管面向列的数据库将此数据存储为:
1 , 2 , Paul Walker , Vin Diesel , 美国, 巴西, 231 , 520 , Gallardo , Mustang
在面向列的数据库中,所有列值都存储在一起,就像第一列值将存储在一起,而后第二列值将一起存储,其余列中的数据以相似形式存储。
• 当数据量十分大时,比方 PB 级或 EB 级,咱们应用面向列的办法,因为单列的数据存储在一起,能够更快地拜访。
• 尽管面向行的办法绝对无效地解决较少数量的行和列,但面向行的数据库存储数据是一种结构化格局。
• 当咱们须要解决和剖析大量半结构化或非结构化数据时,咱们应用面向列的办法。例如解决在线剖析解决的应用程序,如数据挖掘、数据仓库、包含剖析在内的应用程序等。
• 而在线事务处理(例如解决结构化数据并须要事务属性(ACID 属性)的银行和金融畛域)应用面向行的办法。
HBase 表具备以下组件,如下图所示:
• 表格: 数据以表格格局存储在 HBase 中。但这里的表格是面向列的格局。
• 行 键: 行键用于搜寻记录,使搜寻速度更快。你会很想晓得怎么做吗?我将在本博客的架构局部进行解释。
• 列 族: 各种列组合在一个列族中。这些列族存储在一起,这使得搜寻过程更快,因为能够在一次查找中一起拜访属于同一列族的数据。
• 列 限定符: 每列的名称称为其列限定符。
• 单元格: 数据存储在单元格中。数据被转储到由行键和列限定符专门标识的单元格中。
• 工夫戳: 工夫戳是日期和工夫的组合。无论何时存储数据,它都会与其工夫戳一起存储。这使得搜寻特定版本的数据变得容易。
用更简略易懂的形式,咱们能够说 HBase 包含:
• 一组表
• 每个表都有列族和行
• 行键在 HBase 中充当主键。
• 对 HBase 表的任何拜访都应用此主键
• HBase 中存在的每个列限定符示意与驻留在单元格中的对象绝对应的属性。
HBase 架构:HBase 架构的组件
HBase 具备三个次要组件, 即 HMaster Server、HBase Region Server、Regions 和 Zookeeper。
下图解释了 HBase 架构的层次结构。咱们将独自探讨它们中的每一个。
当初在进入 HMaster 之前,咱们将理解 Region,因为所有这些 Server(HMaster、Region Server、Zookeeper)都是用来协调和治理 Region 并在 Region 外部执行各种操作的。因而,您很想晓得什么是区域以及它们为何如此重要?
HBase 架构:区域
一个区域蕴含调配给该区域的开始键和完结键之间的所有行。HBase 表能够划分为多个区域,将一个列族的所有列存储在一个区域中。每个区域都蕴含按排序程序的行。
许多区域被调配给一个 Region Server,它负责解决、治理、执行对该组区域的读取和写入操作。
所以,以更简略的形式完结:
• 一个表能够分为多个区域。区域是存储在开始键和完结键之间的数据的有序行范畴。
• 一个 Region 的默认大小为 256MB,能够依据须要进行配置。
• 区域服务器为客户端提供一组区域。
• 一个区域服务器能够为客户端提供大概 1000 个区域。
当初从层次结构的顶部开始,我首先想向您解释 HMaster Server,它的作用相似于 HDFS 中的 NameNode。而后,在层次结构中向下挪动,我将带您理解 ZooKeeper 和 Region Server。
HBase 架构:HMaster
如下图所示,您能够看到 HMaster 解决驻留在 DataNode 上的 Region Server 汇合。让咱们理解 HMaster 是如何做到这一点的。
• HBase HMaster 执行 DDL 操作(创立和删除表)并将区域调配给区域服务器,如上图所示。
• 它协调和治理 Region Server(相似于 NameNode 在 HDFS 中治理 DataNode)。
• 它在启动时将区域调配给区域服务器,并在复原和负载平衡期间将区域重新分配给区域服务器。
• 它监督集群中所有 Region Server 的实例(在 Zookeeper 的帮忙下),并在任何 Region Server 敞开时执行复原流动。
• 它提供了一个用于创立、删除和更新表的接口。
HBase 有一个宏大的分布式环境,仅靠 HMaster 不足以治理所有内容。那么,你会想晓得是什么帮忙 HMaster 治理这个微小的环境?这就是 ZooKeeper 呈现的中央。在理解了 HMaster 如何治理 HBase 环境后,咱们将理解 Zookeeper 如何帮忙 HMaster 治理环境。
HBase 架构:ZooKeeper – 协调器
下图解释了 ZooKeeper 的协调机制。
• Zookeeper 就像 HBase 分布式环境中的协调器。它有助于通过会话进行通信来保护集群内的服务器状态。
• 每个 Region Server 和 HMaster Server 都会定期向 Zookeeper 发送间断的心跳,并查看哪个服务器是流动的和可用的,如上图所示。它还提供服务器故障告诉,以便能够执行复原措施。
• 从上图能够看出,有一个不流动的服务器,它作为流动服务器的备份。如果流动服务器呈现故障,它就会派上用场。
• 流动的 HMaster 向 Zookeeper 发送心跳,而非流动的 HMaster 侦听流动 HMaster 发送的告诉。如果流动 HMaster 未能发送心跳,则会话将被删除,非流动 HMaster 变为活动状态。
• 而如果 Region Server 无奈发送心跳,则会话将过期并告诉所有侦听器。而后 HMaster 执行适当的复原操作,咱们将在本博客稍后探讨。
• Zookeeper 还保护 .META Server 的门路,这有助于任何客户端搜寻任何区域。Client 首先必须与.META Server 核查某个区域所属的 Region Server,并获取该 Region Server 的门路。
说到.META Server,我先给大家解释一下什么是.META Server?因而,您能够轻松地将 ZooKeeper 和 .META Server 的工作分割在一起。稍后,当我在此博客中向您解释 HBase 搜寻机制时,我将解释这两者如何协同工作。
HBase 架构:元表
• META 表是一个非凡的 HBase 目录表。它保护了 HBase 存储系统中所有区域服务器的列表,如上图所示。
• 从图中能够看到,.META 文件以键和值的模式保护表。Key 代表区域的起始键和它的 id,而值蕴含区域服务器的门路。
正如我在向您解释 Region 时曾经探讨过的 Region Server 及其性能,因而当初咱们正在向下挪动层次结构,我将专一于 Region Server 的组件及其性能。稍后我将探讨搜寻、浏览、写作的机制,并理解所有这些组件如何协同工作。
HBase 架构:Region Server 的组件
下图显示了区域服务器的组件。当初,我将别离探讨它们。
区域服务器保护在 HDFS 顶部运行的各种区域。区域服务器的组件是:
• WAL: 从上图中能够得出结论,Write Ahead Log (WAL) 是附加到分布式环境中每个 Region Server 的文件。WAL 存储尚未长久化或提交到永恒存储的新数据。它用于复原数据集失败的状况。
• Block Cache: 从上图能够分明的看到 Block Cache 位于 Region Server 的顶部。它将常常读取的数据存储在内存中。如果 BlockCache 中的数据最近起码应用,则该数据将从 BlockCache 中删除。
• MemStore: 是写缓存。在将所有传入数据提交到磁盘或永恒内存之前,它会存储所有传入数据。一个区域中的每个列族都有一个 MemStore。正如您在图像中看到的,一个区域有多个 MemStore,因为每个区域蕴含多个列族。数据在提交到磁盘之前按字典程序排序。
• HFile: 从上图能够看出 HFile 是存储在 HDFS 上的。因而,它将理论单元存储在磁盘上。当 MemStore 的大小超过时,MemStore 将数据提交到 HFile。
当初咱们晓得了 HBase 架构的次要和主要组件,我将在此解释机制和他们的合作致力。不论是读还是写,首先咱们要搜寻从哪里读或者从哪里写一个文件。所以,让咱们理解这个搜寻过程,因为这是使 HBase 十分风行的机制之一。
HBase 架构:搜寻如何在 HBase 中初始化?
如您所知,Zookeeper 存储 META 表地位。每当客户端向 HBase 收回读取或写入申请时,就会产生以下操作:
- 客户端从 ZooKeeper 检索 META 表的地位。
- 客户端而后从 META 表中申请相应行键的 Region Server 的地位来拜访它。客户端将此信息与 META 表的地位一起缓存。
- 而后它将通过从相应的 Region Server 申请来获取行地位。
对于未来的援用,客户端应用其缓存来检索 META 表的地位和先前读取的行键的区域服务器。而后客户端将不会援用 META 表,直到并且除非因为区域挪动或挪动而导致未命中。而后它将再次申请 META 服务器并更新缓存。
与每次一样,客户端不会浪费时间从 META 服务器检索 Region Server 的地位,因而,这节俭了工夫并使搜寻过程更快。当初,让我告诉您如何在 HBase 中进行写入。其中波及哪些组件以及它们如何参加?
HBase 架构:HBase 写机制
下图解释了 HBase 中的写入机制。
写入机制顺次通过以下过程(参考上图):
步骤 1:每当客户端有写申请时,客户端将数据写入 WAL(Write Ahead Log)。
• 而后将编辑附加到 WAL 文件的开端。
• 该 WAL 文件保留在每个 Region Server 中,Region Server 应用它来复原未提交到磁盘的数据。
第 2 步:将数据写入 WAL 后,将其复制到 MemStore。
第 3 步:一旦数据放入 MemStore,客户端就会收到确认。
第 4 步:当 MemStore 达到阈值时,它将数据转储或提交到 HFile。
当初让咱们深刻理解一下 MemStore 在写作过程中的奉献以及它的性能是什么?
HBase 写机制 - MemStore
• MemStore 总是依照字典程序(按字典形式)将存储在其中的数据更新为已排序的 KeyValue。每个列族有一个 MemStore,因而每个列族的更新以排序的形式存储。
• 当 MemStore 达到阈值时,它会以排序的形式将所有数据转储到一个新的 HFile 中。此 HFile 存储在 HDFS 中。HBase 为每个列族蕴含多个 HFile。
• 随着工夫的推移,HFile 的数量随着 MemStore 转储数据而增长。
• MemStore 还保留了最初写入的序列号,因而 Master Server 和 MemStore 都晓得到目前为止提交了什么以及从哪里开始。当区域启动时,读取最初一个序列号,并从该编号开始新的编辑。
正如我屡次探讨过的,HFile 是 HBase 架构中的次要长久存储。最初,所有的数据都提交到 HFile 中,HFile 是 HBase 的永恒存储。因而,让咱们看看 HFile 的属性,它能够在读写时更快地进行搜寻。
HBase 架构:HBase 写入机制 - HFile
• 写入按程序搁置在磁盘上。因而,磁盘读写头的静止非常少。这使得写入和搜寻机制十分快。
• 每当关上 HFile 时,HFile 索引就会加载到内存中。这有助于在单次查找中查找记录。
• 预告片是一个指向 HFile 的元块的指针。它写在提交文件的开端。它蕴含无关工夫戳和布隆过滤器的信息。
• 布隆过滤器有助于搜寻键值对,它会跳过不蕴含所需行键的文件。工夫戳还有助于搜寻文件的版本,它有助于跳过数据。
在理解写入机制和各种组件在使写入和搜寻更快方面的作用之后。我将向您解释读取机制在 HBase 架构中是如何工作的?而后咱们将转向进步 HBase 性能的机制,如压缩、区域拆分和复原。
HBase 架构:读取机制
正如咱们在搜寻机制中所探讨的,如果客户端的缓存中没有它,客户端首先从 .META 服务器中检索区域服务器的地位。而后它按程序执行以下步骤:
• 为了读取数据,扫描器首先在块缓存中查找行单元。这里存储了所有最近读取的键值对。
• 如果 Scanner 未能找到所需的后果,它会挪动到 MemStore,因为咱们晓得这是写缓存内存。在那里,它搜寻最近写入的文件,这些文件尚未转储到 HFile 中。
• 最初,它将应用布隆过滤器和块缓存从 HFile 加载数据。
到目前为止,我曾经探讨了 HBase 的搜寻、读写机制。当初咱们来看看 HBase 机制,它使 HBase 中的搜寻、读取和写入变得疾速。首先,咱们将理解 Compaction,这是其中一种机制。
HBase 架构:压缩
HBase 联合 HFiles 以缩小存储并缩小读取所需的磁盘寻道次数。这个过程称为压缩。Compaction 从一个区域中抉择一些 HFile 并将它们组合起来。如上图所示,有两种类型的压缩。
- 主要压缩 :HBase 主动抉择较小的 HFile 并将它们从新提交到较大的 HFile,如上图所示。这称为轻微压实。它执行合并排序以将较小的 HFile 提交到较大的 HFile。这有助于优化存储空间。
- Major Compaction:如上图所示,在 Major compaction 中,HBase 将一个区域的较小的 HFiles 合并并从新提交到一个新的 HFile。在这个过程中,雷同的列族被搁置在新的 HFile 中。它会在此过程中删除已删除和过期的单元格。它进步了读取性能。
但在此过程中,输入输出磁盘和网络流量可能会变得拥挤。这称为写放大。因而,它通常安顿在低峰值负载工夫。
当初我将探讨的另一个性能优化过程是 Region Split。这对于负载平衡十分重要。
HBase 架构:区域拆分
下图阐明了 Region Split 机制。
每当一个区域变大时,它就会被分成两个子区域,如上图所示。每个区域正好代表父区域的一半。而后将此拆分报告给 HMaster。这由同一个 Region Server 解决,直到 HMaster 将它们调配给新的 Region Server 以进行负载平衡。
接下来,最初但并非最不重要的一点是,我将向您解释 HBase 如何在产生故障后复原数据。咱们晓得故障复原是 HBase 的一个十分重要的个性,因而让咱们理解 HBase 如何在故障后复原数据。
HBase 架构:HBase 解体和数据恢复
• 每当 Region Server 呈现故障时,ZooKeeper 都会告诉 HMaster 故障。
• 而后 HMaster 将解体的 Region Server 的区域散发并调配给许多流动的 Region Server。为了复原呈现故障的 Region Server 的 MemStore 的数据,HMaster 将 WAL 分发给所有 Region Server。
• 每个 Region Server 从新执行 WAL 来为那个失败的 region 的列族构建 MemStore。
• 数据按工夫程序(按工夫程序)写入 WAL。因而,从新执行该 WAL 意味着进行所有在 MemStore 文件中所做和存储的更改。
• 所以,在所有的 Region Servers 执行完 WAL 之后,所有列族的 MemStore 数据都被复原了。
我心愿这篇博客能帮忙您理解 HBase 数据模型和 HBase 架构。心愿你喜爱它。
点击关注,第一工夫理解华为云陈腐技术~