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

Postgresql多租户实践--使用多个Database篇

长河的笔记 2020-07-18
1592

目标:为每个租户或应用提供一个私有的独立database,多个Database之间的数据存放物理隔离。


本文实验环境:PostgreSQL11.8


步骤:

创建测试数据库testdb和用户bert.

postgres=# create user bert encrypted password 'abc123';
CREATE ROLE


postgres=# create database testdb owner bert;
CREATE DATABASE
复制


在PG中,默认情况下,新建的用户隶属于public角色,是可以登录任意database的。针对本文的多租户架构,要求每个应用拥有独立Database的场景,我们要阻止这种情况发生,只允许某些特定的用户登录特定Database。这可以通过对特定Database回收public的connect权限实现。可以在一个事务内完成所有DDL,确保所有操作要么全部成功,要么全部失败。如下:

postgres=# \c testdb
You are now connected to database "testdb" as user "postgres".
testdb=# begin;
BEGIN
testdb=# revoke connect on database testdb from public;
REVOKE
testdb=# grant connect on database testdb to bert;
GRANT
testdb=# commit;
COMMIT
复制


测试:

通过上述命令在testdb上收回public的connect权限后,其它用户就不能够连接到testdb上了(super user除外),这正是多租户架构中采用独立Database所需要的。

testdb=# create user bob encrypted password 'abc123';
CREATE ROLE
testdb=# \q
[postgres@bighouse3 ~]$
[postgres@bighouse3 ~]$ psql -h bighouse3 -p 15432 -U bob testdb
Password for user bob:
psql: FATAL: permission denied for database "testdb"
DETAIL: User does not have CONNECT privilege.
[postgres@bighouse3 ~]$ psql -h bighouse3 -p 15432 -U bert testdb
Password for user bert:
psql (11.8)
Type "help" for help.
testdb=> 
复制


延伸:

与采用多个schema的多租户架构相比,采用独立的Database更安全和方便,其它人不能看到你Database下的任何对象信息,备份和恢复也更方便。


这篇笔记参考自:PostgreSQL 10 Administration Cookbook



相关文章:

Postgresql多租户实践--使用多个Schema篇

Postgresql多租户实践--使用多个Database篇

Postgresql多租户实践--使用多个Instance篇

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

评论