多租户实现要点
May 27, 2024
多租户已经成为实现SaaS后台必备的能力,但是应为跟业务结合关系比较密切,很少能看到比较完整的解决方案。此文重点介绍实现多租户的一些关键技术点,为后续在设计SaaS平台的时候提供参考。
定义
一种软件架构。租户是指一组用户或一个组织,他们共享租户内资源。多租户间资源和访问权限隔离。通常软件的单个实例同时服务于多个租户。
角色
- Tenant:使用应用程序/服务(并为此付费)的组织/客户
- Host: 负责提供服务和管理所有租户。
多租户好处和难点
- 优点
- 灵活:产品层面更灵活,租户间可以共享资源。
- 组件间资源隔离,影响小
- 租户间版本一致,易于维护
- 难点
- 数据隔离:租户之间数据的隔离,保障租户数据安全
- 性能隔离:性能不能相互影响
- 租户间差异:配置和定制(比如logo)
应用+数据库的几种模型
- Application level isolation:应用程序和数据都隔离
- 优势:数据隔离保障数据安全。性能也隔离
- 不足:成本高,整体资源利用率不高
- 数据库隔离:应用程序共享,数据隔离
- 优势:数据隔离
- 不足:DB成本高
- 共享模式:一个数据库存储所有多租户数据。数据根据db分区存储💡最简单的多租户数据库模式使用单一数据库来托管所有租户的数据。 添加更多的租户时,该数据库会使用更多的存储和计算资源进行纵向扩展。 通过这种纵向扩展也许能够做到高枕无忧,不过,规模始终有一个最终的限制。 但是,在远远未达到该限制之前,数据库可能就会变得难以管理。
在多租户数据库中,侧重于单个租户的管理操作更难实现。 大规模执行这些操作可能会使速度变得非常缓慢,让人无法接受。 一个例子是只是对一个租户的数据执行时间点还原。
- 分片模式:多个租户共享一个数据库,根据容量灵活调整
租户身份识别
客户端
- 【已登录/认证用户】通过identity识别,用户后台绑定租户
- 子域名
- 请求Request:Header、Cookie、Query参数
其他
- 服务端:公共协议头
- 服务内部:context等
数据隔离
租户允许有独立的DB(dsn),也可以使用默认的共享DB。需要动态选择。
DB
TenantStore:租户信息
Loading...
TenantConn:租户DB(dsn)。默认租户可以不需要记录
Loading...
租户数据存储于租户db或者默认共享DB中。
使用共享DB时需要根据租户过滤数据,建议采用repository pattern,保障数据安全。
其他功能
- 启用、禁用多租户
- 数据库迁移
- 为什么需要迁移:随数据量增多,从共享DB迁移至独立DB。Or vice versa。
- 如何迁移:
- 冷:停止迁移租户服务,使用工具迁移
- 热:线上双写?
总结
- 什么是单租户和多租户
- 数据库和应用的部署模式
- 租户识别
参考
See all postsSee all posts