概述
随着云计算和SaaS(Software as a Service)模型的兴起,多租户系统成为了构建灵活、高效应用的重要架构。在构建多租户SaaS平台时,数据库方案的选择直接关系到数据隔离、性能和可扩展性。
在SaaS平台项目中,根据前端不同的域名查询不同的数据库,通常涉及到多租户架构的实现。在这种架构中,一个应用实例可以服务多个客户(租户)【数据库】,每个租户的数据需要隔离存储。实现这一目标的关键技术之一就是动态切换数据库连接。
设计多租户数据模型
在数据库设计阶段,你需要决定数据隔离的级别。通常有以下几种隔离级别:
- 独立数据库:每个租户拥有一个独立的数据库实例。
- 共享数据库,独立Schema:所有租户共享同一个数据库,但每个租户有独立的Schema。
- 共享数据库,共享Schema,共享数据表:所有租户共享数据库、Schema和数据表,但通过租户ID字段进行数据隔离。
共享数据库,独立Schema
"共享数据库,独立Schema" 是一种在SaaS平台中实现多租户架构的策略,它在数据库层面上提供了一种折中的数据隔离方法。
Oracle数据库:在Oracle中一个数据库可以具有多个用户,那么一个用户一般对应一个Schema,表都是建立在Schema中的,(可以简单的理解:在Oracle中一个用户一套数据库表)
图片
在 MySQL 中,Schema 和 Database 可以认为是相同的概念。在 SQL 语句中,CREATE DATABASE 和 CREATE SCHEMA 基本上是等效的。所以,当你创建一个数据库时,你也在事实上创建了一个模式。模式是一个逻辑上的容器,用于组织和管理数据库对象,如表、视图、存储过程等。在 MySQL 中,模式和数据库可以互换使用。
共享数据库
在这种模式下,所有的租户(即SaaS平台的客户)共享同一个物理数据库服务器或数据库实例。这意味着,尽管每个租户都有自己的数据,但这些数据都存储在同一个数据库文件或数据库集群中。这样做的好处是可以减少硬件资源和维护成本,因为不需要为每个租户单独设置和维护数据库实例。
独立Schema
尽管数据库是共享的,但每个租户都有自己独立的Schema。Schema是数据库中的一种逻辑分组,它包含了一系列的数据库对象,如表、视图、索引、存储过程等。在这个模式下,每个租户的数据都存储在自己的Schema中,这样可以保证租户之间的数据逻辑上是隔离的。
例如,假设有两个租户A和B,他们共享同一个数据库"SaaSDB"。在"SaaSDB"中,可以分别为租户A和租户B创建两个Schema(数据库),分别是"SchemaA"和"SchemaB"。租户A的所有数据都存储在"SchemaA"中,而租户B的数据存储在"SchemaB"中。
优缺点
优点
缺点
总体来说,"共享数据库,独立Schema" 的模式在SaaS平台中是一种常见的多租户数据隔离策略,它在资源利用率和数据隔离性之间取得了平衡。开发者需要根据具体的业务需求和预期的租户规模来决定是否采用这种模式。
SaaS多租户架构数据库设计
重点:在 SQL 语句中,CREATE DATABASE 和 CREATE SCHEMA 基本上是等效的。所以,当你创建一个SCHEMA时,就是在一个RDS实例下创建一个数据库DATABASE。
图片
以newtrain.tinywan.com、hz_newtrain.tinywan.com、bj_newtrain.tinywan.com三个域名为例,每个域名对应一个租户平台站点,分别对应各自的数据源数据库newtrain.tinywan.com、hangzhou.tinywan.com、beijing.tinywan.com。
实施方案
域名解析与路由
- 在DNS系统中为每个域名配置A记录,指向SaaS平台的服务器
- 在服务器上部署Web应用,并根据请求的Host头部信息,确定租户身份。
数据源配置
- 在应用程序的配置文件中,定义每个租户的数据源配置,包括数据库URL、用户名和密码
- 可以使用环境变量或配置中心来动态加载这些配置。
动态数据源切换
根据请求的域名或其他标识符,动态确定使用哪个数据库连接。这通常通过中间件、拦截器或全局函数来实现。
示例:使用PHP实现域名路由中间件