分布式数据库原理与应用-5 HBase


第四章 Hbase

01 Hbase基本原理

Region定位–region

image-20230418230749193

1
2
3
4
5
6
在HBase中,表的所有行都是按照RowKey的字典序排列的,表在行的方向上分割为多个分区(Region)。如图1所示。
每张表一开始只有一个Region,但是随着数据的插入,HBase会根据一定的规则将表进行水平拆分,形成两个Region,当表中的行越来越多时,就会产生越来越多的Region,而这些Region无法存储到一台机器上时,需要分布存储到多台机器上。每个Region服务器负责管理一个Region,通常在每个Region服务器上会放置10~1000个Region,HBase中Region的物理存储如图2所示。

客户端在插入,删除,查询数据时需要知道哪个Region服务器上存有自己所需的数据,这个查找Region的过程称之为Region定位。

HBase中每个Region由三个主要要素组成,包括Region所属的表、包含的第一行和包含的最后一行。

Region定位–META表

1
有了Region标识符,就可以唯一标识每个Region。为了定位每个Region所在的位置,就可以构建一张映射表,映射表的每个条目包含两项内容,一个是Region标识符,另一个是Region服务器标识,这个条目就表示Region和Region服务器之间的对应关系,从而就可以知道某个Region被保存在哪个Region服务器中。

image-20230418230821649

1
2
3
4
5
6
7
8
9
10
11
映射表包含了关于Region的元数据,因此也被称为“元数据表”,又名“meta表”。可以scan命令查看meta

表的结构如图3所示。
Meta表中每一行记录了一个Region的信息。
首先RowKey包含表名、起始行键和时间戳信息。
中间用逗号隔开,第一个Region的起始行键为空。
时间戳只有用.隔开的为分区名称的编码字符串,该信息是由前面的表名、起始行键和时间戳进行字符串编码后形成。
Meta表里有一个列族info。info包含了三个列,分别为regionInfo、server和serverstartcode。
Regioninfo中记录了Region的详细信息,包括行键范围StartKey和EndKey、列族列表和属性。
Server记录了管理该Region的Region服务器的地址,如localhost:16201。
Serverstartcode记录了Region服务器开始托管该Region的时间。

Region定位–Region定位

image-20230418230932193

1
2
3
4
在HBase的早期设计中,Region的查找是通过三层架构来进行查询的,即在集群中有一个总入口ROOT表,记录了meta表分区信息及各个入口地址,这个ROOT表存放在某个Region服务器上,但是在Zookeeper中保存有它的地址。这种早期的三层架构通过先找到ROOT表,从中获取分区meta表位置,然后再获取分区meta表信息,得到Region所在的Region服务器。
从0.96版本以后,三层架构被改为二层架构,去掉了ROOT表,同时Zookeeper中的/hbase/root-region-server也被去掉。meta表所在的RegionServer信息直接存储在Zookeeper中的/hbase/meta-region-server中。如图所示
当客户端进行数据操作时,根据操作的表名和行键通过一定的顺序寻找对应的分区数据。
客户端通过Zookeeper获取到Meta表分区存储的地址,然后在对应Region服务器上获取meta表的信息,得到所需表和行键所在的Region信息,然后在从Region服务器上找到所需的数据。一般客户端获取到Region信息后会进行缓存,下次再查询不必从Zookeeper开始寻址。

数据存储与读取

1
2
3
4
5
6
7
HBase集群数据的构成如图所示
HBase的核心模块是Region服务器。
Region服务器由多个Region块构成,Region块中存储的一系列连续的数据集。
Region服务器主要构成部分是:HLog和Region块。
HLog记录该Region的操作日志。
Region对象由多个Store组成,每个Store对应当前分区中的一个列族,每个Store管理一块内存,即MemStore。
当MemStore中的数据达到一定条件时会写入到StoreFile文件中,因此每个Store包含若干个StoreFile文件。StoreFile文件对应HDFS中的HFile文件。

image-20230418233830777

MemStore

1
当Region服务器收到写请求的时候,Region服务器会将请求转至相应的Region。数据首先写入到Memstore,然后当到达一定的阀值的时候,Memstore中的数据会被刷到HFile中进行持久性存储。
1
HBase将最近接收到的数据缓存在MemStore中,在持久化到HDFS之前完成排序,再顺序写入HDFS,为后续数据的检索做了优化。因为MemStore缓存的是最近增加的数据,所以也提高了对近期数据的操作速度。在持久化写入之前,在内存中对行键或单元格做些优化。

Store

1
2
3
Store是Region服务器的核心,存储的是同一个列族下的数据,每个Store包含有一块MemStore和0个或多个StoreFile。StoreFile是HBase中最小的数据存储单元。

Store存储是HBase存储的核心,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer(内存写缓存),用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile), 当StoreFile文件数量增长到一定阈值,会触发Compaction合并操作。
1
HBase将最近接收到的数据缓存在MemStore中,在持久化到HDFS之前完成排序,再顺序写入HDFS,为后续数据的检索做了优化。因为MemStore缓存的是最近增加的数据,所以也提高了对近期数据的操作速度。在持久化写入之前,在内存中对行键或单元格做些优化。

Store的合并分裂

image-20230418233949215

HFile

image-20230418234015451

1
2
3
4
5
6
MemStore内存中的数据写到StoreFile文件中,StoreFile底层是以HFile的格式保存。
HFile的存储格式如图7所示
HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。
Trailer中有指针指向其他数据块的起始点,FileInfo记录了文件的一些meta信息。
每个Data块的大小可以在创建一个Table的时候通过参数指定(默认块大小64KB)。
每个Data块除了开头的Magic以外就是一个键值对拼接而成,Magic内容就是一些随机数字,目的是防止数据损坏。
1
HFile里面的每个键值对就是一个简单的byte数组。但是这个byte数组里面包含了很多项,并且有固定的结构。

image-20230418234045908

1
2
3
4
5
键值对结构以两个固定长度的数值开始,分别表示Key的长度和Value的长度。
紧接着是Key,Key以RowLength开始,是固定长度的数值,表示RowKey的长度,
紧接着是RowKey,然后是固定长度的数值ColumnFamilyLength,表示Family的长度,
然后是Family列族,接着是Qualifier列标识符,Key最后以两个固定长度的数值Time Stamp和Key Type(Put/Delete)结束。
Value部分没有这么复杂的结构,就是纯粹的二进制数据。

数据存储与读取

HBase写文件流程

1
2
3
4
5
客户端首先访问zookeeper,从meta表得到写入数据对应的region信息和相应的region服务器。
找到相应的region服务器,把数据分别写到HLog和MemStore上一份
MemStore达到一个阈值后则把数据刷成一个StoreFile文件。(若MemStore中的数据有丢失,则可以总HLog上恢复)
当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,合并为一个StoreFile,(这里同时进行版本的合并和数据删除。)
当Storefile大小超过一定阈值后,会把当前的Region分割为两个(Split分裂),并由Hmaster分配到相应的HRegionServer,实现负载均衡。

HBase读文件流程

1
2
客户端先访问zookeeper,从meta表读取Region的信息对应的服务器。
客户端向对应Region服务器发送读取数据的请求,Region接收请求后,先从MemStore找数据,如果没有,再到StoreFile上读取,然后将数据返回给客户端。

WAL机制

image-20230419112916756

1
2
3
4
5
6
分布式环境下,必须要考虑到系统出错的情形,比如Region服务器发生故障时,MemStore缓存中还没有被写入文件的数据会全部丢失。
因此,HBase采用HLog来保证系统发生故障时能够恢复到正常的状态。

如图所示,每个Region服务器都有一个HLog文件,同一个Region服务器的Region对象共用一个HLog,HLog是一种预写日志(Write Ahead Log)文件,就是说,用户更新数据必须首先被记入日志后才能写入MemStore缓存,当缓存内容对应的日志已经被写入磁盘后,即日志写成功后,缓存的内容才会被写入磁盘。

HBase系统中,每个Region服务器只需要一个HLog文件,所有Region对象共用一个HLog,而不是每个Region使用一个HLog。在这种Region对象共用一个HLog的方式中,多个Region对象的进行更新操作需要修改日志时,只需要不断把日志记录追加到单个日志文件中,而不需要同时打开、写入到多个日志文件中,因此可以减少磁盘寻址次数,提高对表的写操作性能。

02 Hbase Region管理

HFile合并

Minor合并

image-20230419113533020

1
2
3
4
5
6
前面讲过
用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是Hfile), 当StoreFile文件数量增长到一定阈值,会触发Compaction合并操作。
HFile的合并分为两种类型,分别是Minor合并和Major合并,这两种合并都发生在Store内部,不是Region的合并。

Minor合并是把多个小HFile合并生成一个大的Hfile
执行合并时,HBase读出已有的多个HFile的内容,把记录写入到一个新文件中。然后把新文件设置为激活状态,并标记旧文件为删除。在Minor合并中,这些标记为删除的旧文件是没有被移除的,任然会出现在HFile中,只有在进行Major合并时才会移除这些旧文件。

image-20230419113609308

1
2
对需要进行Minor合并的文件的选择是触发式的,当达到触发条件才会进行Minor合并,而触发条件有很多,比如在将MemStore的数据刷到HFile时会申请对Store下符合条件的HFile进行合并,或者定期对Store内的HFile进行合并。另外对选择合并的HFile也是有条件的,如表1所示。
在执行Minor合并时,会根据上述配置参数选择合适的HFile进行合并。Minor合并对HBase的性能是有轻微影响的,所以合并的HFile数量是有限的,默认最多为10个。

Major合并

image-20230419113630473

1
2
3
4
5
Major合并针对的是给定Region的一个列族的所有Hfile。
它将Store中的所有HFile合并成一个大文件,有时也会对整个表的同一列族的HFile进行合并,这是一个耗时和耗费资源的操作,会影响集群性能。
一般情况下都是做Minor合并,不少集群是禁止Major合并的,只有在集群负载较小时进行手动Major合并,或者配置Major合并周期,默认为7天。
另外Major合并时会清理Minor合并中被标记删除的HFile。
如上右图所示

Region拆分

image-20230419114652571

1
2
3
4
5
6
7
Region拆分是HBase能够拥有良好扩展性的最重要因素。一旦一个Region的负载过大或者超过阈值时,会被分裂成新的两个Region,如图所示。
这个过程是由RegionServer完成,其拆分流程如下:
(1)将需要拆分的Region下线,阻止所有对该Region的客户端请求,master会检测到Region的状态为SPLITING;
(2)将一个Region拆分成两个子Region,先在父Region下建立两个引用文件,分别指向Region的首行和末行,这时两个引用文件并不会从父Region中拷贝数据;
(3)之后在HDFS上建立两个子Region的目录,分别拷贝上一步建立的引用文件,每个子Region分别占父Region的一半数据。拷贝完成后删除两个引用文件。
(4)完成子Region创建后,向.META.表发送新产生的region的元数据信息;
(5)Region的拆分信息更新到Hmaster,并且每个Region进入可用状态。

拆分策略

image-20230419114724603

1
上表列举的切分策略中,切分点的定义是一致的,即当Region中最大Store的大小大于设置阈值之后才会触发拆分。而不同策略中,阈值的定义是不同的,且对集群中Region的分布有很大的影响。

Region合并

1
2
3
4
5
6
当RegionServer中的Region数到达最大阈值时,RegionServer就会发起Region合并。其合并过程如下:
(1)客户端发起Region合并处理并发送Region合并请求给Master;
(2)Master在RegionServer上把Region移到一起并发起一个Region合并操作的请求;
(3)RegionServer将准备合并的Region下线,然后进行合并;
(4)从.META.表删除被合并的Region元数据,新的合并了的Region的元数据被更新写入.META.表中;
(5)合并的Region被设置为上线状态并接受访问,同时更新Region信息到Master。
1
从Region的拆分可以看到随着表的增大,Region的数量是越来越大的,如果很多Region,它们中Memstore也过多,内存大小会触发RegionServer级别的限制,会频繁出现数据从内存刷到HFile的操作,就会对用户请求产生较大的影响,可能阻塞该RegionServer上的更新操作。过多Region会增加ZooKeeper的负担。因此当RegionServer中的Region数到达最大阈值时,RegionServer就会发起Region合并。

Region负载均衡

image-20230419114829628

1
2
3
4
5
6
在分布式系统中,负载均衡是一个非常重要的功能,在HBase中通过Region的数量来实现负载均衡。
每次负载均衡操作分为两步进行,首先生成负载均衡计划表,然后按照计划表执行Region的分配。
Master内部使用一套集群负载评分的算法,来评估HBase某一个表的Region是否需要进行重新分配。
这套算法分别从RegionServer中Region的数目、表的Region数,MenStore大小、StoreFile大小,数据本地性等几个维度来对集群进行评分,评分越低代表集群的负载越合理。
确定需要负载均衡后,在根据不同策略选择Region进行分配,负载均衡策略有三种,如表所示。
根据上述策略选择分配Region后再继续对整个表的所有Region进行评分,如果依然未达到标准,循环执行上述操作直至整个集群达到负载均衡的状态。

03 Hbase集群管理

运维管理

移除RegionServer节点

1
当集群由于升级或更换硬件等原因需要在单台机器上停止守护进程时,需要确保集群的其他部分正常工作,并且确保从客户端应用来看停用时间最短。满足此条件必须把这台RegionServer服务的Region主动转移到其他RegionServer上,而不是让HBase被动地对此RegionServer的下线进行反应。
1
2
3
4
5
6
集群运行时,有些操作任务是必需的,包括增加和移除节点。
用户可以在指定节点的HBase目录下使用hbase-damon.sh stop命令来停止集群中的一个RegionServer。执行此命令后,RegionServer先将所有Region关闭,然后再把自己的进程停止,RegionServer在ZooKeeper中对应的临时节点将会过期。Master检测到RegionServer停止服务后将此RegionServer上的Region重新分配到其他机器上。
HBase也提供了脚本来主动转移Region到其他RegionServer,然后下掉下线的RegionServer这样会让整个过程更加安全。在HBase的bin目录下提供了graceful_stop.sh脚本可以完成这种主动移除节点的功能。此脚本停止一个RegionServer的过程如下:
(1)关闭Region均衡器;
(2)从需要停止的RegionServer上移出Region,并随机把他们分配给集群中其他服务器;
(3)停止RegionServer进程

增加RegionServer节点

1
随着应用系统需求的增长,整个HBase集群需要进行扩展,这时就需要往HBase集群中增加一个节点。添加一个新的RegionServer是运行集群的常用操作,首先需要修改conf目录下的regionserver文件,然后将此文件复制到集群中所有机器上,这样可以使用启动脚本就能够添加新的服务器。
1
2
3
4
5
HBase底层是以HDFS来存储数据的,一般部署HBase集群时,HDFS的DataNode和HBase的RegionServer位于同一台物理机上。
所以往HBase集群增加一个RegionServer之前需要往HDFS里增加DataNode,
等待DataNode进程启动并加入HDFS集群后,再启动HBase的RegionServer进程。
启动新增节点上的RegionServer可以使用命令hbase-damon.sh start,启动成功后可以在Master用户界面看到此节点。
如果需要重新均衡分配每个节点上的Region,则使用HBase的负载均衡功能。

增加Master备份节点

数据管理

数据导出

数据导入

数据迁移


本文标题:分布式数据库原理与应用-5 HBase

文章作者:TTYONG

发布时间:2023年04月17日 - 16:04

最后更新:2023年06月22日 - 15:06

原始链接:http://tianyong.fun/%E5%88%86%E5%B8%83%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%E4%B8%8E%E5%BA%94%E7%94%A8-5%20HBase.html

许可协议: 转载请保留原文链接及作者。

多少都是爱
0%