分布式NewSQL数据库Hyperbase

    技术2025-01-12  19

    Hyperbase

    Hyperbase简介

    概念

    Transwarp Hyperbase实时数据库是建立在Apache HBase和Elasticsearch基础之上,融合了多种索引技术、分布式事务处理、全文实时搜索、图形数据库在内的实时NewSQL数据库。Hyperbase可以高效地支持企业的在线OLTP应用、高并发OLAP应用、批处理应用、全文搜索或高并发图形数据库检索应用,结合Inceptor高速SQL引擎,是企业创建可扩展在线运营数据库(Operational Database)或者实时分析型数据库(ODS - Operational Data Store)的最佳选择。Hyperbase的概念,首先Hyperbase是一个具有高可靠,高性能,可伸缩,实时读写,并且面向列的一个分布式NewSQL数据库。所谓NewSQL数据库,就是说Hyperbase即具有NoSQL数据库的海量数据存储管理能力,同时又继承了关系型数据库的SQL特性。关于列式存储,首先顾明思议的,就是按照列进行存储。Hyperbase中是按照列族为标准进行存储,这样做的好处是对Schema的限制很少,并且可以自由的添加列,对存储半结构化数据非常有利。同时Hyperbase又是一个Key-Value数据库。Hyperbase按Key的字典顺序进行存储,并且主要通过Key实现数据的增删改查,以及扫库的操作。最后,Hyperbase采用了HDFS作为文件存储系统,来完成对海量、多种类数据的存储管理。

    Hyperbase具有以下特点:

    Hyperbase利用HDFS作为其文件存储系统,本身具有相当强大的海量数据存储能力,并且基于NoSQL数据库的特性,对于存储半结构化、非结构化的稀疏数据,也完美支持。 2.(分布式结构)致使 Hyperbase的线性扩展能力,随着集群节点的增加,Hyperbase的容量以及处理能力线性增长。Hyperbase具有很强的并发性,特别是在高并发要求的处理场景下,更能体现其优点。高可靠,基于HDFS文件系统以及自身具备的恢复机制,Hyperbase具有很高的数据可靠性。(主从架构设计)Hyperbase支持数据的实时随机读写,并且具有很强的数据一致性。

    适用场景

    Hyperbase的主要适用场景是高并发查询,以及半结构化和非结构化数据的存储。关于高并发查询,Hyperbase对于海量数据、简单条件查询的高并发性有着完美的支持。关于半结构化和非结构化的数据存储,Hyperbase同样有着非常好的支持,比如对图片数据或者视频数据这样的10K~10M的半结构化或者非结构化数据的存储。(最后由Hyperbase整合落盘到hdfs中存储) 注:对于海量的非结构化数据而言,如果是大文件的话,建议直接存储在hdfs中。

    Hyperbase原理

    数据模型

    存储

    注:由图可见Hyperbase存储数据十分稀疏,在数据存储的时候,如果某一个单元格没有数据时,最终落在底层数据存储时也不会占据多余的存储空间。 同一单元格里的数据是按照时间倒叙排列,方便快速查找到最新的数据。rowkey有序的按照生序的方式排列。

    Namespace(命名空间):

    命名空间是对表的逻辑分组,类似于关系型数据库中的database。利用命名空间,在多租户场景下可以达到更好的资源和数据隔离效果。

    table(表):

    Hyperbase以表维单位组织数据。表由多行组成。

    row(行):

    表以行维单位组织数据。行由一个rowkey和多个列族组成。

    rowkey(行键):

    是Hyperbase表中决定一行数据的唯一标识。rowkey是按照字典顺序进行排列。rowkey最多能存储64k字节的数据。

    column family(列族)&column(列)&Column qualifier(列限定符):

    Hyperbase表中的每一个列都归属于某个列族,列族必须作为Schema定义的一部分预先给出;列族必须在建表时明确定义,入:create ‘student’,‘basicinfo’,‘courseinfo’列由列族和列限定符唯一指定,形式为列族:列限定符;每一个列族都可以有多个列,新的列可以在表创建后,动态的加入某个列族;权限控制、存储以及调优都是在列族层面进行的。物理上,同一列族的数据存储在一起 注:以行的形式体现表,但是是以列的形式存储数据的。

    cell(单元格):

    由行和列的坐标交叉所决定;Hyperbase中的单元格中所存储的都是字节数组(Byte[]),也就是说Hyperbase单元格中的数据是没有类型的,全部都是字节码的形式进行存储。

    timestamp(时间戳):

    在Hyperbase中每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异;不同版本的数据按照时间倒序排序,最新的数据排在最上面;时间戳可以在数据写入时由Hyperbase自动赋值,同样也可以由用户来手动赋值,但是如果要避免数据版本之间的冲突,就必须由用户自己生成具有唯一性的时间戳;时间戳的数据类型是64位整形。为了避免数据存在过多版本造成的的管理(包括存贮和索引)负担,Hyperbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本。数据在Hyperbase中的数据读取流程为table->rowkey->column family->column->cell->ti mestamp。
    Hyperbase表特点:
    首先Hyperbase表的数据规模可以相当的大,单表容量可达数十亿行,上百万列。行和列支持动态添加,每行可以有任意多的列,不同的行也可以有不同的列,并且列的类型没有任何限制。面向列族的存储和权限控制,并且支持列族的独立查询。(底层数据文件以列族为基础)表中无值的单元格在系统中是不存在的,在实际的物理存储中也不占用任何存储空间,表的“稀疏性”就体现在这里。数据可以有多个版本,通过时间戳来唯一标识不同版本。表中所存储数据全部以字节数据的形式存储。

    系统架构

    Hyperbase的系统架构如图所示。从物理上划分,Hyperbase主要由两种服务器以主从的架构组成,这两种服务器分别为HMaster(Master)以及HRegionServer(Slave)。除此之外还有Zookeeper集群。首先主节点HMaster。HMaster并不处理Client的数据读写,他负责管理整个集群的元数据信息,以及负责表的创建、删除以及修改操作。除此之外他还负责HRegionServer的负载均衡,为HRegionServer分配Region。其次是从节点HRegionServer。HRegionServer来处理Client的数据读写请求,并管理其内部的Region的分裂以及StoreFile的合并操作。在集群运行过程中,HRegionServer可以动态的添加或者删除。最后是Zookeeper。Zookeeper主要负责实现HMaster的高可用,以及监控HRegionServer的上下线信息,并通知HMaster。他同样是集群中存储元数据的寻址入口,也是存储所有Region的寻址入口。Client客户端。Hyperbase的客户端Client通过接口访问Hyperbase,并且为了加快数据的访问速度,会将元数据、Region位置等信息缓存在Client Cache中。
    系统架构中的角色

    HMaster是Hbase集群的主节点,它对于自身而言管理元数据,并管理表的创建、删除和修改。作为集群管理者,它为HRegionServer分配Region,并保证HRegionServer的负载均衡(分配均匀数量的Region),但不处理Client的数据读写请求。

    HRegionServer是Hbase集群的从节点,它负责处理Client的读写请求,管理Region的分裂和Storefile的合并。

    Zookeeper除了负责HMaster的高可用之外,还负责监控HRegionServer的上下线信息,并通知HMaster。而且存储元数据的寻址入口和所有Region的寻址入口。(注:与hdfs的主从不同的是,在HRegionServer处理来自客户端的请求的时候,不会通过HMaster,而是由Zookeeper直接找到hmaster存储的元数据的hyperbase表,查找到目标表的HRegionServer,在哪些Region中存放,然后将元数据缓存在client节点之后再通过HRegionServer来对表数据操作)。

    client通过接口访问hyperbase,为了加快数据访问速度,将元数据,region位置等信息缓存在client cache中。

    Region是Hyperbase中分布式存储和负载的最小单元。系统会将表中数据按照rowkey划分为多个Region,每一个Region中保存表中的一段数据,默认情况下每一张表一开始只有一个Region,但是随着数据的写入,Region会不断的增大,当Region的大小超过阈值时,会分裂为两个Region,以此类推,并且随着Region的不断分裂,HMaster会将部分Region迁移到其他的HRegionServer中去来实现负载均衡,因此一张表中的数据通常被保存在多个HRegionServer的多个Region中。(注:很方便的通过rowkey进行切分)

    Region是由多个Store组成的,每一个Store存储表中一个列族的数据。Store由内存中的MemStore以及磁盘中的StoreFile两部分构成。

    MemStore是Store的内存缓冲区,数据读写都要首先经过MemStore。而StoreFile是MemStore的磁盘溢写文件,在HDFS中被称为HFile。在Hyperbase写入数据时,数据先被写入MemStore,当MemStore中的数据达到阈值时,HRegionServer会将MemStore中的数据溢写入磁盘中,每一次溢写都生成一个独立的StoreFile,StoreFile文件落在HDFS中被称为HFile。当StoreFile的数量超过阈值时,HRegionServer会将若干小的StoreFile合并成为一个大的StoreFile。(注:落小文件会在巡道时对hdfs造成压力)在Client从Hyperbase中读取数据时,Client会先找MemStore(注:因为在没有达到阀值时,MemStore中的数据不会写入到StoreFile,如果不先读MemStore则会少读到一部分数据),之后再去读取StoreFile。(当Region中Store大大小超过一定的阈值时,HRegionServer会将其等分成两个Region)

    HLog是预写日志产生的日志文件,就是说Hyperbase在进行操作时,会首先将操作写入日志,后进行具体操作,即先写HLog,再写MemStore,最后由MemStore溢写出StoreFile。HLog的存在意义就是在HRegionServer意外宕机时作为数据恢复的依据。每一个HRegionServer都会维护一个自己的HLog,并且HLog会定期将过期数据进行清理。

    Hyperbase的数据恢复过程:

    1. 首先HMaster通过Zookeeper自动感知HRegionServer的宕机; 2. HMaster会处理HLog,并针对不同的Region将HLog进行拆分; 3. HMaster重新分配失效的Region; 4. 通过HLog将尚未持久化的数据重新写入MemStore,然后溢写到StoreFile。

    Hyperbase存储机制
    Region和store和storefile

    当有一张表的数据在写入Hyperbase时,Region会在写入的过程中分裂为多个Region,这样的多个Region均匀的存储在HRegionServer中,而我们的客户端在进行读请求时也是直接访问的HRegionServer。

    HRegionServer中的一个Region会根据表结构中的列族细分为多个Store,每一个Store存储一个列族的数据,而这些Store由有MemStore和StoreFile之分,数据在写入时,首先写入MemStore,当MemStore中的数据达到阈值时,HRegionServer会将这些MemStore中的数据溢写为StoreFile文件,StoreFile文件为HDFS当中持久化文件,即HFile文件。

    随着MemStore中的数据不停的溢写为StoreFile文件,StoreFile文件的数据量过多超过阈值,这些StoreFile文件就会进行合并,合成为一个大的StoreFile文件。这些大的StoreFile文件最终存储到HDFS上就是HFile文件。

    Hbase的表为什么是稀疏的结构呢?PPT中的图示可以说明,在一个列族进行存储的时候,会按行去进行扫描,有数据就会进行存储,没有数据就不进行存储。最终存储成key-value的形式保存成StoreFile。

    StoreFile Compaction

    StoreFile Compaction的含义是将Store中的全部或者部分StoreFile合并为一个StoreFile的过程,其目的是为了减少StoreFile文件的数量,提升数据读取的效率。

    StoreFile Compaction的分类:

    1. Minor Compaction就是在StoreFile合并时,选取Store下的部分的StoreFile进行合并,一般选取的标准是相邻或者比较小的StoreFile进行合并,将这些StoreFile合并为一个大的StoreFile。这种合并机制速度较快,并且IO和带宽的开销相对较低,除此之外,该合并机制对于版本过期的数据不会进行删除,只会删除被标记为删除的数据。

    2. Major Compaction就是在StoreFile合并时,将Store下的所有StoreFile和并为一个StoreFile,该合并机制对于IO以及带宽的开销非常高,速度很慢,并且会对版本过期的数据进行删除,并删除标记为删除的数据。

    Region Split

    当Region的大小达到阈值时,HRegionServer会将这个Region分裂为两个小的Region,这个过程就是Region Split,Region Split的目的是为了保证数据的负载均衡。

    Region Split的具体方法是利用Middle Key将当前Region划分为两个等量的Region。当Region中最大的Store的大小超过阈值时,触发Region Split,并且Split会产生大量的IO操作,在Split开始前和完成后,HRegionServer都会通知HMaster,在Split完成后,HRegionServer会更新meta表。

    Hyperbase的读写流程

    写操作

    写操作中,首先Client会去访问Zookeeper来获取meta表所在Region的位置信息,并将该信息写入Client Cache。之后Client读取meta表,后根据Namespace、表名和rowkey,来获取将要写入Region的位置信息,并将meta表写入Client Cache,之后就由Client与HRegionServer直接交互完成写操作。Client向HRegionServer发出写请求,HRegionServer先将操作和数据写入HLog,再将数据写入MemStore,并保持有序。当MemStore达到阈值时,将数据溢写入磁盘,生成StoreFile文件。当StoreFile文件数量超过阈值时,触发StoreFile Compaction将若干StoreFile进行合并。当Region中最大的StoreFile文件大小超过阈值时,Region分裂为两个Region。

    读操作

    读操作中,同样Client会去访问Zookeeper来获取meta表所在的Region的位置信息,并将该信息写入Client Cache。之后Client读取meta表,并根据Namespace、表名和rowkey来获取将要读取的Region的位置信息,将meta表写入Client Cache,后由Client和HRegionServer直接交互。Client向HRegionServer发出读请求。HRegionServer会先从MemStore中读取数据,如果未找到、再从StoreFile中读取数据。

    Hyperbase全局索引

    一级索引就是指各行数据按照rowkey的字典顺序排列,通过rowkey来查询表中对应数据。一级索引对rowkey的查询效率很高,但是无法实现基于列的条件查询,在某些场景下不太适用。

    通过在某个或者某些列上建立二级索引,达到创建全局索引的目的,实现基于列的快速条件查询。一张表可以创建多个全局索引。

    Processed: 0.010, SQL: 9