云平台之多租户

标签: 平台 多租户 | 发表时间:2015-03-31 20:50 | 作者:lishehe
出处:http://blog.csdn.net

云平台之多租户

在云领域我们经常会听到一个词:多租户。这个词在不同的语境中有着不同的含义,本文将介绍云平台中的多租户的概念以及实现多租户支持的思路。

什么是租户

刚开始接触这个概念时,你肯定感觉“租户”这个词怪怪的,但如果我们换个词,我相信你马上就有感觉了,这个词就是“客户”(这里的客户指的就是商业上面的 客户)。一个租户就是一个客户,比如我们开发的服务是给 XXX 企业使用的,那该企业就是我们的一个客户/租户;如果这个服务是面向互联网的,那么使用该服务的每个互联网用户都是一个客户/租户。

为什么需要多租户支持

开发者辛辛苦苦开发出一个服务,提供给了个人/企业使用,这样就完事了么?当然不应该只是这样,我们开发出一个服务,最好是能够 同时提供给 多个个人/企业使用,而且这些客户最好是共享同一套服务运行时(Runtime),这样可以大大降低服务的运维成本:

  • 服务运行时如果分开,则运维的成本与客户数成正比(比如更新部署大量客户的场景)
  • 节省资源(将服务所需资源利用最大化:运维团队统一、硬件使用)

另外,这样也可以降低服务的开发成本:

  • 我们只需要考虑如何实现单用户的服务逻辑:业务逻辑对应其所有客户都是相同的,无论什么客户来使用,程序提供的服务都是一样的。进一步说,在业务层面我们开发这个服务时理论上不需要考虑多客户支持,我们只用关注该服务的业务逻辑如何实现
  • 多客户的管理功能可以进行统一:开发者应该不用考虑客户管理功能,这部分应该是由云平台统一提供的

多租户场景举例

假设我们要开发的服务是一个博客平台,这个服务是面向互联网用户的,每个互联网用户都是我们的客户(一个用户就是一个租户)。

在不支持多租户的环境中,为了隔离每个用户的数据,至少我们在设计数据库表时会考虑大多数表都存在一个 user_id 字段,用于  CRUD 数据时使用该字段进行 用户隔离

比如现在的业务是“发布文章”,需要将文章数据保存在 article 表中,在实现时实际上我们关注了两件事情:

  1. CRUD:这是业务逻辑实现的一部分
  2. 用户隔离:需要加入 user_id,做业务关联

1 是“纯”业务逻辑部分的实现,这是必须实现的;2 则是为了多用户博客平台而需要考虑的,这并不是博客平台本身的业务逻辑。这里如果能得到平台的多租户支持,就不用考虑第 2 点了,这样可以将注意力集中于第 1 点业务逻辑实现上,这是非常典型的一个多租户场景。

多租户支持

我们可以这样理解多租户支持:

  • 从服务提供的角度看,我们开发的一个服务运行时可以同时提供给多个客户使用,并且客户之间的数据/状态是保持隔离的
  • 从服务使用的角度看,我和你可以作为不同的客户同时使用同一个运行的服务,此时我们使用该服务完成的业务是相互不影响的,就好像我们在使用自己独享的服务一样

那么这个服务就是支持多“客户”的,即该服务支持多租户。这里的“服务”可以是应用,可以是 SaaS 平台,也可以是 PaaS 平台。不过按目前我们熟悉的云平台看,应用的多租户支持应该是最常规的,这是因为应用面向的是用户,这个群体是很庞大的。

多租户支持从实现的角度看,“ 是一种软件架构技术”,之所以强调它是属于架构层面是因为要实现它必须在做技术架构时就要将其考虑在内。

一种租户模型

本文一开始我们提到使用“客户”来置换“租户”来理解租户的含义,再从“商业”这个方面来看的话,我们不难发现租户其实就是其云环境中的商业模式实现的一部分。商业模式是多样的,这意味着租户的划分也是多样的,这里我们描述其中一种可能的租户栈:

  • 应用程序是提供给用户使用的,对于应用来说,用户就是它的租户(这一点业界比较统一)
  • SaaS 提供的服务是给应用开发商使用的,对于 SaaS 来说,应用开发商就是它的租户
  • PaaS 提供的服务是给应用系统使用的,对于 PaaS 来说,相关应用的组合就是它的租户

SaaS 和 PaaS 面向的是开发商、系统等非端用户角色,这一部分一般是由云平台开发者决定的(捆绑商业模式),特别是私有/企业云平台一般不会考虑形如“在 PaaS 平台上支持运行多个 SaaS 平台”这样的场景。所以下面我们更多的是围绕“应用对多租户支持”进行讨论。

应用多租户

应用多租户的使用场景前面已经介绍过了,现在假设我们是一个云平台开发者,为了满足支持应用支持多租户的需求,在云平台中我们需要提供下面几个支持:

  • 租户管理:CRUD,统计
  • 租户隔离/共享的服务:队列、缓存、数据库等
  • 租户隔离的统计:日志、配额

这些支持可以分为两类:

  1. 租户的管理:不会直接面向应用的端用户,面向的是应用的运维,平台应该提供具体实现
  2. 租户数据/状态的隔离:从请求开始就应该可以区分这个请求是来自于哪个租户,请求处理时在调用链路上也需要带上租户上下文,数据的存取是按照租户隔离的,调用平台提供的服务时也是租户隔离的

第 1 点比较容易实现,这是一个业务模型方面的问题,可以根据业务域来抽象租户模型,比如企业应用一般是按照“组织机构”来区分租户的;

第 2 点是一个纯技术的需求,需要在平台技术实现上支持按“租户”的运行时 隔离,我们强调的是隔离,因为在实现时我们要达到的目标就是隔离,只不过这里是按租户(租户只是一个商业概念,技术层面我们最好能够将其进行抽象,尽量减小商业模式多样化对技术架构的冲击),我们可以将租户映射到一个抽象概念上,这个抽象概念可以实现我们的隔离需求。

命名空间

前面我们讨论多租户支持都是自上而下的:从应用多租户需求到数据隔离实现;现在我们再换种视角,自下而上:先通过命名空间隔离数据,再将命名空间提供给应用多租户的实现使用。自下而上的目的主要是在平台内部,我们可以通过“命名空间”来进行数据/状态隔离的抽象,最终的理想情况是命名空间不仅能够支持应用多租户实现,还能够可选择性地暴露命名空间 APIs,让应用可以进行某些数据的隔离(比如缓存),方便业务实现。

隔离的实现

租户请求从开始到结束平台都需要知晓这个请求映射的命名空间,从请求处理栈我们可以这样大致划分一下:

  • 负载均衡器(LB)
  • 应用容器(APP)
  • 平台服务接口(RPC)
  • 平台服务实现(DB/Cache/MQ....)

在这个栈中每一层平台都是需要知道这个请求对应的命名空间的。平台可以提供一个统一登录的服务,将租户信息映射为命名空间并保存到用户会话中,这样每次该用户的请求:

  • 过 LB 时就可以区分出命名空间来
  • 在 APP 容器中可以通过会话
  • RPC 时传递命名空间
  • 根据服务的不同进行命名空间实现(例如 DB 根据命名空间使用不同的 Schema,MQ 根据命名空间使用不同的队列)

这里我们使用的隔离实现基本思路是“Shared application”,即多租户共享一个应用,对应一套基础设施(请参考: 将单租户应用程序转换为多租户应用程序)。

 一种平台设计

 前面谈了这么多,现在我们可以脑补出一种支持应用多租户的云平台:

多租户云平台设计

(这里的设计思路也包含了有的租户要求独享资源的场景)

总结

  • 租户和客户的概念类似
  • 对多租户的支持我们一般指的是应用对多租户的支持
  • 在技术层面支持多租户需要实现数据/状态隔离
  • 使用命名空间进行隔离实现抽象
  • 租户到命名空间的映射可由平台集成
作者:lishehe 发表于2015/3/31 12:50:21 原文链接
阅读:54 评论:0 查看评论

相关 [平台 多租户] 推荐:

云平台之多租户

- - CSDN博客推荐文章
在云领域我们经常会听到一个词:多租户. 这个词在不同的语境中有着不同的含义,本文将介绍云平台中的多租户的概念以及实现多租户支持的思路. 刚开始接触这个概念时,你肯定感觉“租户”这个词怪怪的,但如果我们换个词,我相信你马上就有感觉了,这个词就是“客户”(这里的客户指的就是商业上面的 客户). 一个租户就是一个客户,比如我们开发的服务是给 XXX 企业使用的,那该企业就是我们的一个客户/租户;如果这个服务是面向互联网的,那么使用该服务的每个互联网用户都是一个客户/租户.

一种多租户系统架构

- - 企业架构 - ITeye博客
         去年的时候,因为某些特殊原因,有幸带了一个组,参与了B2B平台的开发. 说是B2B平台,因为这套程序开发完了后,可以拿给多个客户使用. 客户可以搭建一套具有京东商城风格,那样的网站. 然后允许商家在网站上注册,开店,或者卖东西,买东西,网站的用户定位为商家.          在需求分析完后,分为了三个组.

多租户环境中的 TCP 限速(基于 iptables)

- - 卡瓦邦噶!
我们有个服务以类似 SideCar 的方式和应用一起运行,SideCar 和应用通过 Unix Domain Socket 进行通讯. 为了方便用户,在开发的时候不必在自己的开发环境中跑一个 SideCar,我用 socat 在一台开发环境的机器上 map UDS 到一个端口. 这样用户在开发的时候就可以直接通过这个 TCP 端口测试服务,而不用自己开一个 SideCar 使用 UDS 了.

轻量级 Kubernetes 多租户方案的探索与实践

- - IT瘾-dev
作者:任静思,火山引擎云原生工程师. 本文整理自火山引擎开发者社区 Meetup 第八期演讲,主要介绍了字节跳动轻量级 Kubernetes 多租户方案 KubeZoo 的适用场景和实现原理. Kubernetes多租户模型. 伴随着云原生技术的发展和推广,Kubernetes 已经成为了云计算时代的操作系统.

平台的逻辑

- - 胡泳的BLOG
              平台的逻辑.                      胡泳 郝亚洲. 这是一个言必称“平台”的商业语境,尤其是当平台和“商业模式”、“公司战略”联系在一起的时候. 但笔者想在这里首先纠正这两大认识误区,平台既不是“商业模式”,也不是“公司战略”,而是一种天然属性. 这种天然属性客观存在,但是能否展现出来却和主体的意愿、能力、外界的环境有很大关系,也即,企业需不需要做平台,有没有能力做平台和做平台的时机.

谈电商平台

- - 人月神话的BLOG
一个完整的电商平台模块本身应该如何划分,可以从两个维度来进行思考,一个维度是本身电商的端到端业务和流程角度出发,可以分为哪些大的阶段,每个大阶段可对应为模块;另外一个维度则是从电商业务中的核心主数据和业务单据出发,围绕数据来考虑模块的划分. 电商平台核心模块从基础数据层面包括了产品管理,客户管理,供应商,经销商管理,在产品和供应商管理中可能又会拆分单独的价格库模块,维护产品价格和价格策略信息.

监控平台-Hawtio

- - 人月神话的BLOG
Hawt IO是一个新的可插入式 HTML5 面板,设计用来监控 ActiveMQ, Camel, Karaf, Fuse Fabric, Tomcat 和其他系统. 可通过其提供的 一堆插件提供额外的监控. 访问地址: http://hawt.io/. 由于Servicemix本身是基于Karaf组件容器的,因此可以使用Hawtio来监控Sericemix和Camel,对于Hawtio在Servicemix下的安装,一种方法是直接内嵌式安装,一种是采用单独的服务器进行监控平台的安装.

EA:FIFA 2012登陆Mac平台

- 洞箫 - cnBeta.COM
FIFA隶属全球最大互动娱乐软件开发商EA旗下,这个足球游戏的受欢迎程度已经不必过多介绍了. 虽然很流行,但是喜欢FIFA的Mac用户却一直为此抱怨,因为它一直都没有能够进入Mac平台当中,直到今天.

Zynga CityVille进驻Google+平台

- 志强 - 月光博客
  据Zynga官方博客报道,Zynga旗下的知名社交游戏“CityVille”已经进入谷歌社交网站Google+,CityVille目前是Zynga在Facebook上用户数最多的社交游戏,每月活跃用户数量超过1亿,但却无法从中国访问.   Zynga表示,“CityVille现已成为该公司在Facebook上推出的最大的社交游戏.

桔子平台介绍

- 高春辉 - 新媒体营销观察站
从爱德威离开到加入九城已经接近一年了,很多朋友问我现在在做的是什么项目,都以为是在做九城游戏中心,因为这个项目名声在外,大家都知道,现在我们的项目也已经正式基本完工,在11月3日4日北京CSDN开发者大会上,就将正式对外推出了,产品名字---桔子,我现在QQ群的名字就叫桔子,很多人第一反应是桔子酒店,第二是桔子手机,说明桔子酒店的PR做的相当到位嘛,接下来就看我们这颗“桔子”的发挥了.