暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关系数据库(RDBMS)多租户实现

零君聊软件 2019-11-24
290

关系数据库(RDBMS)在传统的OLTP业务中具有很重要的地位。随着云的到来以及逐渐普及,RDBMS虽然仍很重要,但却也遇到了很多挑战。如何使传统的RDBMS适应cloud环境下多租户(multi-tenancy)场景,就是一个很大的挑战。


SQL标准中被遗忘的概念

一提到RDBMS,很多开发者接触最多的就是Database、Table/View、Column这几个不同粒度的概念。但实际上SQL标准中定义了下面几个相关的概念:

  • Cluster

  • Catalog

  • Schema

  • Table

  • Column


根据SQL-92(如下)中的定义,Cluster是Catalog的集合,而Catalog又是Schema的集合。Schema里面又可以包含Table、View等。

    http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

    所以这几个概念的粒度从大到小的顺序为:

    Cluster > Catalog > Schema > Table > Column


    目前最新SQL标准是SQL:2019,虽然是公开(public)的,但并不是免费(free)的。在网上能免费得到的只有SQL-92标准。

    数据库厂商对Catalog和Schema的支持

    各家数据库厂商(vendor)对Catalog和Schema的支持不尽相同,下面这个文档做了一个简单的总结,

      https://docs.oracle.com/cd/E13162_01/odsi/docs10gr3/datasrvc/Database-specific%20Catalog%20and%20Schema%20Considerations.html



      下面对市场占率前三名的数据库(Oracle、MySQL、MS SQL Server)分别简要说明。


      在Oracle中,并不支持Catalog,只支持Schema。Oracle中的schema其实就是user。Oracle中可以创建多个user,每个user包含的数据库对象(如table、view)是相互隔离的。这里额外多说一句,Oracle 12c开始引入了PDB(pluggable database)的概念,可以在一个database中创建多个PDB,分配给不同的tenant用户。关于如何在Oracle 12c中创建和删除PDB,可以参考零君以前写的一篇文章:

      在Oracle12c中删除并重建pluggable DB


      MySQL中也不支持Catalog。在MySQL中,schema与database是同义词。在MySQL中"create database"和“create schema”是等效的。这里直接贴上MySQL官网上文档中的一句原文:

      In MySQL, physically, a schema is synonymous with a database. You can substitute the keyword SCHEMA instead of DATABASE in MySQL SQL syntax, for example using CREATE SCHEMA instead of CREATE DATABASE.


      在Microsoft SQL Server中,Catalog等同于Database,database的名称也就是catalog的名称。schema就是database或catalog的owner,例如database是dbo创建的,那么schema的名称就是dbo。


      多租户(multi-tenancy)实现
      在cloud环境对外提供服务,就不得不考虑multi-tenancy,因为需要隔离不同tenant的数据。RDBMS的multi-tenancy实现,就离不开catalog和schema这两个概念。总的来说,RDBMS实现multi-tenancy,有两种思路:

      • Catalog-based multi-tenancy

      • Schema-based multi-tenancy


      因为不同的数据库厂商对Catalog和Schema的支持不尽相同,所以具体实现的时候要结合具体的数据库厂商来考虑。


      但是如果要实现一个通用的multi-tenancy解决方案,则需要兼顾Catalog和Schema这两个概念,遵循SQL标准。具体来说,一个generic的framework,应该通过Catalog或Schema来隔离不同租户(tenant)的数据。对于上层应用需要暴露各种标准(如JDBC、ODBC、REST、OData、WSDL等)的接口。对下则需要兼容适配不同的数据库产品,也就是实际的数据可以存放在不同的数据库产品(如Oracle、MySQL、DB2等)中。大致架构图如下:

      注意,这只是一个high-level的结构图,这里的framework只是显示了SQL/DBMS相关的概念。要实现一个真实的framework,有很多方面需要考虑,比如安全(security)、SQL优化(optimizing)、数据建模(modelling)、集群(cluster)等等。另外,对于最底层数据源的管理也需要很强的专业知识和技能。


      总结

      本文对RDBMS在cloud环境下如何实现多租户(multi-tenancy)进行high-level的分析,并给出了一个参考架构模型。本文只是起到抛砖引玉的作用,实际产品化则有很长的道路。


      --END--

      文章转载自零君聊软件,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论