文档章节

SAAS之Multi-Tenancy解析

6pker
 6pker
发布于 2016/07/11 17:06
字数 1859
阅读 191
收藏 1
点赞 0
评论 2

最近做的项目涉及到比较深入的一部分,就是定义客户关系,在我们的商讨中,我们决定,采用服务商的模式,就是我们是基础服务商,由客户组合服务,向客户提供基于云端的服务支持!这就自然引出了以下概念:

 

 

saas百科: 

        SaaS是Software-as-a-Service(软件即服务)的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式。它与“on-demand software”(按需软件),the application service provider(ASP,应用服务提供商),hosted software(托管软件)所具有相似的含义。它是一种通过Internet提供软件的模式,厂商将应用软件统一部署在自己的服务器上,客户可以根据自己实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得厂商提供的服务。用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,软件厂商在向客户提供互联网应用的同时,也提供软件的离线操作和本地数据存储,让用户随时随地都可以使用其定购的软件和服务。对于许多小型企业来说,SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的需要。

 

 

那么,问题来了,怎么针对不同的用户提供一种高效,安全的基础数据服务呢?本着我们想到的问题,肯定有人遇到过的原则,我们搜索到了一个解决方案:

 

多租户(multi-tenancy)

  意指在其中一个应用程序的运行实例同时服务多个客户端(租户)体系结构。这是非常常见的SaaS解决方案。

 

关于多租户的实现,大概有三种:“N个租户N个数据库”,“N个租户1个数据库N个Schema”,“N个租租户1个数据库1个Schema”


1.分离数据库(Separate Databases)

“N个租户N个数据库”

每个租户的数据保存在一个物理上独立的数据库实例。JDBC连接会特别指出每个数据库。一个通用的应用程序的方法是定义一个JDBC连接池,当前登录的用户关联的"租客标识符"来选择JDBC连接.
好处:可以轻松地扩展应用程序的数据模型(稍后讨论)以满足住户的个别需求,而且在失败时从备份恢复租客的数据是一个相对简单的过程。
坏处:导致更高的设备成本,以及维护和备份租客数据方面的成本。
相对较高的硬件,维护成本使它适合于愿意额外支付增加的安全性和可定制性的客户。例如,在银行或医疗记录管理等领域的客户往往有很强的数据隔离的要求,甚至不得不不为每个租客提供具有其自己单独的数据库。

 

2.共享数据库,彼此独立的Schema(Shared Database, Separate Schemas)

“N个租户1个数据库N个Schema”
每个租客有它自己的表,可以理解为为每个租客分表.每个租客在共享的数据库中具有其自己单独的一组表.当客户第一次订阅该服务时,资源调配子系统为租客创建一组离散的表,并将它与租客的Schema关联。您可以使用 SQL 创建命令创建一个架构,并授权用户帐户来访问它。应用程序然后可以创建和访问表内的租户的架构使用SchemaName.TableName公约:
CREATE TABLE ContosoSchema.Resumes (EmployeeID int identity primary key,Resume nvarchar(MAX));
创建Schema后,它是作为租客帐户的默认Schema设置:
ALTER USER Contoso WITH DEFAULT_SCHEMA = ContosoSchema
租客帐户可以访问其默认架构内的表,只是通过指定TableName,而不是使用SchemaName.TableName.这种方式,一组 SQL 语句可以给所有的租客使用来访问其自己的数据,例如:SELECT * FROM Resumes
 

优点:

        这样是容易实现的一种方法,租户可以与单独的数据库方法一样扩展数据模型。(创建的表但一旦不符合需求,租客可添加,修改表)

        这种方法提供了中等程度的逻辑数据隔离安全,虽然比不上作为一个完全独立的数据库,但却可以在每个数据库服务器支持大量的租户。

缺点:

        数据出现故障时是难以恢复某租客。如果每个租客有其自己的数据库,则还原单个租户的数据意味着简单地从最近的备份还原数据库。而这个方法则意味着用备份的数据还原整个数据库,而不管在同一数据库上的每个租客的数据是否遭到损失。因此,要还原单个客户的数据,数据库管理员可能需要将数据库还原到一个临时的服务器,然后将客户的表导入到生产服务器上 — — 一个复杂和可能很耗时的任务。


 

3.共享数据库,共享Schema(Shared Database, Shared Schema)

“N个租租户1个数据库1个Schema”
这个方法就是最简单的一种了.每个表使用租客的一个标识符.所有租户都共享一组相同的表,一个租客 标识符ID 将每个租客与它拥有的行相关联.

优点:

        最低硬件和备份成本,因为它允许每个数据库服务器服务更多的租户。然而,因为多个租户共享相同的数据库表,这种方法可能会导致安全问题,你必须努力确保租户始终不能访问其他租户的数据,即使在发生意外。

缺点:

        对于租客还原数据的过程是类似于共享架构方法,要重新插入临时数据库单个行到生产数据库中。如果有非常大量的受影响的表中的行,这可能导致性能明显降低数据库服务的所有住户。共享架构方法能够用少量的服务器,服务一大批租户和潜在客户,如果他们愿意用更低的费用获取安全性.

每次CRUD都需要使用对应租客 标识符ID.SQL变得复杂.

 

总结:

        SaaS的概念在很久以前,是我们通过部署N个程序来完成的为多个用户服务,但是在咱们程序的维护上,增加了太多的成本,本着硬件能解决的问题,软件都能解决,有了这个概念,实际这不是全新的概念,而是为了解决一组问题而提出的解决方案!今天咱们充足了弹药,在下一篇博客,咱们一起将它实现吧!

本文转载自:

共有 人打赏支持
6pker
粉丝 51
博文 98
码字总数 59361
作品 0
浦东
程序员
加载中

评论(2)

6pker
6pker

引用来自“zzuqiang”的评论

期待更新,我也在学习和了解SAAS
亲,我也是转载的
zzuqiang
zzuqiang
期待更新,我也在学习和了解SAAS
Scale out Database Arch

You can easily scale out Azure SQL databases using the Elastic Database tools. These tools and features let you use the virtually unlimited database resources of Azure SQL Datab......

MtrS ⋅ 2016/11/16 ⋅ 0

#技术分享# -- 云计算下的数据隔离

IT软件服务商所提供的传统企业软件系统大多基于Multi-Instance(多实例)架构,即对于每一个客户组织,都有一个单独的软件系统实例 为其服务;而搭建于云计算平台的软件系统则广泛采用了Mul...

边缘行者 ⋅ 2012/12/19 ⋅ 0

SaaS架构成熟度模型

【IT168 技术文章】 Dharmesh Shah最近撰写了有关“软件作为服务”即SaaS的架构成熟度模型的文章。之前Gianpaolo Carraro曾提出可伸缩性、多租户(multi-tenancy)与通过配置进行定制(customiz...

IT168网站 ⋅ 2009/06/25 ⋅ 0

Mezzanine 1.3 和 Cartridge 0.7 发布!

项目名称: - 全面支持Django 1.5 - 改进了Lettuce测试 - 改进支持django-compressor - 最新前端库(jQuery/ jQuery UI /Boostrap) - 所有以前的版本均在GitHub/Bitbucket标记 - 在安装过程...

renwofei423 ⋅ 2013/01/08 ⋅ 2

Bonita BPM 5.6开源版与三种付费版在功能上的区别

http://www.bonitabpm.org/index.php/article/show/articleid-15 从BOS 5.6开始,Bonita BPM的SP版本又细分为Teamwork版, Efficiency版和Performance版,下表是各版本里面所包含的功能的比较...

DongZhang ⋅ 2011/12/14 ⋅ 0

.NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

阅读目录 1.RavenDB概述与特性 2.RavenDB安装 3.C#开发初体验 4.RavenDB资源 不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了。...

老朱第八 ⋅ 2017/10/30 ⋅ 0

WSO2 Carbon Kernel 4.3.0 Alpha 发布

WSO2 Carbon Kernel 4.3.0 Alpha 发布,此版本现已提供下载: wso2carbon-4.3.0-SNAPSHOT.zip 更新内容: 支持可插式 log provider,简化日志记录 升级了 Hazelcast, Log4j, BouncyCastle 版...

oschina ⋅ 2014/10/02 ⋅ 0

Hibernate Search 5.2.0.Final 发布

Hibernate Search 5.2.0.Final 发布了,可通过 Sourceforge 下载. 该版本最值得关注的就是引入对 multi-tenancy 的集成支持,相当于你可以把索引存放在不同的设备上。其他方面包括性能、效率...

红薯 ⋅ 2015/05/07 ⋅ 1

Apache Syncope 2.0.0-M1 发布

Apache Syncope 2.0.0-M1 发布,主要更新以下几方面: Any Objects New Authorization Model Multi-tenancy CLI Work In Progress: New Admin Console Work In Progress: End-user Work In P......

oschina ⋅ 2015/12/27 ⋅ 0

Apache Qpid Dispatch 0.8.0 发布,消息队列路由

Apache Qpid Dispatch 0.8.0 发布了。Qpid Dispatch 是高级消息队列 Protocol 1.0 的路由器。 更新内容: DISPATCH-103 - Websocket Listeners DISPATCH-113 - expose NodeTracker::lasttopo......

达尔文 ⋅ 2017/05/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 22分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 43分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 53分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 今天 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 今天 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 今天 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部