saas 多租户系统数据隔离方案

关注WX公众号: commindtech77, 获得数据资产相关白皮书下载地址

1. 回复关键字:数据资源入表白皮书
下载 《2023数据资源入表白皮书》
2. 回复关键字:光大银行
下载 光大银行-《商业银行数据资产会计核算研究报告》
3. 回复关键字:数据资产估值
下载 《商业银行数据资产估值白皮书》
4. 回复关键字:上海银行
下载 上海银行《商业银行数据资产体系白皮书》
5. 回复关键字:商业银行数据资产管理
下载 《商业银行数据资产管理体系建设实践报告》


 

一、背景

网上一堆 saas多租户系统数据隔离方案的文章,本文着重于生产环境实践

二、怎样区分租户

有3种方式:

  1. 通过不同的访问url来区分;
  2. 相同的访问url,由用户输入租户ID;
  3. 相同的访问url,用户登陆后,查询租户ID;
方案优点缺点
通过不同的访问url来区分1. 不用登陆;
2. 不同租户下面的用户名允许重复
用户需要记住url
相同的访问url,由用户输入租户ID1. 不用登陆;
2. 不同租户下面的用户名允许重复
用户需要记住租户ID
相同的访问url,用户登陆后,查询租户ID不需要记住租户ID;1. 需要用户登陆,才能获取租户ID;
2. 用户名不能一样,否则会冲突;

阿里云、腾讯云都是使用第2种方案

阿里云子账号登陆界面

腾讯云子账号登陆界面

三、 3种数据隔离方案架构

  1. 数据库表通过租户ID字段来区分

说明:图片不是原创,在网上找的

2. 独立的数据库(schema)

说明:图片不是原创,在网上找的


3. 独立数据库实例

说明:图片不是原创,在网上找的

方案优点缺点
数据库表通过租户ID字段来区分(1)成本低,支持的租户多;
(2)实现简单,直接使用mybatis plus的TenantLineInnerInterceptor拦截器即可;
(3)系统升级最方便,表变更只要执行一次即可;
(4)运营做数据分析方便,不同将多个库的数据汇总分析;
(1)数据隔离性差;
(2)所有数据存在一起,性能随着数据的增加会变得越来越差;
独立的数据库(schema)(1)成本较低,支持的租户较多;
(2)性能够好,当存在性能问题时,迁移到独立数据库实例,程序不需要改动;
(3)数据隔离性好;
(1)系统升级不方便,需求所有数据库都执行一次表变更的sql。随着租户增加,运维的工作量会越来越多;
(2)增加一个租户,需要创建一个新的数据库,增加运维的工作量;
(3)增加一个租户时,要插入一些初始化数据,开发、运维之间,要维护一个初始化数据sql文件。生产中,经常会出现由于缺少部分初始化数据,导致新租户异常的情况;
(4)运营做数据分析时,不方便;
独立数据库实例(1)性能好,可以横向扩容。可以针对租户的性能需求,配置不同性能的数据库实例。例如,租户A的数据多,用户多,要求性能高,数据库实例的配置可以分配更多的内存、更高频率CPU;租户B的数据少,用户少,性能要求低,数据库实例的配置低一些没关系;
(2)数据隔离性好;
(1)系统升级不方便,需求所有数据库都执行一次表变更的sql。随着租户增加,运维的工作量会越来越多;
(2)增加一个租户,需要创建一个新的数据库,增加运维的工作量;
(3)增加一个租户时,要插入一些初始化数据,开发、运维之间,要维护一个初始化数据sql文件。生产中,经常会出现由于缺少部分初始化数据,导致新租户异常的情况;
(4)运营做数据分析时,不方便;

四、生产环境实践

在公司的项目中,通过团队的讨论,最终决定使用数据库表通过租户ID字段来区分的方案。原因如下:

  1. 当时项目刚启动,人手不足,希望成本(服务器成本、运维成本)尽可能低;
  2. 系统对数据隔离性要求不高,同时预计的数据量不太;
  3. 后期数据库如果存在性能问题,可以改用tidb横向扩容;
  4. 产品要分析租户的数据(公司的运营管理后台),如果租户数据分到不同的数据库(或者数据库实例),数据统计分析会很不方便;

五、生产实践遇到的问题

  1. 公司采用通过表增加tenantId字段来做数据隔离,采用mybatis plus的TenantLineInnerInterceptor拦截器,在查询时,自动加上tenantId查询条件,在插入数据时,自动填上用户的tenantId。
  2. 存在一些表(例如一些配置参数表),所有租户都会用到,而且都一样的。这些表在系统迭代过程中,数据会不断增加。如果也加上tenantId(即每个租户一份数据),会导致运维工作增加。例如,每增加一个租户,都要copy一份这些数据;新插入一条数据,要查询系统所有租户ID,给每个租户都增加一条数据。如果忘记这个操作,会导致部分租户异常。这个可以通过重写mybatis plus的TenantLineInnerInterceptor拦截器的ignoreTable方法,忽略指定的表,解决这个问题。
  3. 肯定要有tenantId(才知道哪个用户是哪个租户下面的),登陆接口要查用户表,但此时不知道用户是哪个租户下面的,mybatis plus的TenantLineInnerInterceptor拦截器查询时,会自动增加tenantId查询条件,会导致查询不到这个客户。可以通过查询用户的mybatis接口的方法上,加上@InterceptorIgnore(tenantLine = "1")注解即可忽略TenantLineInnerInterceptor拦截器;
    InterceptorIgnore注解,请参考mybatis plus的官方文档

插件主体 | MyBatis-Plus​baomidou.com/pages/2976a3/#mybatis-config-xml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/589974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32F103】SysTick系统定时器延时函数

SysTick SysTick是Cortex-M3内核中的一个外设,内嵌在NVIC中,叫系统定时器。 当处理器在调试期间被喊停时,SysTick也将暂停运作。 一共有四个寄存器,不过我们通常用前三个,不需要校准。下图出自《STM32F10xxx Cortex…

关于SIC 的Know-how

SiC的分类和用途 根据电阻率不同,SiC衬底晶片可分为导电型和半绝缘型。 SiC衬底晶片主要用来做成高压功率器件和高频功率器件。其中,导电型SiC衬底晶片经过SiC外延后(SiC基SiC外延片),主要应用于制造耐高温、耐高压的…

72内网安全-域横向CSMSF联动及应急响应知识

拿到才行,拿不到就是多余的 案例一MSF&CobaltStrike 联动 Shell 有一些功能可能cs或者msf强大一些,他们两个可以相互调用,在真实情况下也是可以cs和msf同时启动的, cs移交给msf .创建Foreign监听器 “Listeners”“Add”…

蓝桥杯一维差分 | 算法基础

⭐简单说两句⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! &…

Python-docx 深入word源码 带有序号的段落无法设置段后、段前距离、间距等段落属性

如果使用p doc.add_paragraph(内容, styleList Number)来创建序号段落,会发现设置序号段落之间的段前、段后以及段落间距无法生效。后来将docx库生成的word文档打开后发现段落的设置出现问题,如下图红框所示,将该选项去掉即可使段落间距属性…

【AIGC-图片生成视频系列-4】DreamTuner:单张图像足以进行主题驱动生成

目录 一. 项目概述 问题: 解决: 二. 方法详解 a) 整体结构 b) 自主题注意力 三. 文本控制的动漫角色驱动图像生成的结果 四. 文本控制的自然图像驱动图像生成的结果 五. 姿势控制角色驱动图像生成的结果 2023年的最后一天,发个文记录…

迈向通用异常检测和理解:大规模视觉语言模型(GPT-4V)率先推出

PAPERCODEhttps://arxiv.org/pdf/2311.02782.pdfhttps://github.com/caoyunkang/GPT4V-for-Generic-Anomaly-Detection 图1 GPT-4V在多模态多任务异常检测中的综合评估 在这项研究中,我们在多模态异常检测的背景下对GPT-4V进行了全面评估。我们考虑了四种模式&#…

BikeDNA(二) OSM数据的内在分析1

BikeDNA(二) OSM数据的内在分析1 该笔记本分析给定区域的 OSM 自行车基础设施数据的质量。 质量评估是“内在的”,即仅基于一个输入数据集,而不使用外部信息。 对于将 OSM 数据与用户提供的参考数据集进行比较的外在质量评估&…

mysql原理--optimizer trace表的神器功效

1.概述 设计 MySQL 的大叔提出了一个 optimizer trace 的功能,这个功能可以让我们方便的查看优化器生成执行计划的整个过程,这个功能的开启与关闭由系统变量 optimizer_trace 决定。 如果想打开这个功能,必须首先把 enabled 的值改为 on &am…

力扣回溯算法-电话号码的字母组合

力扣第17题,电话号码的字母组合 题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 .电话号码的字母组合 示例: 输入:“2…

lv14 注册字符设备 3

1 注册字符设备 1.1 结构体介绍 struct cdev {struct kobject kobj;//表示该类型实体是一种内核对象struct module *owner;//填THIS_MODULE,表示该字符设备从属于哪个内核模块const struct file_operations *ops;//指向空间存放着针对该设备的各种操作函数地址str…

2023-12-17 LeetCode每日一题(使用最小花费爬楼梯)

2023-12-17每日一题 一、题目编号 746. 使用最小花费爬楼梯二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你…

宠物猫的饲养技术,可爱猫的秘密世界

一、教程描述 从来没有养过猫的朋友,在你猫咪来你家之前,最基本的准备工作需要做好,比如清洁消毒屋子,为猫咪准备好猫砂、猫砂盆、猫粮(不要去超市买猫粮),以及一个柔软的窝。满三个月的小猫要…

Linux 安装 mysql 【使用 tar.gz | tar.xz安装包-离线安装】

一、以tar.xz压缩包为安装源 网址:https://downloads.mysql.com/archives/community/ 二、解压压缩包 首先,将压缩包从windows传输到linux上 解压到/usr/local下,并且将解压的目录名称改为mysql tar -xvf /tmp/mysql-8.1.0-linux-glibc2.2…

【JVM】一文掌握JVM垃圾回收机制

作为Java程序员,除了业务逻辑以外,随着更深入的了解,都无法避免的会接触到JVM以及垃圾回收相关知识。JVM调优是一个听起来很可怕,实际上很简单的事。 感到可怕,是因为垃圾回收相关机制都在JVM的C++层实现,我们在Java开发中看不见摸不着;而实际很简单,是因为它说到底,也…

[密码学]ECC加密

椭圆曲线加密 Ellipse Curve Cryptography 椭圆曲线上的离散对数问题 Ellipse Curve Discrete logarithm Problem 椭圆曲线 注意积分公式的分母,椭圆曲线由此得名。这种曲线和椭圆一点不像。 离散对数: yg^x mod p,对于给定的g,x,p求y很容易&#…

操作系统期末复习

分段存储管理方式 某采用段式存储管理的系统为装入主存的一个作业建立了如下段表: 段号 段长 主存起始地址 0 660 210 1 140 3300 2 100 90 3 580 1237 4 960 1959 (1)计算该作业访问[0,432],[1&am…

什么是缓存、为什么要用缓存、缓存分类、缓存测试、缓存更新、缓存设计考虑点、缓存测试点

一、缓存 缓存是一种将数据存储在高速缓存中的技术,它可以提高应用程序的性能和响应速度。 二、 为什么要用缓存 1. 高性能(主要目的) 查询耗时,但变化少,又有很多读请求情况下,可以将查询结果放到缓存中。减少对数据库的压力&…

Python实现【亚马逊商品】数据采集

前言 亚马逊公司,是美国最大的一家网络电子商务公司,位于华盛顿州的西雅图 是网络上最早开始经营电子商务的公司之一,亚马逊成立于1994年 今天教大家用Python批量采集亚马逊平台商品数据(完整代码放在文末) 地址&#…

应对服务器CPU占用持续性变高的解决办法

​  在服务器的使用过程中,高CPU使用率是一个常见的问题,一般是由于遇到大量流量,进程需要更多时间来执行或通过网络发送和接收大量网络数据包时,CPU使用率可能会急剧增加,严重时可能会影响到网络的性能和稳定性。因…