探索中国CIO人才现状 | 第四季调研报告
SaaS数据层方案比较研究
2014-03-04  作者:e--works 

  随着网络技术的发展和应用软件的成熟,软件即服务(Software-as-a-service。简称SaaS)已经成为一种新型的软件运营模式。针对SaaS运营模式的特点,在SaaS系统开发时需要考虑多租户、共享、安全性等方面的需求。其中,系统数据层的共享和安全性是影响SaaS推广的关键因素。在传统的信息系统中,只需要满足独立客户的特定数据需求,所以系统可以针对不同客户的需求采用不同的数据库方案,以保证数据正确性、高效性和安全性。在SaaS应用环境中,需要面对来自不同租户的海量数据,面临着如何来保证租户数据隔离,满足租户不同的数据结构自定义等更为复杂的问题。因此,需要思考如何创建合理的数据层架构,使其在多租户的条件下既能保证租户之间的数据隔离,又可以使租户之间最大程度的共享数据结构,以实现SaaS系统高效、安全的运行。


  1数据层架构方案


  由于SaaS应用的实现技术以及市场环境的变化,SaaS系统的数据层架构在隔离的程度上会有很大差异。共享数据和隔离数据之间并不是完全对立的,数据层架构在完全隔离到完全共享的两个极端之间具有一定的连续性。对于服务于多个租户的SaaS应用而言,应该能够以较低的成本保证每个租户都可以正确的使用自己的数据。下面将针对如何处理租户之间的数据隔离和数据共享问题对不同的数据层设计方案进行分析与比较。


  1.1独立数据库


  独立数据库方案,即每个客户拥有一个独立的数据库,而多个数据库可以允许在一个或多个数据库服务器中,如图1所示。在彼此独立的数据库中存储客户数据是数据隔离最简单的方法。这种方案的数据隔离级别最高,安全性最好,但是成本也最高。


  为不同客户提供独立的数据库有助于简化应用中数据模型的扩展,以满足不同客户的个性需求,而且在发生故障后,数据恢复处理也相对简单。但是这种方法会增加设备维护和客户数据备份的成本,硬件成本也较高。因为每个数据库服务器上能够支持的数据库数量有限,独立数据库的方案使得客户彼此之间不能进行资源共享,这便限制了每个数据库服务器可以容纳的客户数量。这种方案仅适用于那些愿意支付高额代价来换取更高安全性和可定制性的客户。考虑到SaaS产品的成本和市场的竞争,由于独立数据库的方案可以支撑的租户数有限,所以这种方案难以充分发挥SaaS应用的优势。


  1.2独立数据架构


  在独立数据架构方案中,租户共享数据库,但是每个租户拥有自己独立的架构(Schema)。每个租户拥有自己专门的表、视图等数据对象集合,形成租户自己的独立架构(如图2)。


  当租户最初成为这类服务的客户时,相关配置子系统会为客户创建属于该客户自己的表集,并将其与客户自己的架构相关联。例如,在Oracle中Schema一般是与user对应的,创建一个Schema一般通过创建客户的方法实现,默认情况下客户名即为Schema名,如下:


  createuserTenantAidentifiedbyPwddefaulttablespaceedu-tbspacetemporarytablespaceedu-tempprofileedu-user;


  grantconnection,resourcetoTenantA…;


  由此,数据库生成名为TenantA的Schama,且能使用SchemaName.TableName访问该客户的数据集。


  与独立数据库方案相比,独立架构的设计方案也相对容易实施。这种方法为要求高安全性的客户提供了一定程度的逻辑数据隔离,但是由于客户之间是共享数据库的,所以并没有实现客户数据之间的完全隔离。这种方案相比独立数据库方案每个数据库服务器能够支持更多的客户数量,可以节约服务器资源和硬件成本。


  1.3共享数据库共享架构


  在共享数据库共享架构方案中,所有租户共享同一个数据库,同一个Schema,只用租户的编号等标识来区分租户的数据,这种方式数据隔离程度最低,共享程度最高。


  共享数据库共享架构方案允许每个数据库服务器能够支持的客户数量最多,因此其硬件成本最低。不过由于多个客户共享数据表等结构,数据安全控制方面需要投入更多的精力,以确保客户能够获得自己的正确数据并在发生故障或遭到攻击情况下也不会存取其他客户的数据(见图3)。


  2数据层方案的选择


  在上述三种方案中,每种设计方案都有其各自的优点和缺点,其应用的场景和范围也是不一样的。在选取数据层架构方案时可以从以下几方面进行考虑:


  a.服务对象因素。构建SaaS应用系统时,预计要服务的客户数量、性质和需求都会影响到数据层结构的设计方案。如果预计系统为较少特殊客户服务,那么就应该选取独立数据库的方案。如果需要服务的客户数较多,独立数据库方案的代价则是难以承受的,这时便需要更多的考虑使用共享方案,预计所服务的客户数量越多越应该倾向于使用共享方案。


  预计客户的数据存储要求也会很大程度上影响数据库方案的选择。如果预计到大部分客户都会存储大量的数据,那么隔离式的方法就会更适用,因为数据存储需求本身就需要独立数据库模型。反之如果预计将为大量客户服务而每个客户存取的数据量较小,那么共享方案则是更好的选择。


  b.经济因素。信息系统开发通常会受成本与市场因素的制约,并会影响到方案的选择。通常,数据层的共享架构比独立架构的体系结构也更加复杂,因而初期投入成本会较高。但从长期来看,共享架构方案的总拥有成本较低。如果系统开发初期无法承担共享架构的开发成本或开发时间,那么独立架构方案就是更好的选择。


  c.技术风险因素。目前,单实例、多租户体系结构还没有非常成熟的设计模式,使得项目风险有所增加。相对于共享方案,独立方案与传统应用开发较为相似,有助于技术人员充分利用一些传统软件的开发经验和技术,开发周期和费用的预算较易控制。


  3结论


  作为多租户体系的信息服务模式,SaaS应用不再是为单个客户服务,而是同时为任何可能使用系统的客户提供服务。因此,SaaS应用在进行数据层设计时应该在数据独立性和共享性之问做出权衡。采用独立数据库或独立架构的设计方案开发风险低、开发成本较小,更容易满足特定客户的需求。但这类方案运行成本较高,当客户数量逐渐增加时,系统扩展也会变得越来越困难。


  采用共享架构的数据模型来处理客户数据层的需求,虽然会增加系统的复杂度和开发成本,但因为数据层设计是所有租户共享的,所以可以较好地实现水平扩展来提升服务质量和服务能力,这符合SaaS结构的设计初衷,从长期来看具有更高的经济效益。