2014年1月19日星期日

Cloud_019:多租户技术介绍 (摘录+整理)

多租户技术(multi-tenancy)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。
多租户技术也是云计算的一个重要特性,在IaaS层(虚拟化)、PaaS层(应用服务器、Java虚拟机)、SaaS层(数据库、业务逻辑、工作流程、用户界面)都有体现。

下图是Gartner的多租户技术堆栈:

(1)不共享资源。每个租户都有自己一套完整的应用程序、中间件、操作系统和基础架构(硬件)。每个租户与其他租户完全隔离,惟一的例外是它能够在相同的物理数据中心中运行。
(2)共享硬件。租户开始共享一个数据中心的基础架构。例如,租户可以共享数据中心中的服务器(比如,Intel、Power)、存储(SONAS、NetApp)和网络(Juniper、Cisco)。
(3)共享操作系统。租户现在共享基础架构和操作系统。KVM 与 VMware 之类的管理程序通常用于硬件虚拟化,以便实现在硬件上运行多个操作系统。租户之间仍然保持相当程度的隔离,因为每个租户可以拥有各自版本的应用服务器、数据库服务器和及应用程序。这个级别的共享还叫做基础架构即服务 (IaaS)。
(4)共享中间件。租户现在开始共享一系列运行在共享的操作系统和基础架构之上的中间件服务;例如,安全服务、门户、数据库服务、监测服务,等等。各种应用程序都能够构建在这些共享的中间件组件之上。这一级别的共享还叫做平台即服务(PaaS)。
(5)共享应用程序。租户现在与其他租户共享相同的应用程序。基于这种共享,租户之间还可以共享相同的中间件,包括用于实现该应用程序的版本。虽然租户之间共享相同的底层资源,但他们彼此之间仍然是独立的。一个租户看不到其他租户的资产(比如存储在数据库服务器或者文件服务器中的数据)。这一级别的共享还叫做软件即服务(SaaS)。

通常,多租户所指的级别越高,创建新租户时所需做的工作越少,因为已经共享了更多的底层堆栈。
对于任何计划向越来越多租户提供的业务来说,在扩大规模时不需要增加大量技术和业务资源,这是首要考虑的问题。
对于厂商和租户来说,共享相同的代码库能够缩短实现价值的时间,并能使新的创意在几周之内(而不是几月或几年之内)完成部署。

可以看出多租户技术堆栈包括四层:基础架构层、数据中心层、应用平台层、应用程序层。
租户间的共享资源越多,资源资源利用率也越高,单位资源成本越低,租户间的隔离性越差。

各云计算厂商根据自己的技术优势,在单位资源成本和租户间的隔离性之间找到了各自的最佳平衡点。
可以看出,各大云计算的多租户解决方案基本集中在“Share Hardware”和"Share Everything"这两个级别。

以微软的Windows Azure和SalesForce的force.com为例,前者是“Share Hardware”,后者是"Share Everything"。
1. 基础架构层
即通常所说的IaaS层,为租户提供虚拟化、服务级别协议(SLA)、安全接入的身份管理、容错、灾难恢复、按需使用与计费关键特性。

2. 数据中心层
数据层有三种多租户架构:
(1)独立数据库
一个租户独享一个数据库实例,它提供了最强的分离度,租户的数据彼此物理不可见,备份与恢复都很灵活。
(2)共享数据库、独立 Schema
每个租户关联到同一个数据库的不同的Schema,租户间数据彼此逻辑不可见,上层应用程序的实现和独立数据库一样简单,但备份恢复稍显复杂。
(3)共享数据库、共享 Schema、共享数据表
租户数据在数据表级别实现共享,它提供了最低的成本,但引入了额外的编程复杂性(程序的数据访问需要用 tenantId 来区分不同租户),备份与恢复也更复杂。


目前,Hibernate 和 EclipseLink 已提供了全部或部分的多租户数据层的解决方案。

3. 应用平台层
传统JavaEE Web 应用是多用户,应用本身的实例是一个,多个应用运行在应用服务器上,一个JVM(不考虑集群的情况下),见下图:

其特点如下:
(1)Web 应用彼此的运行时内存空间不是独立的。
(2)对加载的类无法完全彼此分开。
(3)当需要水平扩展时,可以做集群和负载平衡,但需要解决多个JVM之间Session复制问题。

而多租户则在同一个应用实例上做了复制,是多个应用实例(彼此内容相同),一个实例服务于一个租户。
可以想象,如果使用传统的JavaEE来解决对多租户场景,需要为每一个应用启动一个JVM,每个 JVM 彼此独立,消耗各自的资源。但是这样资源消耗太大,有些伤不起。

一家名叫Waratek的厂商提出了自己的解决方案,它提出了一个新概念:Java 虚拟容器(Java Virtual Container,JVC),见下图:
多个应用程序可以同时运行在单个的 JVM 上,每个应用有自己的 JVC。
关于JVC的具体特性自己去Google一下这家公司吧,不过尚不清楚这一技术会不会成为JVM的新标准。

除了要应用实例的隔离以外,为了支持多租户,应用平台层还需要提供如下特性:
(1)共享LDAP:对用户和组织信息进行管理。
(2)单点登录:允许租户登录一次,就可以访问其所有的系统,而不必在每个系统中都登录一次。
(3)共享企业服务总线:每个租户对应自己的消息队列,以及消息路由规则。
(4)租户特定报告:供全面的查询和报告功能,使得用户能够创建报告,并分析数据,制定出更好的商业决策。
(5)租户特定日志文件: 租户共享相同的中间件,所以需要着重考虑如何将各个租户的日志文件分开,让每个租户仅能访问由其自身执行所生成的日志消息。

4. 应用程序层
为了支持多租户,应用程序层需要提供如下特性:
(1)统一用户界面
(2)支持用户定制界面
当然,要做到这两点的前提是租户的需求要有共性,SalesForce的force.com就是面向特定领域(CRM)的特定客户群,这些客户的需求共性明显,因此force.com可以做到这两点。

参考文献:
1. http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/index.html
2. http://www.ibm.com/developerworks/cn/java/j-lo-mutiltenancy/index.html
3. http://www.docin.com/p-442836132.html
4. http://zh.wikipedia.org/wiki/%E5%A4%9A%E7%A7%9F%E6%88%B6%E6%8A%80%E8%A1%93
5. http://www.docin.com/p-503913757.html
6. http://www.ibm.com/developerworks/cn/cloud/library/cl-tenantconversion/
7. http://blog.sina.com.cn/s/blog_493a84550101332d.html

没有评论: