当前位置:网站首页>多租户的多种实现方案
多租户的多种实现方案
2022-08-02 21:33:00 【swlws9527】
应对不同复杂程度的 Web 业务,如何实现多租户,使得不同组织之间的数据完全隔离。即,不同组织的人员仅能读写自身组织的数据。大致有以下两种方案:
- 部署类
- 数据隔离类
一、业务场景
简单的 Web 业务,可能一个 WAR 包 + Tomcat + 数据库,即可部署完成。
稍微复杂点的,可能会在此基础上引入 Nginx、多个数据库(比如 Postgre、MongoDB、ES 等)、队列等。
更复杂些的,可能会支持分布式部署。即数据库服务、队列服务等各自占用一个服务器。
面对不同的需求,大致将多租户方案分为两类:
- 部署类
- 虚拟机方案
- 数据隔离类。
- 隔离数据库
- 数据添加组织 ID
二、虚拟机方案
这种方案指,为每个组织独立部署一套完整的服务。同时存在一个中控系统,可以控制虚拟机的创建、删除工作。设计方案:
这种方式下,数据天生是隔离的,无需任何额外处理。
2.1 中控系统
2.1.1 它的职能包括:
- 创建组织,记录一个组织的信息。
- 创建组织的同时,需要为组织开辟服务器资源,全新部署一次完整的服务。
- 更新组织
- 删除组织
- 删除组织的同时,需要删除组织占用的服务器资源。
2.1.2 虚拟机的管理方式
当新建组织时,需要为组织开辟服务器资源。
以vSphere
为例,可以通过调用vSphere
接口实现对虚拟机的管理,对资源执行创建、删除。
2.2 业务系统
通常一个完整的 Web 服务,至少包含用户管理系统
和信息管理系统
。
在这种模式下,每个组织都有自己的用户管理系统
和信息管理系统
。
2.3 升级问题
当发布新的正式版本、或者补丁版本时,可以对指定组织、或全部组织执行更新操作,操作上更加的自由化。
三、隔离数据库
既然目的是为了实现,不同组织之间的数据隔离问题。那么采用隔离数据库
方案,不同的组织拥有自己的数据库,可能的设计方案:
设计思路:各种服务维持一个运行实例,通过索引、连接等方式实现对不同数据的读取与写入。
3.1 业务系统
各组织共用一个用户管理系统
和信息管理信息
,同时后台的服务也是单实例的运行时进程。
3.2 数据读写
每个组织组织拥有自己的数据存储库,用于存储组织自身产生的数据。同时也可以有一个共享库,用于存储各组织共享的数据,比如初始化配置数据。
数据库的实现方式,分多种场景,以数据库为例:
针对不同的部署方式,访问不同组织的数据时,需要实现不同的连接切换方式。
同理,kafka、es 等服务也需要做同样处理,实现不同组织的数据访问。
3.3 升级问题
这种方案下,需要考虑程序升级
与数据升级
问题
程序升级:
因为所有组织共用的一份代码,仅需要执行一次程序升级。
数据升级:
若使用了共享配置数据库
,则大部分场景下仅需要升级这个公共库即可,少部分情况需要升级每个组织的数据。
若未使用共享配置数据库
,则需要对每个组织都执行一次数据升级。
四、数据添加组织 ID
思路:所有的组织共用一份运行实例(业务服务实例、数据库库实例等),每一条数据都添加一个org_id
,用于实现不同组织之间的数据隔离。
4.1 数据读写
根据当前访问用户的组织 ID,访问对应的组织的数据。
4.2 升级问题
发布新版本后,正常的业务升级即可。
五、方案对比
方案 | 优点 | 缺点 |
---|---|---|
虚拟机方案 | 天生实现数据隔离,不需要额外的处理; | 服务器资源开销大;升级麻烦; |
隔离数据库 | 数通过修改连接方式的切换,实现数据隔离,比较方便; | 需要开辟新的数据库,用户少时,不划算;升级时可能会稍微繁琐; |
数据添加组织 ID | 升级方案简单,几乎不要考虑组织的问题 | 业务系统的 API 需要根据组织 ID 的不同,操作不同组织的数据 |
边栏推荐
- [C题目]力扣1. 两数之和
- Vscode快速入门、 插件安装、插件位置、修改vscode默认引用插件的路径、在命令行总配置code、快捷键
- Learn more TypeScript 】 【 TypeScript modular
- 宝塔搭建实测-基于ThinkPHP5.1的wms进销存源码
- JumpServer open source bastion machine completes Loongson architecture compatibility certification
- 矩阵白化原理及推导
- LeetCode 2359. 找到离给定两个节点最近的节点 基环树
- 回文自动机+CodeTON Round 2 C,D
- 快速构建电脑软件系统 、超好用经典的网页推荐汇总
- go 反射 reflect 包
猜你喜欢
What is the core business model of the "advertising e-commerce" that has recently become popular in the circle of friends, and is the advertising revenue really reliable?
从月薪10k到30k的必走之路:自动化测试
博客主题美化第二弹
Learn more TypeScript 】 【 TypeScript modular
若依如何实现添加水印功能
[c] Detailed explanation of operators (1)
牛客每日刷题之链表
kubernetes pod podsecurityPolicies(PSP)
VisualStudio 制作Dynamic Link Library动态链接库文件
软件测试笔试题1(附答案)
随机推荐
golang 刷leetcode:Morris 遍历
golang 刷leetcode:将字符串翻转到单调递增
golang 刷leetcode:统计打字方案数
YARN资源调度系统介绍
golang刷leetcode:最大波动的子字符串
golang 刷leetcode:祖玛游戏
【使用pyside2遇到的问题】This application failed to start because no Qt platform plugin could be initialized.
【DEBUG】ImportError: Unable to import required dependencies: numpy: DLL load failed: 找不到指定的模块。
树形结构构造示例代码
Intensive reading of the Swin Transformer paper and analysis of its model structure
2022-08-02 第六小组 瞒春 学习笔记
任务四 机器学习库Scikit-learn
【c】操作符详解(一)
js函数防抖和函数节流及其他使用场景
行业 SaaS 微服务稳定性保障实战
Sentinel vs Hystrix 限流对比,到底怎么选?
面试了个985毕业的,回答“性能调优”题时表情令我毕生难忘
若依如何实现添加水印功能
包管理工具npm- node package management相关知识 、检查包更新、NPM包上传、更换镜像、npm ERR! registry error parsing json
Summary of @Transactional transaction invocation and effective scenarios