SaaS“可配置”和“多租户”架构的几种技术实现方式
1、数据存储方式的选择
多租户(Multi-Tenant ),即多个租户共用一个实例,租户的数据既有隔离又有共享,说到底是要解决数据存储的问题。
常用的数据存储方式有三种。
方案一:独立数据库
![](http://upload-images.jianshu.io/upload_images/4669699-352ac61ab0295643.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/600/format/webp)
一个Tenant,一个Database“的数据存储方式。隔离级别最高、最安全,但成本也高。
优点:
a.为不同租户提供独立数据库,有助于简化数据模型的扩展设计,满足个性化需求;
b.数据恢复简单;
缺点:增大了数据库的安装数量,购置和维护成本高;
方案二:共享数据库,隔离数据架构
![](http://upload-images.jianshu.io/upload_images/4669699-392c327aca9ef7a5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/600/format/webp)
多个租户或所有租户共享Database,但一个Tenant,一个Schema的方式。
优点:
a.一定程度的逻辑数据隔离(并非完全),可满足较高程度的安全性保障;
b.每个数据库,可支持更多租户数量;
缺点:
a.恢复数据较困难,因为将牵扯到其他租户数据;
b.跨租户统计数据,实现难度大;
方案三:共享数据库,共享数据架构
![](http://upload-images.jianshu.io/upload_images/4669699-79e4658e00cfa24e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/600/format/webp)
一种租户共享同一个Database、同一个Schema,而另行通过TenantID区分租户数据的方式。
优点:
a.每个数据库可支持租户数量多,维护和购置成本低;
缺点:
a. 隔离级别低,安全性低,开发时需做大量安全开发工作;
b. 逐表逐条备份和还原数据,数据备份和恢复困难。
三种数据存储方案的比较
![](http://upload-images.jianshu.io/upload_images/4669699-e834c944073bad44.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/600/format/webp)
但究竟选择何种方式,则取决于产品定价策略和租户对数据安全的接受程度。
2. 系统安全性设计
系统级:
A. 使用HTTPS传输协议,以SSL(Security Socket Layer)交换数据,加强通信安全
B. 使用数字签名,防止传输过程被篡改;
C. 使用DES数据加密算法,设计用户身份识别;
D. 定时备份业务数据;
程序级:
A. 权限配置(功能权限、数据权限等)
B. 客户端输入校验,防止JS和XXS攻击、SQL注入等;
C. 辅助安全设计,如密码控件、图片验证、手机验证等。
3. 租户管理
注册、订购、计费等管理。
注册
![](http://upload-images.jianshu.io/upload_images/4669699-6cd3481383296270.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/600/format/webp)
Tenant:租户
User: 租户下 的用户,同一租户下可以有多个用户;
Tenant的status属性,用于定义租户状态(待审核、已审核、启用、禁用、取消),赋予租户能否登陆的权限。
订购
![](http://upload-images.jianshu.io/upload_images/4669699-ab44d9ae432741a7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/600/format/webp)
PricePolicy:价格策略,支持按时间(年、月、日)、次数计价,以unit表示;
Subsciber: 订购记录,记录租户选用了何种价格策略,以及服务期限或服务次数。
计费
![](http://upload-images.jianshu.io/upload_images/4669699-5f84d76269daabe6.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/600/format/webp)
Journal:流水账,记录租户使用服务的日志,用于生成账单和报表;
4、数据隔离
![](http://upload-images.jianshu.io/upload_images/4669699-2916ad9ae110a2a6.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/600/format/webp)
为每个需要隔离的业务表加上Tenant_ID字段,以实现租户数据间的隔离,这是最通常的做法。
本文转自链接:https://www.jianshu.com/p/c11b19fc8110