云计算的关键技术之大规模多租户技术
与传统的软件运行和维护模式相比,云计算要求硬件资源和软件资源能够更好地共享,具有良好的可伸缩性,任何一个企业用户都能够按照自己的需求对SaaS软件进行客户化配置而不影响其他用户的使用。多租户(Multi一Tenant)技术就是目前云计算环境中能够满足上述需求的关键技术。
多租户技术是一项云计算平台技术,该技术使得大量的租户能够共享同一堆栈的软、硬件资源,每个租户能够按需使用资源,能够对软件服务进行客户化配置,而且不影响其他租户的使用。这里,每一个租户代表一个企业,租户内部有多个用户,如图5·4所示。
在多租户作为一项平台技术时,需要考虑提供一层抽象层,将原来需要在应用中考虑的多租户技术问题,抽象到平台级别来支持,需要考虑的方面包括安全隔离、可定制性、异构服务质量、可扩展性,以及编程透明性等等。同时在支持各个方面时需要考虑到应用在各个层面(UI、业务逻辑、数据)可能涉及的各种资源。各个层面对应用中可能涉及的各种资源提供相应的平台级多租户技术的支持,如图5·4的参考架构所示,包括:
Ø 在持久化数据层面:包括的资源有数据库服务器,文件和IO,LDAP服务器等
Ø 在业务逻辑层面:包括身份认证/授权,全局对象,远程访问服务,EJB,缓存等;
Ø 在工作流层面:包括业务流程模版,人工任务,业务规则等;
Ø 在UI层面:包括JSP及Servelet中的全局状态以及CSS等需要定制的部分等。
IT人员经常会面临选择虚拟化技术还是多租户技术的问题。多租户与虚拟化的不同在于:虚拟化后的每个应用或者服务单独地存在一个虚拟机里,不同虚拟机之间实现了逻辑的隔离,一个虚拟机感知不到其他虚拟机;而多租户环境中的多个应用其实运行在同一个逻辑环境下,需要通过其他手段,比如应用或者服务本身的特殊设计,来保证多个用户之间的隔离。多租户技术也具有虚拟化技术的一部分好处,如可以简化管理、提高服务器使用率、节省开支等。从技术实现难度的角度来说,虚拟化已经比较成熟,并且得到了大量厂商的支持,而多租户技术还在发展阶段,不同厂商对多租户技术的定义和实现还有很多分歧。当然,多租户技术有其存在的必然性及应用场景。在面对大最用户使用同一类型应用时,如果每一个用户的应用都运行在单独的虚拟机上,可能需要成千上万台虚拟机,这样会占用大量的资源,而且有大量重复的部分,虚拟机的管理难度及性能开销也大大增加。在这种场景下,多租户技术作为一种相对经济的技术就有了用武之地。
目前普遍认为,采用多租户技术的SaaS应用需要具有两项基本特征:第一点是SaaS应用是基于Web的,能够服务于大量的租户并且可以非常容易地伸缩;第二点则在第一点的基础上要求SaaS平台提供附加的业务逻辑使得租户能够对SaaS平台本身进行扩展,从而满足更特定的需求。目前,多租户技术面临的技术难点包括数据隔离、客户化配置、架构扩展和性能定制。
数据隔离是指多个租户在使用同一个系统时,租户的业务数据是相互隔离存储的,不同租户的业务数据处理不会相互干扰。多租户技术需要实现安全、高效的数据隔离,从而保证租户数据安全及多租户平台的整体性能。对多租户的数据库管理有三种基本方式:第一种方式是给每一个租户创建单独的数据拭库,这样做的好处是租户间数据充分隔离,缺点是数据库管理的成本和开销比较大;第二种方式是将多个租户的数据保存在同一个数据库中,但是采用不同的Schema,这样在一定程度上减少了数据库的管理成本和开销,但是相应地影响了数据隔离的效果;第三种方式是将多个租户的数据保存在一个数据库中,采用相同的Schema,也就是说将数据保存在一个表或者一类具有相同Schema的表中,通过租户的标识码字段进行区别,这样的管理成本和开销最低,但是数据隔离的效果最差,需要大最的安全性检验来保障租户间的数据隔离。
客户化配置是指SaaS应用能够支持不同租户对SaaS应用的配置进行定制,比如界面显示风格的定制等。客户化配置的基本要求是一个租户的客户化操作不会影响到其他租户。这就要求多租户系统能够对同一个SaaS应用实例的不同租户的配置进行描述和存储,并且能够在租户登录SaaS应用时根据该租户的客户化配置为其呈现相应的SaaS应用。在传统的企业应用运行模式中,每个企业用户都拥有一个独立的应用实例,因此可以非常容易地存储和加载任何客户化配置。但在多租户场景下,成千上万的租户共享同一个应用实例。在现有的台技术中,比如J2EE,对应用配置的更改通常会对该平台中的所有用户产生影响。因此,如何支持不同租户对同一应用实例的独立客户化配置是多租户技术面临的一个基本挑战。
架构扩展是指多租户服务能够提供灵活的、具备高可伸缩性的基础架构,从而保证在不同负载下多租户平台的性能。在典型的多租户场景中,多租户平台需要支持大规模租户的同时访问,因此平台的可伸缩性至关重要。一个最简单的方法是在初始阶段就为多租户平台分配海量的资源,这些资源足以保证在负载达到峰值时的平台性能。然而,很多时候负载并不是处于峰值的,这个方法会造成巨大的计算资源和能源浪费,并且会大幅增加多租户平台提供商的运营成本。因而,多租户平台应该具有灵活可伸缩的基础架构,能够根据负载的变化按需伸缩。
性能定制是多租户技术面临的另一个挑战。对于同一个SaaS应用实例来说,不同的用户对性能的要求可能是不同的,比如某些客户希望通过支付更多的费用来获取更好的性能,而另一些客户则本着 "够用即可"的原则。在传统的软件运营模式中,由于每个客户拥有独立的资源堆栈,只需要简单地为付费多的用户配置更高级的资源就可以了,因此相对而言性能定制更容易一些。然而,同一个SaaS应用的不同租户共享的是同一套资源,如何为不同租户在这一套共享的资源上灵活地配置性能是多租户技术中的难点。