图片
1. 什么是多租户
多租户(Multi-Tenancy)是一种架构模型,实现如何在多用户环境下(此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性,使它们共享相同的系统资源,但又能够在逻辑上彼此独立。在多租户架构中,租户可以是企业、组织或个人,它们之间共享同一应用的实例,但其数据和配置是隔离的。那么重点就很浅显易懂了,多租户的重点就是同一套程序下实现多用户数据的隔离
2. 传统软件模式和SaaS(Software as a Service)模式对比
传统软件模式:
- 买卖关系: 传统软件模式是一种买断的交易模式,客户通过购买软件的许可证或使用权来获取软件的所有权,包括源码。
- 部署到企业内部: 在传统软件模式中,客户通常需要将软件部署在自己的服务器或计算机上,构建和维护一套独立的软件系统。
- 定制和维护: 客户拥有软件的源码,因此可以对软件进行定制和修改以满足特定需求。同时,客户需要负责软件的定期维护、更新和管理。
- 独立部署: 不同的企业之间通常各自部署独立的软件系统,软件的定制和运行环境可能因企业而异。
SaaS模式:
- 服务提供商: 在SaaS模式中,软件由服务提供商托管在云服务或自己的服务器上,客户通过订阅服务来使用软件,而不是购买软件的使用权。
- 统一部署: 所有客户共享同一套部署在服务提供商服务器上的软件实例。这种集中式部署使得软件的更新和维护更为方便。
- 按需付费: 客户按照实际使用的服务量或功能付费,通常以订阅的方式进行计费,而不需要一次性支付较高的许可费用。
- 基于WEB的软件: SaaS模式通常提供基于WEB的软件服务,用户可以通过浏览器或其他客户端访问,而不需要在本地安装软件。
- 无需定期维护与管理: 由服务提供商负责软件的维护、更新和管理,客户无需关心底层的技术细节,可以更专注于业务
图片
总的来说,传统软件模式注重客户对软件的购买和所有权,需要自行部署和维护;而SaaS模式则强调服务提供商通过云服务为客户提供方便、灵活的软件使用方式,降低了客户的部署和管理负担。选择使用哪种模式取决于企业的需求、预算和对定制化程度的要求。
在SaaS平台里需要使用共用的数据中心以单一系统架构与服务提供多数客户端相同甚至可定制化的服务,并且仍可以保障客户的数据正常使用。由此带来了新的挑战,就是如何对应用数据进行设计,以支持多租户,而这种设计的 思路,是要在数据的共享、安全隔离和性能间取得平衡
3. 多租户的数据库方案分析
目前基于多租户的数据库设计方案通常有如下三种:
- 独立数据库
- 共享数据库、独立 Schema
- 共享数据库、共享数据表
3.1. 独立数据库
在独立数据库方案中,每个租户拥有一个独立的数据库。每个数据库包含了相同的表结构,但是数据完全独立。这是一种高度隔离方案。
优点:
- 数据高度隔离,确保租户数据的完全独立性,有助于简化数据模型的扩展设计,满足不同租户的独特需求
- 易于管理和维护,每个租户有独立的数据库,如果出现故障,恢复数据比较简单
缺点:
- 需要大量的数据库实例,增加了成本和维护复杂度
这种方案与传统的一个客户、一套数据、一套部署类似,差别只在于软件统一部署在运营商那里。由此可见此方案用户数据隔离级别最高,安全性最好,但是成本较高
3.2. 共享数据库、独立 Schema(模式)
oracle数据库:在oracle中一个数据库可以具有多个用户,那么一个用户一般对应一个Schema,表都是建立在Schema中的,(可以简单的理解:在oracle中一个用户一套数据库表)
图片
在 MySQL 中,"Schema" 和 "Database" 可以认为是相同的概念。在 SQL 语句中,"CREATE DATABASE" 和 "CREATE SCHEMA" 基本上是等效的。所以,当你创建一个数据库时,你也在事实上创建了一个模式。模式是一个逻辑上的容器,用于组织和管理数据库对象,如表、视图、存储过程等。在 MySQL 中,模式和数据库可以互换使用。
优点:
- 提供较高的数据隔离,每个租户的表存在于独立的schema中,每个数据库可支持更多的租户数量
- 相对容易管理和维护,数据库结构相对简单
缺点:
- 需要动态创建和管理schema,增加了复杂性,如果出现故障,数据恢复比较困难,因为恢复数据库将牵涉到其他租户的数据; 如果需要跨租户统计数据,存在一定困难
- 一些数据库系统对schema的支持不够完善
共享数据库、独立 Schema方案其实就是假如我在服务器上安装了一个mysql服务端,然后每一个用户就给他创建一个数据库database,这样多个用户就只需要创建多个database数据库即可,不需要像独立数据库方案一样每一个用户我就要去搭建一个mysql服务端
3.3. 共享数据库、共享数据表
在共享数据库方案中,所有租户共享同一个数据库,但在每个表中添加一个租户ID字段,以区分不同租户的数据。这种方案需要确保所有查询都带上租户ID。
优点:
- 节省数据库实例和资源,减少了成本。
- 相对容易管理和维护,数据库结构相对简单
缺点:
- 数据隔离相对较弱,需要确保查询时都带上租户ID,容易出现横向越权。
- 在设计开发时加大对安全的开发量,数据备份和恢复最困难
共享数据库、共享数据表和基于传统应用的数据库设计并没有任何区别,但是由于所有租户使用相同的数据库表,所以需要做好对每个租户数据的隔离安全性处理,这就增加了系统设计和数据管理方面的复杂程度。