多租户系统设计

简介: 多租户可以分为几个不同的类别:云中的简单虚拟化,其中只对硬件进行共享。共享应用程序,对每个租户使用不同的数据库。共享应用程序和数据库(效率最高,真正的多租户)。

多租户系统设计


SaaS 的系统分级


SaaS 系统架构成熟度模型的 5 个级别——从“混乱”到“乌托邦“


  • 第 0 级(混乱):每次新增一个客户,都会新增软件的一个实例。
  • 第 1 级(受控的混乱):所有客户都运行在软件的同一个版本上,而且任何的定制化都通过修改配置来实现。
  • 第 2 级(多租户 [multi-tenant]、高层建筑 [Highrise]):所有的客户都已经可以在软件的同一个版本上运行了,而且他们都在同一个“实例”上运行。
  • 第 3 级(多租户, 扩建 [Build-Out]):此时你已经拥有了多租户、单一版本的软件模型。不过你还是可以通过硬件扩展(scale-out)的方式来进行扩充。
  • 第 4 级(乌托邦):如同第 3 级,除非你可以找出有效的方式,以在不同的“实例”上运行不同版本的软件。


4.jpg


应用程序必须支持多租户:


多租户可以分为几个不同的类别:


  • 云中的简单虚拟化,其中只对硬件进行共享。
  • 共享应用程序,对每个租户使用不同的数据库。
  • 共享应用程序和数据库(效率最高,真正的多租户)。


我们要实现的也即效率最高的,真正的多租户业务模型。但选择是有个筛选的过程的,下面分别介绍下各种多租户的数据隔离方案。


独立应用独立库


有多个不同的应用,每个应用都有自己的数据库。这种方式虽然保证了租户数据的隔离,但无论是在扩展性和成本上都是最差的,故首先淘汰这种方式。


同一个应用程序,每个租户一个库


优点是


  • 租户数据在数据库维护物理上隔离了,
  • 由于是每个租户一个库可以在库表设计上做单独扩展,但这也引起了应用程序的兼容问题


缺点是数据库维护成本高,(举例:在相同数据结构的情况下,增加表中的列或索引,需要操作多个库)开发成本也高。


5.jpg


同一个应用程序,同一个数据库


缺点:多租户数据库必然会牺牲租户隔离。多个租户的数据一起存储在一个数据库中。在开发过程中,确保查询不会暴露来自多个租户的数据。


优点:是所有方案中成本最低的。


6.jpg


分片多租户


分片多租户即:多租户的单应用+支持多租户的单数据库(分片)


7.jpg


看起来是不是跟第一个图中:同一个应用程序,每个租户一个库模式差不多,只不过每个库多了几个租户数据?


其实是大不相同的。


首先,第一种模式中不同租户的库是可以分别扩展的,也就是结构可以不一样,但分片多租户的是同一种数据结构。


其次,分片模式的扩展性很强,它可以是一个分片一个租户,也可以是一个分片多个租户,具体要看具体的分片策略。


来看下分片模式下具体的指标情况:


指标 分片多租户
可扩展性 无限 1-1000000s
租户隔离性 中等
每一个租户的数据库成本 最低
性能监控和管理 综合和单个(偏综合)
开发复杂度 中等
运维复杂度 从低到高,单租户的管理比较复杂


我们的模型选择


基于以上的分析,我们选择采用分片多租户的模型,因为这样可以获得无限的扩展能力,且对租户数据的隔离性也比较好。


这样的话数据库结构就是统一的,不同分片是同一库表结构。而具体分库规则是可以配置的,建议前期按照 一租户一库 的策略配置。


开发实践


  • 每一个表的设计都应该考虑是否要加入 “租户 ID”字段,用来区别不同“租户”,或者不同客户,另外,也方便后面用“租房 ID”作为 分片键
  • 我们将引入 ShardingSphere 帮我们做数据库的分库分表,对于应用来说是相对透明的,减少应用开发在数据库层面由于引入分库分表的复杂度。
  • 我们利用分片规则对数据进行分片,例如根据租户 ID,配置分库分表规则


# 配置分片规则
- !SHARDING
  tables:
    # 配置 t_order 表规则
    t_order: 
      actualDataNodes: ds${0..1}.t_order${0..1}
      # 配置分库策略
      databaseStrategy:
        standard:
          shardingColumn: user_id
          shardingAlgorithmName: database_inline
      # 配置分表策略
      tableStrategy:
        standard:
          shardingColumn: order_id
          shardingAlgorithmName: table_inline
    t_order_item: 
    # 省略配置 t_order_item 表规则。..
    # ...
  # 配置分片算法
  shardingAlgorithms:
    database_inline:
      type: INLINE
      props:
        algorithm-expression: ds${user_id % 2}
    table_inline:
      type: INLINE
      props:
        algorithm-expression: t_order_${order_id % 2}


  • 当数据库表结构有变更的时候(DDL),通过 ShardingProxy 进行代理修改,ShardingProxy 会按照分库分表规则进行多库表的自动修改。


元数据/配置驱动


一个好的 SaaS 解决方案应该是高效的多租户。可以使用每个租户的元数据来实现多租户。可以为每个特定组件定义元数据。它定义了运行时的应用程序数据、应用程序的基础功能,以及特定租户的数据和自定义(如果有的话)。


具体来说比如我们对多租户系统的 RBAC 权限配置管理,就是元数据配置。可以参考:

相关文章
|
SQL 运维 监控
云平台-多租户技术设计
云平台-多租户技术设计
3294 0
云平台-多租户技术设计
|
缓存 负载均衡 算法
“软件系统三高问题”高并发、高性能、高可用系统设计经验
​ 总的来说解决三高问题核心就是 “分字诀” 业务分层、系统分级、服务分布、数据库分库/表、动静分离、同步拆分成异步、单线程分解成多线程、原数据缓存分离、分流等等。。。。 直观的表述就是:从前端用的CDN、动静分离,到后台服务拆分成微服务、分布式、负载均衡、缓存、池化、多线程、IO、分库表、搜索引擎等等。都是强调一个“分”字。
3262 0
“软件系统三高问题”高并发、高性能、高可用系统设计经验
|
1月前
|
存储 人工智能 监控
《鸿蒙Next系统:多租户环境下决策树模型的安全与隔离之道》
鸿蒙Next系统为多租户环境下的决策树模型提供全面的安全保障。基于微内核的可信执行环境和“星盾”安全架构,确保数据加密与隐私保护。通过统一身份认证、细粒度访问控制及存储、计算隔离技术,防止数据泄露与资源滥用。实时安全监控、审计机制和加密通信进一步强化了系统的安全性,为企业和用户在多租户场景下使用AI技术保驾护航。
|
9月前
|
消息中间件 存储 弹性计算
如何让系统具备良好的扩展性?
【5月更文挑战第7天】如何让系统具备良好的扩展性?
|
9月前
|
设计模式 缓存 监控
让系统具备良好的扩展性的依据
在当今快速发展的科技时代,系统的扩展性成为了设计和开发中的一个重要考虑因素,尤其是在软件开发领域,构建具有良好扩展性的系统是至关重要的。随着用户规模的增长、数据量的增加以及业务需求的演变,系统需要具备良好的扩展性,以满足不断增长的负载和应对复杂多变的业务场景。一个具备良好扩展性的系统能够在不进行大规模重构的情况下,轻松地进行水平或垂直扩展,实现高效、无缝的功能扩展,这种系统设计的优势在于其能够快速适应变化,并保持高性能和高可用性。而且扩展性是指系统在面对需求变化时,能够以一种高效、灵活和可持续的方式进行扩展和改进,一个具备良好扩展性的系统能够降低开发成本,提高代码的可维护性,同时也能更好地满足
190 3
让系统具备良好的扩展性的依据
|
SQL 存储 druid
浅析SaaS多租户系统数据隔离实现方案
多租户问题,其是一种架构设计方式,就是在一台或者一组服务器上运行的SaaS系统,可以为多个租户(客户)提供服务,目的是为了让多个租户在互联网环境下使用同一套程序,且保证租户间的数据隔离。从这种架构设计的模式上,不难看出来,多租户架构的重点就是同一套程序下多个租户数据的隔离。由于租户数据是集中存储的,所以要实现数据的安全性,就是看能否实现对租户数据的隔离,防止租户数据不经意或被他人恶意地获取和篡改
1739 0
|
9月前
|
缓存 前端开发 小程序
【分布式技术专题】「架构设计方案」盘点和总结RBAC服务体系的功能设计及注意事项技术体系
【分布式技术专题】「架构设计方案」盘点和总结RBAC服务体系的功能设计及注意事项技术体系
153 0
|
存储 监控 安全
垃圾处理厂SCADA系统设计与开发
垃圾处理厂SCADA系统设计与开发
|
运维 监控 安全
|
存储 运维 分布式计算
系统设计:如何让系统高可用?
系统设计:如何让系统高可用?
593 3
系统设计:如何让系统高可用?