PostgreSQL 多租户

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

PostgreSQL 多租户

作者

digoal

日期

2016-11-07

标签

PostgreSQL , 多租户 , schema , DATABASE , PDB , Oracle 12c


背景

Oracle 12c提出了数据库多租户的概念,即PDBs(私有数据库),因为早期Oracle的设计是以schema为隔离的,schema的隔离不够彻底,原因是通过赋权就很容易获得不同SCHEMA下的数据。

PDB的设计与PostgreSQL的Database概念非常相似,所以PostgreSQL实际上很适合用来实现类似PDB的场景,也即是多租户的场景。

用户可以参考我写的《PostgreSQL 逻辑结构 和 权限体系 介绍》

实际上如果不需要彻底的隔离,可以考虑继续使用schema。

使用数据库或SCHEMA作为多租户的基础,各有优劣。

基于数据库的多租户

1. 优点

数据库隔离较为彻底,从认证层面就开始隔离了,数据库与数据库之间也无法直接访问,必须要登陆到对方的数据库中才能访问对方的数据(即使使用fdw, dblink也是有登陆的过程的)。

登陆时可以通过pg_hba.conf控制来源IP,用户是否有权限登陆目标库。

同时在数据库中的权限体系中还可以配置是否允许用户访问目标库,或者在目标库创建SCHEMA。

2. 缺点

因为每个数据库对应了各自的元信息,大概有几百个文件,所以如果租户比较多,数据库也会比较多。

基于schema的多租户

1. 优点

单个数据库,多个SCHEMA的方式,比较轻巧,如果是企业私有的多租户,可以这样使用。

通过数据库的权限体系隔离用户,访问不同SCHEMA。

2. 缺点

无法通过pg_hba.conf控制schema的权限,权限隔离可能不够彻底。

用户可通过查看元表,观察到其他schema的对象,定义等信息,不安全。如果是企业内部私有的,并且这部分缺陷不敏感时可以使用。

创建租户和删除租户需要产生大量元数据,或删除大量元数据,可能导致STANDBY长时间延迟。详见

《PostgreSQL DaaS设计注意 - schema与database的抉择》

例子

基于database

创建用户
create role 租户名 login ...;


配置防火墙
pg_hba.conf
host 数据库 用户 来源IP md5


从模板创建数据库
create database db with template templatexxx;


回收权限
revoke all on database db from public;


赋权
grant all on database db to 租户;

基于schema

创建用户
create role 租户名 login ...;

创建schema
create schema xx;

回收权限
revoke all on schema xx from public;

赋权
grant all on schema xx to 租户;

以schema为例的多租户路由选择

例如通过客户端application_name或者客户端IP地址,区分不同的租户。

每个租户的模板完全一样,只是使用了不同的schema。

客户使用search_path修改路径,完成对路由的选择。

一套程序,完成多租户的方法:

建立会话后,首先选择路由(即根据客户端IP或设置的application_name,设置对应的路由)。

也可以每次设置路由(开销大,较浪费)。

后续的操作则会自动匹配对应的schema.

路由函数举例

以application_name为schema命名

create or replace function public.route() returns void as $$
declare  
begin
  execute 'set search_path='||current_setting('application_name')||', "$user", public' ;
end;
$$ language plpgsql strict;
postgres=# select public.route();
 route 
-------

(1 row)

postgres=# show search_path ;
      search_path      
-----------------------
 psql, "$user", public
(1 row)

接下来的SQL都会首先搜索psql中的对象。

如果schema很多,而且要经常调用,建议写成C function,使用更高效的匹配算法,例如hash search。

在业务函数中封装选择函数的例子。

create or replace function 业务函数(参数) returns  xx as $$
declare
  xx;
begin
  perform 路由函数(影响路由选择的参数);
  业务SQL;
  ////
end;
$$ language plpgsql strict;
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB PostgreSQL版:Oracle兼容的高性能数据库
PolarDB PostgreSQL版是一款高性能的数据库,具有与Oracle兼容的特性。它采用了分布式架构,可以轻松处理大量的数据,同时还支持多种数据类型和函数,具有高可用性和可扩展性。它还提供了丰富的管理工具和性能优化功能,为企业提供了可靠的数据存储和处理解决方案。PolarDB PostgreSQL版在数据库领域具有很高的竞争力,可以满足各种企业的需求。
|
6月前
|
监控 关系型数据库 Go
《打造高可用PostgreSQL:策略与工具》
《打造高可用PostgreSQL:策略与工具》
88 0
|
7月前
|
Cloud Native 关系型数据库 MySQL
如何实现AnalyticDB MySQL多租户功能
本场景介绍如何通过云原生数据仓库AnalyticDB MySQL实现多租户资源隔离的功能。
174 0
|
7月前
|
关系型数据库 分布式数据库 PolarDB
如何一键本地部署PolarDB for PostgreSQL
《PolarDB for PostgreSQL动手实践》系列第一期,带您体验如何本地一键安装快速部署云原生开源数据库PolarDB for PostgreSQL。
572 0
|
11月前
|
存储 SQL 负载均衡
【PostgreSQL架构】PostgreSQL的最佳群集高可用性方案
【PostgreSQL架构】PostgreSQL的最佳群集高可用性方案
|
存储 SQL 关系型数据库
【数据库选型】ClickHouse vs PostgreSQL vs TimescaleDB
在过去的一年里,我们不断听到的一个数据库是ClickHouse,这是一个由Yandex最初构建并开源的面向列的OLAP数据库。
|
SQL 监控 Oracle
【数据库架构】PostgreSQL常用的开源扩展
如果您使用的是PostgreSQL,您可以利用优秀的开源扩展来根据您的业务需求增强或添加功能。这些扩展是由其社区积极开发的,这些社区与PostgreSQL社区本身是分开的。PostgreSQL有数百个OSS扩展,其中许多是在生产环境中实现的。
|
存储 前端开发 关系型数据库
7天突破PolarDB for PostgreSQL— 第二讲 PolarDB-CEPH部署
分享人:思才,阿里云智能数据库产品事业部PolarDB产品部
7天突破PolarDB for PostgreSQL— 第二讲 PolarDB-CEPH部署
|
关系型数据库 MySQL 数据库
PostgreSQL准备和部署
MySQL和PostgreSQL——两个开放源码的关系数据库管理系统,每个系统都有自己的粉丝。多年来,MySQL一直是PostgreSQL社区的乐趣之源——默认的、非常宽松的SQL模式、缺乏对更复杂连接的支持、没有位图索引等等。
1525 0
|
存储 SQL 分布式计算
PolarDB for PostgreSQL 内核解读 :HTAP架构介绍
在 PolarDB 存储计算分离的架构基础上,我们研发了基于共享存储的MPP架构具备了 HTAP 的能力。
666 0
PolarDB for PostgreSQL 内核解读 :HTAP架构介绍