本文介绍HBase中的数据存储模块,先从微观层面拆分出每个存储模块讲解,然后再从宏观层面介绍这些模块之间是怎样协同工作的,以及为什么需要这些存储模块,它们帮HBase实现了那些功能和性能上的提升。
(RegionServer的架构图)
RegionServer的结构:
RegionServer = Region + Store + MemStore + StoreFile + HFile + HLog
接下来将逐个介绍RegionServer中的这些模块。
水平拆分就是将表横向切分,就像在一张白纸划一道横线,白纸就分为上下两部分。这样每一部分都保存着完整的字段,只是有些数据保存在上面部分,有些数据保存在下面部分。如下图:
上图中,表中ID为奇数存在一张表中,偶数存在另一张表中,这样就是表的水平拆分。
Region的拆分是不可见的,Master不参与拆分。RegionServer先将要拆分的Region下线,然后拆分;再将子Region加入到Mata元信息中,再将两个Region添加到RegionServer上,最后同步到Master上(这就是HBase负载均衡的原理)。
根据拆分原理得到的优化技巧: 在设计表,尤其是RowKey时,尽量让数据分散到多台Server上,避免单个节点成为热点,才能发挥出HBase的性能。
每个Region有多个Store。Store对应每个表的列族,表里有多少个列族,Region中就有多少个Store。Region会根据Store的大小,决定是否切分Region。
每个Store又包含多个MEMStore,MEMStore是内存式的数据结构。 MemStore保存修改的数据,即用户put、delete的请求,默认大小64M,HBase有异步线程进行刷写。
HBase会将内存中的数据写入到文件中,这里的文件指的就是StoreFile。StoreFile底层是以HFile格式保存,HFile下文会专门介绍。
存储数据的最小单元,HFile底层是Hadoop的二进制格式文件(Key-Value类型)。
(Hfile结构图)接下来介绍一下HFile中的各个模块:
顺序扫描HFile时,此部分数据将被读取,用户数据就保存这个分区中(HFile最重要的功能)。
Data Block是由Key-Value结构组成,这就是为什么HBase是Key-Value存储的。每个Key-Value由Key Length、value length、key、value 4个部分组成,keylength 和value length主要在偏移时候,起到作用。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTvWFgqR-1599123508856)(https://note.youdao.com/yws/public/resource/babda7978b0415833a56f265c7ae77d8/xmlnote/8DC775EA2B01461097FED47625BD336F/62527)]
(Data Block结构图)Key:
结合上图来看,Data Block中的Key中包含以下内容:
名称含义Row Length行键长度Row行键Column Family length列族长度Column Family列族Column Qualifier length列描述符的长度Column Qualifier列描述符Timestamp时间戳Key Type键类型Key Type:
由于写入到HFile中的数据,是不可修改的,只能通过先删除后增加实现修改,所以当需要删除数据时,KeyType就起作用了。
KeyType类型含义put插入数据。delete删除整行数据。delete Column删除整列数据。delete Family删除一个列族。我们可以用Key Type,来给数据做一个墓碑标记,表示这个数据被删除掉了。HBase在扫描HFile时,当看到标记delete、delete column、delete family时,就认为这些数据已经不存在了;HBase会在以后运行中(具体在什么时候,下文还会详细介绍),将这些标记为删除的数据删除掉,这样就提高了HBase的存储插入的性能。
顺序扫描HFile时,Non-scanned Block Section区域不会被扫描,该区域包含了一些元数据块。
在RegionServer启动时,“Load-on-open” Section会加载到内存中的。该区域保存了HBase元数据相关信息。
Trailer中保存HFile的基本信息,偏移量和寻址信息。也保存了一部分的元数据(Mata)信息。
本文分析了HBase中的各个存储模块,以及所有HBase存储模块的介绍,我建议将本文作为HBase名词的字典,遇到这些存储模块时,就来查看一下它的作用介绍,这样就更容易理解HBase的运行机制,以及各个模块之间是怎样协作运行的了。
在后续的文章中,将介绍下Hbase的日志系统。喜欢本文就点赞和收藏吧。