PostgreSQL 多租户

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介:

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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
Linux 异构计算 Python
【linux】nvidia-smi 查看GPU使用率100%
nvidia-smi 查看GPU使用率一直是100%解决办法
【linux】nvidia-smi 查看GPU使用率100%
|
2月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
622 0
|
7月前
|
域名解析 存储 网络协议
域名解析的终极指南:从基础到进阶,彻底搞懂 DNS 记录
域名解析是网站运行的基础,正确配置DNS记录至关重要。本文从基础到进阶全面解析DNS知识,涵盖A、AAAA、CNAME、MX、TXT、CAA等常见记录类型及其应用场景。通过学习,你将了解DNS的工作原理,掌握如何优化域名配置,确保网站与邮件服务高效运行。无论搭建个人博客还是企业官网,本文都能助你轻松搞定域名解析!
1617 0
|
3月前
|
JSON API 数据格式
抖音商品列表API秘籍!轻松获取商品列表页面数据
抖音商品列表API是抖音开放平台的核心电商接口,支持按分类、关键词、销量等条件筛选商品,具备分页、排序、数据过滤等功能,适用于电商整合、竞品分析等场景。接口返回JSON格式数据,包含商品列表、总数及分页信息,提供Python请求示例,便于开发者快速接入。
|
10月前
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
5277 4
|
9月前
|
XML 机器学习/深度学习 人工智能
CLaMP 3:音乐搜索AI革命!多模态AI能听懂乐谱/MIDI/音频,用27国语言搜索全球音乐
CLaMP 3是由清华大学团队开发的多模态、多语言音乐信息检索框架,支持27种语言,能够进行跨模态音乐检索、零样本分类和音乐推荐等任务。
620 1
CLaMP 3:音乐搜索AI革命!多模态AI能听懂乐谱/MIDI/音频,用27国语言搜索全球音乐
|
消息中间件 Arthas Java
线上kafka消息堆积,consumer掉线,怎么办?
线上kafka消息堆积,consumer掉线,怎么办?
390 0
|
Shell
shell获取命令输出和返回值
shell获取命令输出和返回值
2711 0
|
Java 数据库连接 Apache
Java进阶-主流框架总结与详解
这些仅仅是 Java 众多框架中的一部分。每个框架都有其特定的用途和优势,了解并熟练运用这些框架,对于每一位 Java 开发者来说都至关重要。同时,选择合适框架的关键在于理解框架的设计哲学、核心功能及其在项目中的应用场景。随着技术的不断进步,这些框架也在不断更新和迭代以适应新的开发者需求。
537 1