PostgreSQL码农集散地

扯蛋,PG不适合SaaS多租户业务吗?是姿势不对!

参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;


SaaS业务数据库设计: Schema与Database的优劣

一位网友遇到SaaS业务的数据库瓶颈问题, 在PG中有几万个database(每个数据库对应一个租户), 连接太多, 上千后性能就扛不住. 关于SaaS业务使用schema还是database的优劣我在下面两篇文章中有过详细介绍:

  • 《PostgreSQL 12 preview - schema与database的抉择续 - standby drop schema,drop database加速 - standby 延迟优化 - batch to 9.4》
  • 《PostgreSQL DaaS设计注意 - schema与database的抉择》

先轮论一论schema与database的优劣,参考 github.com/digoal/blog 文章如上

  • database隔离彻底, 但是连接池的连接不能跨db或跨role进行复用, 所以database多, 即使每个database就1个链接, 也可能会用到上千上万的链接.
  • schema隔离没有database彻底(指物理连接隔离), 但是呢, 只要user用同一个, db用同一个, 后端连接就能复用, 所以不会消耗太多连接.

如果能解决schema隔离不彻底的问题, 就能解决SaaS场景中几万个租户的隔离问题, 以及避免连接过多带来的性能损耗问题.

方法也简单: 那就是使用 set role.

例子

首先我们复现一下, 切换数据库或切换用户都是会切换连接的.

root@2545d62c4a90:~# psql  
psql (14.12 (Debian 14.12-1.pgdg110+1))  
Type "help" for help.  

-- 通过PID来观察是否切换了连接.   
postgres=# select pg_backend_pid();  
 pg_backend_pid   
----------------  
             95    
(1 row)  

  postgres=# \c postgres r1;  
You are now connected to database "

postgres" as user "r1".  
postgres=> select pg_backend_pid();  
 pg_backend_pid   
----------------  
             96  
(1 row)  

  postgres=> \c postgres r2;  
You are now connected to database "

postgres" as user "r2".  
postgres=> select pg_backend_pid();  
 pg_backend_pid   
----------------  
             97  
(1 row)  
postgres=> \c db postgres   
You are now connected to database "
db" as user "postgres".  
db=# select pg_backend_pid();  
 pg_backend_pid   
----------------  
            101  
(1 row)  

而在同一个连接中通过set role切换角色是不会断开连接的:

创建测试库, 每个SaaS客户的数据都放在这个数据库中  
create database db;  

  创建一个用于登陆的数据库角色, 所有的SaaS客户共用这个角色.  
create role r login noinherit;  

  创建2个不能登陆的角色, 用于隔离权限, 每个SaaS客户一个这样的角色.     
create role r1 nologin ;  
create role r2 nologin ;  

  将每个SaaS客户对应的角色都赋予给登陆角色  
grant r1 to r;  
grant r2 to r;  

  连接到db库, 并创建schema, 每个schema赋予给对应的SaaS隔离角色. 不同SaaS客户的数据分别放在不同的schema中.    
起到隔离作用.  
\c db postgres  
create schema r1 AUTHORIZATION r1;  
create schema r2 AUTHORIZATION r2;  

切换角色, pid没有发生变化, 说明后端连接被复用了.

db=# \c db r  
You are now connected to database "db" as user "r".  
db=> select pg_backend_pid();  
 pg_backend_pid   
----------------  
             61  
(1 row)  
db=> set role r1;  
SET  
db=> select pg_backend_pid();  
 pg_backend_pid   
----------------  
             61  
(1 row)  
db=> set role r2;  
SET  
db=> select pg_backend_pid();  
 pg_backend_pid   
----------------  
             61  
(1 row)  

观察权限隔离的情况, 我们的目的是让SaaS不同客户对应的数据库角色只能操作对应schema的数据, 起到隔离作用.

r不能访问r1,r2 schema.  
db=> set role r;  
SET  
db=> create table r1.t1(id int);  
ERROR:  permission denied for schema r1  
LINE 1: create table r1.t1(id int);  
                     ^  

  r1可以访问r1 schema.  
db=> set role r1;  
SET  
db=> create table r1.t1(id int);  
CREATE TABLE

  r2不能访问r1 schema, 只能访问r2 schema.   
db=> set role r2;  
SET  
db=> create table r2.t2(id int);  
CREATE TABLE  
db=> set role r;  
SET  
db=> select * from r1.t1;  
ERROR:  permission denied for schema r1  
LINE 1: select * from r1.t1;  
                      ^  
db=> select * from r2.t2;  
ERROR:  permission denied for schema r2  
LINE 1: select * from r2.t2;  
                      ^  
r1不能访问r2 schema, 只能访问r1 schema.   
db=> set role r1;  
SET  
db=> select * from r1.t1;  
 id   
----  
(0 rows)  

  db=> select * from r2.t2;  
ERROR:  permission denied for schema r2  
LINE 1: select * from r2.t2;  
                      ^  

已隔离,到此, 大功告成.

今日荐书


彩蛋:国产数据库周边生态

当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜90%老司机!!! 下面简单介绍一下国产数据库周边生态.

1、管控软件

鸣嵩(前阿里云数据库总经理 / 研究员)等大佬们创业创办的云猿生, 核心产品是KubeBlocks. 他们的理念是让管理数据库和搭积木一样简单, 如果你要管理很多套并且种类(OLTP\OLAP\NoSQL\KV\TS\MQ等)很多的数据库产品, 推荐首选.

  • https://github.com/apecloud/kubeblocks

PG中文社区核心委员唐成老师的公司乘数开源的Clup, 专用管理PostgreSQL和PolarDB的集群管理软件, 如果你要管理很多套数据库, 推荐选择. 并且Clup还提供了企业版、自研的连接池、分布式存储、一体机、备份平台等, 是企业用户推荐之选.

  • https://www.csudata.com/

若航开源的pigsty, 集成了300多个PG插件的PG集群和PolarDB集群管理软件, 如果你要管理很多套PG或PolarDB数据库, 且对插件有特别多的需求, 推荐选择.

  • https://pigsty.cc/zh/

2、审计监控诊断优化

翟总(曾经是我背后的男人)到海信聚好看后研发的 DBdoctor, 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.

  • https://www.dbdoctor.cn/

天舟老哥的核心产品Bytebase 是位于您和数据库之间的中间件。它是数据库 DevOps 的 GitLab/GitHub,专为开发人员、DBA 和平台工程师打造。

  • https://bytebase.cc/docs/introduction/what-is-bytebase/

PawSQL, SQL优化和诊断产品.  

D-Smart, Oracle老前辈白老大出品, 专注企业级市场, 将业界顶级DBA经验的产品化作品, 产品功能包括数据库监控、诊断、优化等.

  • https://www.modb.pro/db/567140

3、国产数据库IDE

IDE是开发者的必备工具,例如社区有pgAdmin, 国产IDE则可以看看老程序猿达刚老师的DeskUI:

  • https://www.deskui.com

4、数据同步&迁移&备份恢复

NineData, 老领导出去创业做的产品, 产品涵盖了数据同步、迁移、备份、比对、devops、chatDBA等.

  • https://www.ninedata.cloud/home

DSG, 非常老牌的数据库同步迁移企业级产品, 支持各种数据库的异构和同构迁移, 用他们的话说, 没有dsg搞不定的迁移, 比goldengate还牛.

  • https://www.dsgdata.com/

公开课

如果你对PolarDB学习感兴趣可以阅读这个公开课系列:

除了PolarDB还非常值得关注的几款PG栈国产数据库:

  • HaloDB(基于PG兼容PostgreSQL、Oracle、MySQL. http://www.halodbtech.com/ )、
  • IvorySQL(基于开源PG兼容PG、Oracle. https://www.ivorysql.org/zh-cn/ )、
  • ProtonBase(云原生分布式数仓. https://protonbase.com/ )、
  • 成都文武数据库(https://ww-it.cn)

参考文档点击阅读原文获得


感谢关注我的github (https://github.com/digoal/blog) 及视频号:

Image