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

Postgres数据库及其模式

在整个职业生涯中,我既曾在运行和管理超过百万个数据库的团队中工作过,也曾帮助客户将数据库分片并扩展到100TB。

Postgres是一个相当灵活的数据库,由于其灵活性,使得针对应用程序需求进行数据结构的设计可以有多种选择。在与当前和未来客户沟通时,如何设计和构建数据库是一个常见的话题。这里,我们将深入探讨在Postgres中构建数据库的一些灵活性及其相关术语,以及不同方法的利弊。

PART
01


以实例(instance)为开端

简单起见,我们定义运行Postgres的地方(不管是EC2还是自有的数据中心)为实例。可以使用LCX或cgroups划分实例的资源,或在其上运行Kubernetes将其完全容器化以实现对资源的进一步划分。若使用了Kubernetes,则在本文中,可认为容器即为实例。

PART
02


运行中的Postgres即为群集(cluster)

运行中的Postgres即为运行中的Postgres进程。有时你可能指的是运行中的数据库,但接下来你会发现,称其为数据库可能会导致混淆。运行中的Postgres一般会有一个基础备份(使用pg_basebackup)及针对该基础备份对相关的WAL文件进行归档的工具(如pgBackRest)。此备份及WAL文件涵盖Postgres群集的所有信息,且默认放在一起。

PART
03


Postgres群集内为数据库(database)

当使用数据库的时候,是连接到指定的数据库而非群集。来看一下Postgres连接串:
postgres://craig.PyLpvXPJUgzUBteEAKY@p.vcrwzi5u5beilpsgyy.db.postgresbridge.com:5432/mydatabase

其中:

  • craig:数据库用户名; 

  • PyLpvXPJUgzUBteEAKY:数据库用户对应的密码;

  • p.vcrwzi5u5beilpsgyy.db.postgresbridge.com:数据库所在主机名;  

  • 5432:数据库端口号;

  • mydatabase:数据库用户名;

其中,数据库部分可以是默认的Postgres数据库:postgres。如果使用超级用户连接到postgres数据库,则也可以创建新的数据库。数据库之间不连通(当然,可以使用外部数据封装器实现数据库之间的连接)。当对Postgres数据库使用pg_dump的时候,则仅针对指定的数据库,而基础备份和WAL是针对群集内所有数据库的。

一旦连接到指定的数据库,那么即可以开始对模式进行设计。

PART
04


Postgres数据库之内

术语模式(schema),与数据库类似,都比较容易混淆。大多时候,当提及模式的时候,可能是指在数据库内创建的表及其列。Postgres有个模式的概念,模式由数据库中的命名空间(namespace)逻辑区分。登录到数据库时默认是在public模式下,但如果使用的是PG15,则需要注意该版本对于public模式的限制变更。在Postgres内部,有所谓的search_path:

show search_path;
   search_path
-----------------
 "$user", public
(1 row)

可通过调整search_path的值在多个模式中依次检索匹配的表名。当然,也可以在执行查询时指定模式名。以下命令为查询在public模式下的orders表(与默认的search_path等效):

SELECT *
FROM orders;
 
SELECT *
FROM public.orders;

PART
05


群集,数据及模式

前面讲了一堆关于群集、数据库和模式的信息,接下来展示其实际的运用。

群集:运行Postgres本身的完整实例。须知,在基础备份及WAL中,整个群集的信息是放到一起的。因此,若想使用更细粒度的备份集或查询做一些事情,那么就需要考虑如何将相关的内容放到不同的数据库或模式中。总的来说,90%的应用程序使用仅包含一个数据库和一个模式的群集。

数据库:用以完全隔离数据。假设有多个不同的应用程序,且无需关心对其连接的管理,那么数据库则是分离不同应用程序访问数据的好方法。例如,可以使用专用的博客数据库,专用的事件日历数据库以及专用的CRM数据库。所有这些数据库均为独立且互不可交互的。

模式:可用于对相同表不同的数据进行分离。大多数情况下,可能并不会涉及到对所有模式下信息的访问,但对于生成对外报告来说,可能就另当别论了。其中最常用的一种模式是多租户模式,即对不同的客户建不同的模式。这些模式下的所有表可能结构都是一致的,且可以方便的实现跨客户的数据分析。

因为在Postgres中的某些术语可能与通用术语的含义有一些不同,故而希望这篇文章能对Postgres中经常谈及的术语给与读者一个很好的入门了解。

点击此处阅读原文

↓↓↓

文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论