关系数据库(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--