《DTSE Tech Talk 技术直播 NO.3 数据隔离方案探讨,让SaaS应用开发更轻松》——【干货总结】
《DTSE Tech Talk 技术直播 NO.3 数据隔离方案探讨,让SaaS应用开发更轻松》
这是8月17日李良龙老师带来的一期直播内容,大家如果有兴趣的可以点击回顾哈~
可能还有小伙伴不了解DTT直播是什么,我先简单介绍一下:
华为云《DTSE Tech Talk》直播围绕云上技术热点如云原生、基础服务、 IoT、DevOps、 AI、机器学习、深度学习、数据库、区块链等,并邀请鸿蒙,HMS,欧拉等其它生态领域专家,面向开发者开展技术公开课,让开发者成为决定性力量。
总而言之一句话,“DTT”是“DTSE Tech Talk”首字母的缩写,DTT直播是从技术视角出发,专为技术人量身打造的一系列技术公开课。
接下来我们看看李老师将要讲些什么技术内容叭~
根据目录我们可以知道,接下来主要将围绕这四大问题来展开讲解。
-
什么时候需要数据路由
-
哪些数据需要路由
-
实现数据路由设计以及开源插件分享
-
路由解决方案的演进
1.1什么时候需要数据路由-资源共享模式
- 租户1,不涉及资源共享,天然隔离,预算充足,对稳定,隔离性,运维有很高要求时选用
- 租户2,应用层独立,与其他租户共享数据库实例,有计算密集型业务,共享应用层容易相互影响等等
- 租户3&4,共享应用层,共用数据库实例,业务数据分布在相同实例的不同schema中,可容纳较多租户
- 租户5&6,共享应用层,共享数据库实例,不同租户的业务数据存放在同一个schema中,使用租户标识隔离,可容纳大量租户
- 租户7,共享应用层,独享数据库实例,对数据隔离有一定的要求,业务数据量比较大,避免与其他租户相互影响,或者对数据的运维要求比较高等等
- 共享应用层和数据库实例时,在处理业务逻辑过程中需要将租户的数据库相关操作指向目标库,避免数据污染等一系列问题,此时即需要进行路由
大家都知道,SaaS应用呢有多租户的概念,而多租户往往又采用资源共享模式,这就导致了数据之间会产生隔离性的要求,需要正确实现租户的路由,才能保证隔离性。如果租户不涉及资源共享、天然隔离、预算充足,对稳定、隔离性,运维有很高要求时、租户应用层独立,与其它租户共享数据库实例,有计算密集型业务,共享应用层容易想到影响时;租户间共享应用层,共用数据库实例,业务数据分布在相同实例的不现schema中,可容纳较多租户。
2.1哪些数据需要路由-租户标识传递
- 路由依据,以租户标识来区分租户,以此作为依据对租户数据进行路由
- 标识传递,需要传递标识的场景包含但不限于服务访问,服务之间相互调用,消息传递,缓存读写,持久化数据读写等等,可以使用header,请求内容,消息topic,消息内容,缓存key前缀等等来进行传递
- 生命周期,从发起服务请求开始,租户标识需要向后传递,直到不再需要区分租户为止,比如请求结束
租户在进行调用、互相访问、解耦合等业务时,就需要租户标识来识别其他租户,以此来区分正确的用户,并且以此作为依据对租户数据进行路由,从而访问自己需要的数据。当租户可以获取的数据都是自己需要的了,也就是说不需要其他租户的数据了,这样就可以不需要再继续传递了,标识传递到此刻终止。
2.2哪些数据需要路由-路由承担了什么角色
- 当不同的租户的业务数据隔离存放时,需要依赖一个可信的绑定规则来确定最终访问的数据
- 不统一管理时,绑定规则不可见,不易维护与追溯,甚至无法访问正确的数据,导致权限,数据污染等一系列问题
- 绑定规则统一管理,可维护性强,可以结合业务进行扩展,可回溯,可以对资源进行管控
在没有租户路由的情况下,一般是根据一些代码逻辑或者一些简单的规则来使租户访问到数据源。但这个时候的规则是杂乱无章的,也是缺乏管理的,极容易出现各种各样的问题,管理和配置不便捷,可视性也不强,并且安全性也不高。
2.3哪些数据需要路由-考虑多种因素
- 资源共享需求:同样资源规模下,资源共享程度越高,支持的租户规模越大
- TCO(总拥有成本):不同的租户预算不一,客户群体大小不一,降低成本永远是一个绕不开的话题,资源共享程度越高,TCO越低
- 数据安全需求:资源共亨程度越高,为保证数据隔离所做的工作量越大持续稳定需求:共享程度越高,租户之间相互影响越大,运维越复杂
3.1路由插件设计分享-路由设计
配置式
- 数据源组列表,一组可包含一主多从
- 租户与数据源组绑定关系
- 租户与schema绑定关系
松散配置
- 多个租户可以绑定同一个数据源组,可细化绑定关系到schema
- 绑定关系与数据源组配置的修改不相互影响
动态数据源
- 支持数据源新增,变更,关闭,刻l新增租户,租户过期等等
- 支持恋更绑定关系,如配置升降级,迁移等等
精细化配置
- 连接池配置可以细化到数据源组内单数据库实例
可扩展性
- 和户与数据源绑定关系除配置方式外,可扩展绑定策略
- 租户与schema绑定关系除配置方式外,可扩展绑定策略
- 可为不同数据库实例配置不同类型连接池,可以扩展自定义连接池
- 读库负载均衡策略可扩展
实现多租户的设计原理,实际上是需要做到应用层和数据层的共享和隔离,然后通过一种路由机制,可以根据不同的策略,将用户的请求路由到指定的计算集群即可。
3.2路由插件设计分享-配置结构
- 松散配置
- 连接池属性多级配置
- 绑定关系配置
master:
url: jdbc:mariadb://1.1.1.2:3306/housekeeping?useUnicode=true&.characterEncoding=utf-8
username: *
password: *
driver-class-name: org.mariadb. jdbc.Driver
effective-pool-name: hikari
3.3路由插件设计分享-租户标识传递
- 过滤器,在当前线程中初始化HystrixRequestVariableDefault,并存入从header中获取的租户标识
- 可以加入需要在本次会话中传递的其他信息,如当前登录用户信息,语言环境等
- 在父线程中执行初始化,子线程中同样可以读取到父线程中设置的内容,需要在会话结束时手动清理,避免线程复用导致的一些列问题
3.4路由插件设计分享-租户路由信息绑定
- 配置优先,其次才是绑定策略,提供默认的Data Source以及Schema绑定策略,可扩展
3.5路由插件设计分享-为什么没有关于行隔离的内容
- 隔离粒度越细,要依赖的规则越多
- 行隔离不需要在所有的表中都加入租户标识
- 每一条数据都不是凭空创建的,创建业务数据所依赖的基础数据,在业务上应该是按租户隔离的。比如以团队为租户,部门依赖于团队,项目依赖于部门,这也是一种租户标识的传递方式,可以理解为依赖关系的传递
- 行隔离的处理应该依赖于业务,无法避免的为某些基础表要加入标识租户的字段,用于区分归属,这可以看作就是业务的一部分,当实际场景需要时,也可以为业务表冗余标识租户的字段
在SaaS架构中,注重的就是数据的 “独立性”,也是隔离性。如何在共有的一套系统架构与服务,仍可以保障客户的数据相对独立的正常使用。 一般地,以支持多租户的运行技术总体可分为三种:共享数据库,共享Schema;共享数据库,基于Schema隔离;数据库隔离。
3.6路由插件设计分享-不推荐在业务处理过程中切换数据源
- 当基于微服务架构进行设计时,如果需要通过切换库达到访问不同业务模块数据的目的,这应该是服务划分层面的问题,不应该在这里解决,应该在设计层面解决
- 虽然通过重新设置租户标识,可以达到目的,但是不推荐这么使用
到这里,可能有小伙伴要问了为什么不推荐重新设置租户标识,我简单谈谈我的看法:
1、这是架构设计层面出现的问题,而就应该在架构层面解决,不应该放在业务逻辑层面解决
2、通过重置租户标识太费时费力,投入的成本太大,不利于整体业务的开发
4.1插件的演进方向-演进
- SDK模式始终有其局限性,正在规划中的sidecar版本,将具有一些SDK模式不具有的特性,旨在跨语言,更系统,更友好,可便捷的解决租户数据路由的问题
还要特别注意的是,统一连接池管理、统一资源管理、可视化、资源分配策略、应用层无感知、读写分离策略、路由服务、负载均衡策略、动态数据源、数据迁移支持这些都是路由服务的功能和特点哦。
总结
- 侵入性小,无需修改已有业务代码
- 改造代价小,只需维护指定路径下的配置即可
- 配置简单,松散型配置,按业务需求随意维护租户数据源的绑定关系
- 即插即用,只需引入插件,维护配置,开启开关即可
- 另外一种模式的路由解决方案,跨语言,更便捷的解决租户数据路由的问题
这是老师对于上述内容给出的四点总结,主要归纳了SaaS应用侵入性小、改造代价小、配置简单、即插即用、可跨语言这五个方面的特点。
我在给出自己的一些总结:saas静态路由与saas动态路由方式。静态路由是手工配置的路由信息。当网络的拓扑结构或链路的状态发生变化时,工程师需要手工去修改路由表中相关的静态路由信息。静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。静态路由方式是目前使用较多的路由方式,在组网 方案方案设计的时候,企业的IT根据内网规划提前给出各个点的静态路由IP信息,运营商根据企业的要求配置路由设备,开通网络。动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际实际情况的变化适时地进行调整。动态路由机制的运作依赖路由器的两个基本功能:对路由表的维护;路由器之间适时的路由信息交换。动态路由方式我们也称之为BGP方式,这种方式相对静态路由方式可以自由的控制路由,调整或增加路由不需要经过运营商。
直播课到这里就结束啦,介绍了《SaaS应用开发》的学习路径,感兴趣的小伙伴们可以通过扫码或者访问链接来进行学习。
大家如果对我的干货总结有不同的看法,欢迎在下方回帖或者与我私信进行讨论哦~
- 点赞
- 收藏
- 关注作者
评论(0)