HBase架构
架构图
HBase有三个主要组成部分:客户端库,主服务器和区域服务器。区域服务器可以按要求添加或删降架构细解
架构解析
Client
- 客户端负责发送请求到数据库
- 客户端连接的方式有很多种
- 发送的请求主要包括
- DDL:数据库定义语言(表的建立,删除,添加删除列族,控制版本)。
- DML:数据库操作语言(增删改)
- DQL:数据库查询语言(查询–全表扫描–基于主键–基于过滤器)
- client维护着一些cache来加快对hbase的访问,比如regione的位置信息。
Zookeeper
- 保证任何时候,集群中只有一个master
- 存贮所有Region的寻址入口,存储所有的的元数据信息。
- 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master
- 存储Hbase的schema,包括有哪些table,每个table有哪些column family
HMaster
- HBase集群的主节点,HMastert也可以实现高可用(active–standby)。
- 为Region server分配region
- 负责region server的负载均衡
- 管理用户对table的结构创建,删除,修改(ddl)操作。
- 表的元数据信息–》Zookeeper上面
- 表的数据–》HRegionServer上
- 当HRegionServer下线的时候,HMaster会将当前HRegionServer上的Region转移到其他的HRegionServer
HRegionServer
- Region server属于HBase具体数据的管理者
- Region server维护Master分配给它的region,处理对这些region的IO请求
- 会实时的和Haster保持心跳,汇报当前节点的信息
- 当接收到Hmaster命令创建表的时候,分配一个Region对应一张表
- Region server负责切分在运行过程中变得过大的region
- 当客户端发送DML和DQL操作的时候,HRegionServer负责和客户端建立连接
- 当意外关闭的时候,当前节点的Region会被其他HRegionServer管理,一个节点只有一个HRegionServer
HRegion
- HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布在不同的HRegion server上。
- HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据
- 每个表一开始只有一个region,一个Region只属于一张表,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region(裂变)
- hbase.hregion.max.filesize 通过设置这个参数可以设置阈值大小
- 当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver上。一张表后期有可能有多个Region
- 因为随着时间的推移,Region会越来越大
- Region达到阈值10G的时候会被平分(逻辑上平分,尽量保证数据的完整性)。
- 会将切分后的其中一个Region转移到其他的HRegionServer上管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bu9Dr2FS-1627040857644)(https://cdn.jsdelivr.net/gh/ShaneCheng0202/image-hosting@master/hbase/region_change_process.3fet67vbjc60.png)]
- 为了防止前期数据的处理都集中在一个HRegionServer,我们可以根据自己的业务进行预分区
Store
-
HRegion是表获取和分布的基本元素,由一个或者多个Store组成,每个store保存一个columns family -
每个Store又由1个memStore和0或多个StoreFile组成。
-
HFile是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。 -
索引的大小(keys的大小,数据量的大小影响block的大小,在大数据集的情况下,block的大小设置为每个RegionServer 1GB也是常见的。
Storefile
- Data Blocks段-保存表中的数据,这部分可以被压缩
- Meta Blocks 段(可选的)-保存用户自定义的kv对,可以被压缩。
- File Info段-Hfile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。
- Data Block Ilnex段-Data Block的索引。每条索引的key是被索引的block的第一条记录的key
- Meta Block Index段(可选的)-Meta Block的索引。
- Trailer-这一段是定长的。
- 保存了每一段的偏移量,读取一个HFile时,会首先读取Trailer
- Trailer保存了每个段的起始位置(段的Magic Number用来做安全check)
- 然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block
- 通过一次磁盘io将整个block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。
MemStore
-
HFile中并没有任何Block,数据首先存在于MemStore中。Flush发生时,创建HFile Writer -
当操作数据的时候,第一个空的Data Block初始化,初始化后的Data Block中为Header部分预留了空间, Header部分用来存放一个Data Block的元数据信息。 -
位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中:
- 注:如果配置了Data Block Encoding,则会在Append Keyalue的时候进行同步编码,编码后的数据不再是单纯的Keyvalue模式。
- Data Block Encoding是HBase为了降低KeyValue结构性膨胀而提供的内部编码机制。
Hlog
-
Write After Log做任何操作之前先写日志 -
HLog文件就是一个普通的Hadoop Sequence File (sequenceFile文件是Hadoop用来存储二进制形式的[Key,Value]对而设计的一种平面文件)
- sequeceFile的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息工除了table和region名字外,同时还包括sequence number和timestamp
- timestamp是”写入时间”,
- sequence number的起始值为0,或者是最近一次存入文件系统中sequence number
- SequeceFile的value是HBase的KeyValue对象,即对应HFile中的KeyValue。
-
日志直接存放到HDFS上,写入的数据就是
-
当memStore达到阈值的时候开始写出到文件之后,会在日志中对应的位置标识一个检查点 -
一个HRegionServer只有一个Log文档 -
MasterProcWAL: HMaster记录管理操作,比如解决冲突的服务器,表创建和其它DDLs等操作到它的WAL文件中,这个WALs存储在MasterProcWALs目录下,它不像RegionServer的WALs,HMaster的WAL也支持弹性操作,就是如果Master服务器挂了,其它的Master接管的时候继续操作这个文件。 注:WAL(Write Ahead Log)预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。 -
WAL记录所有的Hbase数据改变,如果一个RegionServer在MemStore进行FLush的时候挂掉了,WAL可以保证数据的改变被应用到。如果写WAL失败了,那么修改数据的完整操作就是失败的。
- 通常情况,每个RegionServer只有一个WAL实例。在2.0之前,WAL的实现叫做HLogo
- WAL位于/hbase/WALs/目录下
- MultiWAL:如果每个RegionServer只有一个WAL,由于HDFs必须是连续的,导致必须写WAL连续的,然后出现性能问题。MultiWAL可以让RegionServer同时写多个WAL并行的,通过HDFS底层的多管道,最终提升总的吞吐量,但是不会提升单个Region的吞吐量。
L,由于HDFs必须是连续的,导致必须写WAL连续的,然后出现性能问题。MultiWAL可以让RegionServer同时写多个WAL并行的,通过HDFS底层的多管道,最终提升总的吞吐量,但是不会提升单个Region的吞吐量。
[外链图片转存中…(img-bxkqxdOe-1627040857650)]
|