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

PostgreSQL支持多租户吗

原创 多米爸比 2020-03-11
4331

下面这个帖子讨论了数据库多租户及PostgreSQL是否支持多租户
https://m.pgfans.cn/q?id=174

租户在数据库领域表示一个数据库的“用户”,他“租用”了数据库的部分资源。
多租户是一种软件架构,其定义是:在一台服务器上运行单个应用实例,它为多个租户提供服务。

常见的多租户架构三种模式:
1)独立数据库
一个租户独享一个数据库实例,它提供了最强的分离度,租户的数据彼此物理不可见,备份与恢复都很灵活;

2)共享数据库、独立Schema
将每个租户关联到同一个数据库的不同 Schema,租户间数据彼此逻辑不可见,上层应用程序的实现和独立数据库一样简单,但备份恢复稍显复杂;

3)共享数据库、共享Schema、共享数据表(数据table级实现)
租户数据在数据表级别实现共享,它提供了最低的成本,但引入了额外的编程复杂性(程序的数据访问需要用tenantId来区分不同租户),备份与恢复也更复杂。

上面的三种模式在PostgreSQL里是否支持,如何实现?

第一种:根据上下文理解在PostgreSQL里更准确的说是cluster实例,对应一个端口。这种方式每个租户使用的是不同的数据库服务进程。

第二种:很多数据库都支持按逻辑模式管理数据,PostgreSQL里通过search_path,自动绑定同名的数据库用户和Schema。

第三种:表级别数据共享,表结构相同,行数据独立,PostgreSQL从9.5开始内置行级安全策略,支持应用级租户方案,没有额外的编程,对应用程序访问友好,Java应用层结合Spring多数据源切换更加方便。

下面是行级安全策略的简要配置

1.应用表需要增加内部字段,例如pg_user,并设置默认值
alter table XXX COLUMN pg_user set default current_user;

2.表启动行级安全特性
alter table XXX enable ROW LEVEL SECURITY ;

3.创建策略,每个租户只能看到自己的数据,只能修改自己的数据:
create policy XXX on XXX using(pg_user=current_user) with check(pg_user=current_user);

上面是针对单张表的设置,比较麻烦的是如果表很多,每个都需要配置,也可以写脚本或者通过事件触发器实现。

最后修改时间:2020-03-11 10:44:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论