什么是多租户
多租户指一套系统能够支撑多个租户。
一个租户通常是具有相似访问模式和权限的一组用户,典型的租户是同一个组织或者公司的若干用户。
要实现多租户,首先需要考虑的是数据层面的多租户。
数据层的多租户模型对上层服务和应用的多租户实现有突出影响。
本文重点介绍数据层多租户对各种多租户模型的支持。
本质
多租户本质就是通过动态配置,支持实现同套代码,一次部署,服务多个产品。
考虑因素
权衡不同的多租户实现方式时,需要考虑如下因素:
扩展性:租户数量级别,以及未来发展趋势
安全性:租户之间数据隔离级别要求
资源共享:多租户通常有某种形式的资源共享,需要避免某个租户的糟糕SQL吃掉系统资源,影响其他租户的响应时间
灵活性:不同租户可能有不同的需求,对特定租户需求的扩展能力
跨租户分析和优化:对全部租户或者多个租户的数据和行为进行分析的能力
运维和管理:运维管理的复杂度和便宜性,包括监控、修改数据库模式、创建索引、收集统计数据、数据加载等
成本:总体拥有成本,包括方案实现成本、运维成本等
多租户模型
多租户模型描述了租户和该租户的数据之间的映射关系。
不同的多租户模型会影响数据库和应用程序的设计、管理和维护。
一租户一数据库
最简单的多租户实现方式是为每一个租户创建一个数据库,如下图所示。
应用程序为每个租户分配一个租户id,并为每个租户配置相应的数据库连接信息(包括数据库ip、端口等)。
应用程序根据租户id连接到为其分配的数据库。
这种模型中不同租户的数据物理隔离,安全级别高。
如果每个租户的数据库使用不同的硬件和数据库类型,则他们之间的资源使用也是物理隔离的;如果租户的数据库共用同一套硬件,则需要对资源进行合理分配和管理,避免相互影响。
由于不同租户使用独立的数据库,灵活性好,容易满足不同租户的特定需求(譬如需要额外的字段)。
出现故障时影响面小。缺点是数据库数量大,维护复杂,拥有成本高。适合租户数目比较少的场景。
一租户一名字空间(Schema/Namespace)
多个租户共享同一个数据库,每个租户拥有独立的名字空间(或模式)。
应用程序为每个租户分配一个id,并把每个租户的所有操作限制在为其分配的名字空间/模式之中。
如下图所示。
这种多租户模型下,不同租户的数据逻辑上相互隔离,安全控制相对简单。不同租户有不同的模式,可以简便的满足不同租户的特定需求,灵活性高。
对资源管理能力要求高,以避免不同租户竞争资源。
可以把不同租户的数据存储在不同的磁盘上,降低了对磁盘IO的竞争。
运维和管理较复杂,不易实现大量租户的跨租户分析。适合租户数目适中的场景。
全共享方式
不同租户共享同一个数据库、同一个名字空间。
不同租户的数据在同一组表中共存,通过租户id标记和访问不同租户的数据(应用需要调整访问数据的SQL以包含租户id)。
如下图所示。
这种多租户模型中,不同租户的数据物理存储在一起,对系统的资源隔离和安全隔离要求很高。运维相对简单。
扩展能力好,可以支持较多数量租户。由于租户数据存储在一起,跨租户数据分析和优化非常简单。
成本低,可以较低的代价支持更多的租户。
全共享模型中,很多数据库采用添加大量自定义字段的方式满足不同租户的特定需求,以提高灵活性。这种方式有诸多局限性,譬如字段数目不能太多、管理复杂等。支持更多半结构化数据,包括JSON 等,通过这种半结构化数据,可以更灵活、高效、便捷的满足不同租户的特定需求。
参考资料
https://blog.csdn.net/qq_38712932/article/details/119705932