从项目开发到云端架构 5
2.2.3 多租户系统
多租户是一个符合SaaS模式的 Web 交付解决方案,通过在服务提供者环境中运行的单个软件实例服务于多个组织,为任何规模的企业提供业务价值。基于多租户的应用和普通web应用有如下差别:
多租户的架构
具备某种程度的自助注册功能。
具备订阅/记账机制。
能够有效地扩展。
监视、配置和管理应用程序和租户。
支持惟一的用户标识和身份验证。
支持对每个租户进行某种程度的自定义。
这里只对多租户的架构特点进行阐述,其他的请自行参看相关资料。通常,应用程序支持多个用户,但是前提是它认为所有用户都来自同一个组织。这种模型适用于未出现 SaaS 的时代,组织会购买一个软件应用程序供自己的成员使用。但是在 SaaS 和云的世界中,许多组织都将使用同一个应用程序;他们必须能够允许自己的用户访问应用程序,但是应用程序必须只允许每个组织自己的成员访问其组织的数据。
能够让多个组织(SaaS 中的术语称为租户)共存于相同的应用程序,同时不会破坏这些组织的数据的安全性,具备这种能力的应用程序就可以称之为多租户应用程序。
多租户可以分为几个不同的类别(如列表下方的图所示):
云中的简单虚拟化,其中只对硬件进行共享。这种模型根本算不上是真正的多租户,但是在云环境中,它经常与虚拟化服务器配合使用,并被认为是一种多租户形式。在实际应用中,这种模型无法满足需求,并且仅仅比使用专用硬件的旧的 ASP 模型稍微好用一些
共享应用程序,对每个租户使用不同的数据库。
共享应用程序和数据库(效率最高,真正的多租户)。应用程序充分地共享数据库和应用程序的业务逻辑。实现这种模型非常的困难,因为需要修改数据库模式,向每个表和视图添加一个租户标识符,以及重写每一个 SQL 访问,向过滤器添加租户过滤条件。如果代码中任何必要的部分缺少这一逻辑,那么都将损害应用程序的数据安全性。
图 22-09 软件部署图
多租户就是说多个租户共用一个实例,租户的数据既有隔离又有共享,说到底就是如何解决数据存储的问题。现在多租户系统在数据存储上存在三种主要的方案:
方案一:独立数据库,这是第一种方案,即一个Tenant一个Database(见图3-14),这种方案的用户数据隔离级别最高,安全性最好,但成本也高。
优点:为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复数据比较简单。
缺点:增大了数据库的安装数量,随之带来维护成本和购置成本的增加。这种方案与传统的一个客户、一套数据、一套部署类似,差别只在于软件统一部署在运营商那里。
如果面对的是银行、医院等需要非常高数据隔离级别的租户,可以选择这种模式。
方案二:共享数据库,隔离数据架构.即多个或所有租户共享Database,但一个租户一个Schema。
优点:为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可以支持更多的租户数量。
缺点:如果出现故障,数据恢复比较困难,因为恢复数据库将牵扯到其他租户的数据;如果需要跨租户统计数据,存在一定困难。
方案三:共享数据库,共享数据架构.即租户共享同一个Database、同一个Schema,但在表中通过TenantID区分租户的数据。这是共享程度最高、隔离级别最低的模式。
优点:三种方案比较,第三种方案的维护和购置成本最低,允许每个数据库支持的租户数量最多。
缺点:隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。如果希望以最少的服务器为最多的租户提供服务,并且租户接受以牺牲隔离级别换取降低成本,这种方案最适合。
组件 | 共享的资源 | 隔离方法 | 可配置方法 | |
持久化 / 数据模型 | 数据库服务器JDBC/SDO | 数据源,连接池 数据库账户 数据库/模式/表/缓冲区池等 | 存储隔离:专用的表/模式或数据库,或共享的表/模式 访问隔离:通过专用数据源和连接实现 DBMS 级访问控制,或通过筛选器实现应用程序级访问控制 | 数据库/表/模式 固定的保留字段 扩展的子表 XML 扩展字段 |
文件和 I/O | 目录 文件 | 专用的目录/文件 共享的文件,使用与租户相关的筛选器 | 目录结构或文件格式 | |
目录服务器 | 目录树 模式 | 每个租户专用的子树 共享的树,使用与租户相关的筛选器 | 目录树结构和模式定义 | |
业务逻辑 | 身份验证/授权 | 组织结构/特权存储库 登录/授权模块 | 根据持久化数据模型(LDAP、数据库等)隔离的存储库 扩展的感知租户的用户注册插件 | 组织结构、角色、特权及其映射关系 |
全局 Java 对象 | 静态变量 单实例类的变量 | 每个租户专用的(静态)变量,使用容器对象 | N/A | |
远程访问,套接字http/rmi/jini /corba/web service | 远程服务 URI、端口号、用户名、密码等连接参数 | 专用的远程服务 共享的远程服务,把租户信息传播给远程服务 | 连接参数 | |
日志 | 日志文件位置、内容、格式和配置 | 专用的日志文件 共享的日志文件,使用与租户相关的筛选器 | 日志格式和设置参数 | |
缓存 | 缓存容器 | 专用的缓存容器 共享的缓存容器,使用与租户相关的筛选器 | 缓存设置参数 | |
UI | JSP | 应用程序范围变量(applicationContext ,tag、usebean等) 声明变量,徽标、样式、布局等 | 使用与租户相关的筛选器选择应用程序范围的变量 专用的声明变量 | CSS、布局、图片等 |
servlet | 单线程 servlet servletContext | 单线程 servlet 使用专用的servlet 使用与租户相关的筛选器选择 servletContext 变量 | N/A | |
过程 / 工作流 | BPEL 过程模板 | 模板级属性、活动、链接条件等 | 专用的过程模板 共享的模板,在过程实例中使用与租户相关的筛选器 | 过程模板的骨架 |
人工任务 | 动作、任务 UI 等 | 扩展动作,支持根据启动者的租户信息隔离人员选择机制 | UI 元素和共享任务的设置 人员选择规则 | |
业务规则 | 规则 | 专用的业务规则 共享的业务规则,使用与租户相关的筛选器作为规则参数 | 业务规则的规则值设置 |
表22-1. 多租户资源共享、隔离和定制机制概述
来源:timeson http://timeson.iteye.com/blog
矽控电子®分别获“科技型中小企业”、“江苏省民营科技企业”、“创新型中小企业”认定,核心团队拥有十余年的硬件正向研发,生产制程,测试手法,品质控制经验。尤其擅长嵌入式ARM平台的人工智能与工控物联网产品,以及瑞芯微(Rockchip)、海思、NXP、新唐等平台的机器视觉类AIoT模组开发,为您的产品从创意到落地、批量市场化助力。
公司可提供从硬件设计(原理开发及PCB Layout),Linux驱动开发,PCB制板,SMT及接插件焊接,产品测试,产品老化全流程外包服务,收费合理,品质可靠。
定制开发找矽控,品质可靠省费用
垂询电话:0510-83488567-1 业务邮箱:wxdianzi#foxmail.com (#更换为@)