多租户宽表数据存储模式的查询重写机制研究

2019-01-16 07:16张雅文刘春霞白尚旺党伟超
太原科技大学学报 2019年1期
关键词:存储空间租户视图

张雅文,刘春霞,白尚旺,党伟超

(太原科技大学 计算机科学与技术学院,太原030024)

软件即服务(Software as a service, SaaS)是随着云计算发展起来的一种新型软件服务模式。SaaS环境下,多租户数据存储一直是研究领域的热点。基于宽表的数据存储模式可以有效解决多租户数据存储问题,表的数量不会随着租户数量的增加而增加,且由于是整行存储数据也不用进行表的多次连接,但宽表可能会造成大量的空值产生。因此针对SaaS应用单实例多租赁的特点,在保证租户定制需求的基础上,有必要研究新的数据存储模式,以提高存储空间利用率和查询效率。

1 SaaS多租户数据存储概念

SaaS模式是通过Internet提供软件的模式,用户不需要安装软件,只需要连接到网络就可以使用SaaS模式提供的软件[1-2]。用户可以根据自身需求以租赁的方式对软件进行使用,使得成本远远要比在本地部署专有软件的成本低。

数据的多租户化是SaaS应用多租户化的重要组成部分,SaaS应用采用一个应用实例为多个租户提供服务[2-3],各个租户在视图层又有不同的数据模式,所以需要有一个不同于传统应用的数据存储方案,以实现数据的存储、隔离,及用户访问数据的便捷性。

目前SaaS多租户数据存储已有了一些解决方案。例如扩展表方法将租户共享模式部分公共存储,租户单独模式部分分开存储,在一定程度上共享了租户数据,减少了存储开销,但是没有解决表数目跟随租户数目的增长而增长;透视表采取垂直存储的策略,将租户数据拆解成(key,value)的方式进行存储,这样减少了空值的数量,但是元组重组困难,如果想要重组含有n列的某租户的逻辑表,则需要进行n-1次的连接操作[5]。

Salesforce作为全球最大的SaaS服务提供商,提出了基于宽表的存储模式进行数据存储,属于共享数据库共享模式的数据存储架构,能够共用存储结构和资源,保证资源使用效率[6-7]。宽表存储数据具有很大的稀疏性,可能产生大量的空值,原因有两种:一是租户未定制该列,为模式空;二是租户定制了该列而列值为空,为值空[8]。在宽表的存储模式下,空值主要为模式空。为减少模式空值的产生,降低空值对数据查询的影响,本文将单宽表的存储模式扩展为多宽表的存储模式,并提出将用户发起的SQL查询语句转换为可以直接作用于数据库的SQL查询语句,以方便租户查询数据时进行模式映射和查询重写。

2 基于宽表的存储模式和数据定义

宽表的存储模式是一种共享数据库共享模式的数据存储架构。由于租户的数据存储在一张宽表中,所以数据表的数目不会随租户数量的变化而变化,也不会发生膨胀,节省了数据库的存储空间。所以基于宽表的存储模式是一种有效解决多租户数据存储问题的模式。

2.1 多租户架构

SaaS区别于传统软件的重要差别就是多租户的模式,多租户架构是SaaS应用的基本特性,多个租户共享一个实例,租户的数据既是隔离的也是共享的[9]。物理层面上,租户的数据共同存储在同一个数据模式下,逻辑层面上,通过租户特有的标识对其进行区别,实现数据的隔离。

图 1 多租户架构
Fig.1 Multi-tenancy Infrastructure

图1描述了宽表模式下的多租户架构,包含4个层次。最底层是所有租户使用的业务数据以及元数据,这些数据以宽表的方式存储在数据库中。紧邻底层的是模式映射和查询重写技术层,相当于一个中间件,以实现逻辑视图与物理存储结构的透明转换[10]。顶部两层是SaaS应用和租户应用,多个租户应用可以宿主于一个SaaS应用。

2.2 基于宽表的存储模式

Salesforce使用的存储模式是宽表。宽表的主要数据结构是由租户标识Tenantid和属于租户的某表的标识TableName,以及N列的数据列组成,数据列的类型使用可以灵活转换为其他类型的变长字符串类型。

宽表是整行存储数据,不需要做大量的连接操作,也符合大部分人的存储习惯,这是它最大的优势。但是可能会造成大量的空值,占用存储空间。可以通过对宽表进行改进,形成多宽表的存储方式,减少空值的出现。

多宽表的数据存储模式是将单个的宽表用不同列的多表代替来存储业务数据,通过元数据对业务数据进行描述,元数据表保存了租户数据模式与实际物理存储位置之间的映射关系。

2.3 基于多宽表的数据结构定义

图2描述了多宽表存储模式下的数据结构定义。其中包含两种类型的表:一种为元数据表MetaDataFields和MetaTable,另一种为数据表DefSQLTable和一系列的宽表DatA.

图2 多宽表数据结构定义
Fig.2 Multiple universal table data structure definition

(1)DefSQLTable表用来存储租户逻辑私有表的SQL定义,逻辑私有表也就是租户视图层的数据模式,该定义中包含了租户视图层与数据库层的映射关系。查询重写时根据租户查询请求判断所请求的SQL定义是否存在,若存在则从该表中获取对应的SQL定义,若不存在则通过访问元数据得到相应的SQL定义并存储在该表中。

(2)MetaTable表用来存储一系列Data宽表的基本信息,包括宽表的表名和列数等信息,当租户需要选择宽表进行存储时,该信息作为租户选择宽表进行存储的依据。

(3)MetaDataFields表用来存储Data宽表的信息以及其中属性的各种信息。租户标识TenantId、租户逻辑私有表标识TableName以及宽表所属列名fieldName联合作为主键,通过RealTableName可以映射出租户业务数据fieldName实际物理存储位置,而RealFieldName可以映射Data宽表中fieldName的真正含义。fieldType、fieldLength、NullField分别表示fieldName的属性:类型、长度、是否为空。

(4)Data1, Data2, Data x表示列数不同的宽表,宽表的列数呈递增趋势分布。租户标识TenantId和租户逻辑私有表标识TableName联合作为主键,对租户的业务数据进行存储,它们的最大列数分别为valueMax,columnMax,rowMax.

3 多宽表模式下查询重写方法

多宽表的数据存储模式是租户的业务数据以多个宽表的形式存储在数据库中。在该模式下的查询重写,是指用户发起的逻辑SQL查询到实际作用于数据库的物理SQL查询的转换,其中涉及到元数据的访问和SQL重写。在租户对数据进行查询时,租户的数据模式与实际存储模式不同,因此需要转换,对SQL语句重写,使逻辑SQL语句可以透明转换为物理SQL语句。

在图2数据定义的前提下,对数据的SQL查询进行重写。方法有两种,一种是动态SQL重写,另一种是视图定义SQL重写。

动态SQL重写,要先进行复杂的SQL分析,因为需要对SQL语句的每一项进行解析,重写过程很复杂。例如执行SQL语句select sold from Student where sno=’1’,首先需要找到Student所在的宽表,其次找到sold对应的宽表的列,最后才能根据sno=’1’进行查询。如果查询的列为多项,则在重写过程中需要动态地获得查询的每一项,并且找到其映射关系。但是对于简单的查询语句,例如select * from Student,只需找到Student所在的宽表,根据租户标识以及私有表名Student查询即可得到结果。

视图定义SQL重写,重写过程不必对查询项和涉及的表一一进行解析、映射,简化了重写过程。当在对租户信息进行查询时,先对元数据进行访问,获得租户私有表的SQL定义,将其存储在DefSQLTable中;接着对用户发起的SQL查询语句进行重写;最后通过物理SQL查询数据进而取得查询结果。

私有表SQL定义的生成流程图如图3所示。首先输入要进行SQL定义的租户标识和租户私有表名称;其次从元数据表获得该租户该私有表的元数据映射关系;然后通过字符串拼接得到SQL定义;最后将其保存在表中。在该存储模式下,元数据只能通过私有表SQL定义过程进行访问,有效保护了租户业务数据的元数据。

图3 私有表SQL定义生成流程图
Fig.3 Flow chart of private table SQL definition generation

图4 查询重写流程图
Fig.4 Query rewrite flow chart

查询重写的流程图如图4所示。首先输入发起查询操作的租户标识和SQL语句;其次对SQL语句分解、解析,获得解析所得的表;然后从DefSQLTable表中取出该表的定义,替换SQL语句中涉及的表;最后得到直接作用于数据库的SQL查询语句。

视图定义SQL重写,避免了复杂的SQL分析,降低了模式映射难度,通过减少SQL重写时间消耗,整体上提高了查询效率。

4 实验研究

多宽表数据存储模式实验主要针对存储空间的利用率进行分析,将其与宽表模式进行比较,并对查询重写过程的可行性进行验证。

4.1 存储空间利用率分析

模式空是宽表数据存储模式空值大量存在的主要原因,而在多宽表数据存储模式下,不同租户可以根据自己数据模式的列数,选择最为接近的宽表进行存储,可以大大减少模式空值的产生,提高存储空间的利用率。

假设要存储N个租户数据存储模式,其中模式i具有p行q列。

结果表明,多宽表的存储模式有效减少了空值的存在,提高了存储空间的利用率。

4.2 查询重写实验

查询重写实验,数据库选择使用MySQL Server 5.5,运行环境为Eclipse 3.7.2.

实验数据实例如图5所示。Coursetenanlid=1表示Course表中租户1的数据,表的结构为(CNo,Cname,CGrade),主键为CNo;NativePlaceTenantild=2表示NativePlace表中租户2的数据,表的结构为(Nno, NName, NPlace),主键为Nno.在多宽表的存储模式中,这两张表结构是某租户的数据模式,而真正的数据是共同存储在Data表中。

若租户进行如下SQL查询:select CGrade from Course where cno='1' .首先对该SQL语句进行分解解析,看是否为简单SQL语句,判断为否,得到表Course.然后对SQL定义表进行查询,看是否存在Course表的SQL定义。如果存在,则进行替换形成作用于数据库的SQL查询语句;如果不存在,则使用SQL定义的方法对Course表进行定义并存储后,再取出SQL定义,形成新的SQL查询语句。通过以上步骤,获得可以作用于实际数据库的SQL查询语句:select CGrade from (select value1 as CNo,value2 as CName,value3 as CGrade from data1 where TenantId=‘1’ and TableName=‘Course’) as a where cno=‘1’.通过程序访问数据库可得到结果为2.

图5 实验数据实例
Fig.5 Experimental data example

若租户进行如下SQL查询:select * from CoursE.首先对该SQL语句进行分解解析,看是否为简单SQL语句,判断为是。通过查询元数据表得到Course所在宽表,然后重写SQL语句为select * from data1 where TenantId=‘1’ and TableName=‘Course’,最后执行该语句所得结果为:1 yuwen 2. 对于这样的简单SQL语句,使用动态SQL重写方法要更为简单,不必再访问SQL定义表,简化了重写过程,节约了查询时间。

5 结 论

讨论了基于宽表的多租户数据存储模式,及该模式下的数据查询重写过程。在分析多租户宽表存储模式的特点和存在的缺陷后,将其改进为基于多宽表的数据存储模式,通过实验验证减少了数据模式空值,提高了存储空间利用率。并提出在多宽表的数据存储模式下,采用动态SQL重写和视图定义SQL重写两种方法对租户发起的SQL查询进行重写,使之成为可以直接作用于实际数据库的SQL语句。但对数据的增加,删除,修改等其他操作,还需要进一步研究多宽表数据存储模式,提出新的SQL重写过程。

猜你喜欢
存储空间租户视图
基于多种群协同进化算法的数据并行聚类算法
多租户数据隔离及加密研究
苹果订阅捆绑服务Apple One正式上线
基于多租户隔离的云安全建设
用好Windows 10保留的存储空间
视图
一种新型高效的多租户共享数据模型
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
基于MVC模式的多租户portlet应用研究*