多租户实现要点

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