跳转到主要内容

1 关于 PostgreSQL

PostgreSQL 的历史、许可、可靠性、SQL 支持、可扩展性,以及数据库背后的社区。

PostgreSQL 是功能最丰富的自由开源数据库系统。它最初诞生于学术环境,多年来成功凝聚了庞大的开发者社区。如今,PostgreSQL 已具备大多数用户所需的全部功能,世界各地都在广泛使用它构建高负载、业务关键型系统。

历史回顾

今天的 PostgreSQL 源自 POSTGRES 项目,项目由加州大学伯克利分校教授 Michael Stonebraker 主持。在此之前,Michael Stonebraker 曾主持开发 INGRES,它是最早的关系数据库系统之一。POSTGRES 旨在重新思考之前的工作,解决 INGRES 僵化的类型系统所带来的局限。

项目始于 1985 年。到 1988 年,已有多篇学术论文发表,介绍其数据模型、POSTQUEL 查询语言(当时 SQL 尚未成为公认的标准)以及数据存储结构。

POSTGRES 有时被视为所谓的后关系数据库系统。关系模型长期以来因其局限而受到批评,但这些局限是换取严谨与简洁不可避免的代价。随着计算机技术渗透到生活的各个领域,新型应用程序不断涌现,数据库也需要支持自定义数据类型,以及继承、创建和管理复杂对象等特性。

这个数据库系统的第一个版本于 1989 年问世。此后几年,系统不断改进和增强,但在 1993 年发布 4.2 版本后,项目便终止了。然而,尽管项目已正式取消,加州大学伯克利分校校友 Andrew Yu 和 Jolly Chen 仍利用其宽松的 BSD 许可证和开放的源代码,在 1994 年重启了项目并继续开发。他们用当时已成为公认标准的 SQL 替换了 POSTQUEL 查询语言,项目也更名为 Postgres95。

到了 1996 年,Postgres95 这个名字显然难以长久使用,于是项目选用了新名字:PostgreSQL。这个名字既体现了它与原始 POSTGRES 项目的联系,也体现了对 SQL 的采用。这个名字可能不太好念,但我们仍应将它读作“Post-Gres-Q-L”,或者简称“postgres”,而不是“postgre”。

PostgreSQL 的首个发行版沿用原来的编号体系,版本号为 6.0。随着项目发展,一小群活跃用户和开发者开始接手管理工作,这个群体被称为 PostgreSQL Global Development Group(PostgreSQL 全球开发组)。

开发

关于 PostgreSQL 新版本开发与发布的所有重大决策,都由核心团队(Core team)作出。该团队目前由七人组成。

除了偶尔参与的贡献者,还有一批持续为 PostgreSQL 作出重要贡献的核心开发者,他们被称为主要贡献者(major contributors)。另有一批提交者(committers),拥有源代码仓库的写入权限。随着新开发者加入社区、其他开发者离开,这些群体的成员也在不断变化。当前的开发者名单公布在 PostgreSQL 官方网站上:postgresql.org/community/contributors。

俄罗斯开发者对 PostgreSQL 的贡献十分突出。在俄罗斯开发者如此广泛参与的全球开源项目中,它可以说是规模最大的一个。

来自克拉斯诺亚尔斯克的程序员 Vadim Mikheev 曾是核心团队成员,在 PostgreSQL 的演进与开发中发挥了重要作用。他创建了多版本并发控制(MVCC)、清理(vacuum)、预写式日志(WAL)、子查询、触发器等关键核心功能。如今,Vadim 已不再参与这个项目。

2015 年,莫斯科国立罗蒙诺索夫大学施滕贝格天文研究所的专业天文学家、研究员 Oleg Bartunov,与 Teodor Sigaev 和 Alexander Korotkov 共同创办了 Postgres Professional 公司。如今,该公司已成为俄罗斯数据库系统开发领域的主要人才培养基地。

他们的主要贡献领域包括 PostgreSQL 本地化(各国字符编码与 Unicode 支持)、全文检索、数组和半结构化数据(hstore、json、jsonb)的处理,以及新的索引方法(GiST、SP-GiST、GIN 和 RUM、Bloom)。他们还开发了许多广受欢迎的扩展。

PostgreSQL 的发布周期通常约为一年。在此期间,社区会收到来自全球贡献者的补丁,包括错误修复、更新和新特性。按照惯例,所有补丁都会在 pgsql-hackers 邮件列表中讨论。如果社区认为某个想法有用、实现正确,而且代码通过了规定的、由其他开发者进行的代码审查,这个补丁就会被纳入下一个发行版。

在某个时间点(通常是春季,距发布约半年),项目会宣布进入代码稳定阶段:所有新特性推迟到下一版本,只接受错误修复以及对已纳入补丁的改进。在发布周期内,还会推出测试版(beta)。临近周期结束时,会构建一个候选发布版(release candidate),随后不久便会发布 PostgreSQL 的新主版本。

过去,主版本号由两个数字组成。2017 年,项目决定改用单个数字,因此 9.6 之后的版本是 PostgreSQL 10。目前最新的版本是 2024 年 9 月发布的 PostgreSQL 17。

在准备新版本的过程中,开发者可能会发现并修复其中的错误。最关键的修复会被移植到先前的版本中。社区通常每季度发布一次更新,这些次版本汇集了相应的修复。例如,12.5 版本包含对 12.4 版本的错误修复,而 17.1 版本则提供对 PostgreSQL 17.0 的修复。

支持

PostgreSQL 全球开发组为每个主版本提供五年的支持。支持与开发工作都通过邮件列表组织。一份按要求提交的错误报告很可能很快得到处理;错误修复最快可在 24 小时内发布。

除社区支持外,不同国家的多家公司也提供 7×24 小时的 PostgreSQL 商业支持,其中包括 Postgres Professional(www.postgrespro.com)。

现状

PostgreSQL 是最受欢迎的数据库之一。依托学术研究奠定的坚实基础,经过数十年的发展,它已成长为企业级产品,如今已成为商业数据库切实可行的替代选择。不妨看看目前最新发行版 PostgreSQL 17 的主要特性,你就能亲自感受到这一点。

可靠性与稳定性

对于处理业务关键数据的企业级应用程序,可靠性尤为重要。为此,PostgreSQL 支持热备服务器、时间点恢复,以及多种复制方式(同步、异步和级联复制)。

安全性

PostgreSQL 支持安全的 SSL 连接,并提供多种身份验证方式,包括密码验证(含 SCRAM)、客户端证书,以及外部身份验证服务(LDAP、RADIUS、PAM、Kerberos)。

在用户管理和数据库访问控制方面,PostgreSQL 提供以下功能:

  • 创建和管理新用户及组角色

  • 基于角色和组控制对数据库对象的访问

  • 行级与列级安全性

  • 通过内置的 SE-PostgreSQL 功能支持 SELinux(强制访问控制)

Postgres Professional 发布的一个定制 PostgreSQL 版本已获得俄罗斯联邦技术与出口管制局认证,可用于处理个人数据和涉密信息的数据处理系统。

SQL 标准符合性

随着 ANSI SQL 标准不断演进,PostgreSQL 也在持续增加对它的支持。从 SQL-92 到最新的 SQL:2023,各个版本的标准都是如此。例如,PostgreSQL 17 完整支持 SQL:2016 标准中描述的所有 JSON 操作。

总体而言,PostgreSQL 对 SQL 标准的符合程度很高,支持 177 项必选特性中的 170 项,以及许多可选特性。

事务支持

PostgreSQL 完整支持 ACID 特性,并基于多版本并发控制(MVCC)实现高效的事务隔离。除不同进程并发更新同一行的情况外,这种方法在所有其他情况下都能避免加锁。读事务从不阻塞写事务,写事务也从不阻塞读事务。

即使在最严格的可串行化隔离级别下,情况也是如此。该级别采用创新的可串行化快照隔离(Serializable Snapshot Isolation)机制,确保不会出现串行化异常,并保证并发执行事务的结果与顺序执行相同。

面向应用程序开发者

应用程序开发者可以借助丰富的工具集创建各类应用程序:

  • 支持多种服务器端编程语言:内置的 PL/pgSQL(与 SQL 紧密集成)、适合性能关键任务的 C,以及 Perl、Python、Tcl、JavaScript、Java 等。

  • 提供数据库访问 API,让几乎任何语言编写的应用程序都能访问数据库,其中包括标准的 ODBC 和 JDBC API。

  • 提供丰富的数据库对象,可以在服务器端高效实现任意复杂程度的逻辑:表和索引、序列、完整性约束、视图和物化视图、分区、子查询和 WITH 查询(包括递归查询)、聚合函数和窗口函数、存储函数、触发器等。

  • 灵活的全文检索系统,支持多种语言,并配有高效的索引访问方法。

  • 支持 NoSQL 中常见的半结构化数据:hstore(存储键值对)、xml、json(以文本形式或更强健的 jsonb 二进制格式表示)。

  • 外部数据包装器(Foreign Data Wrappers)。这项功能允许按照 SQL/MED 标准,以外部表的形式添加新的数据源。任何主流数据库都可以作为外部数据源。PostgreSQL 提供对外部数据的完整支持,包括写入访问和分布式查询执行。

可伸缩性与性能

PostgreSQL 能够利用现代多核 CPU 架构。随着核心数量增加,其性能几乎呈线性增长。

PostgreSQL 可以并行执行查询和某些命令(例如创建索引和清理)。在这种模式下,读取和连接由多个并发进程执行。查询的即时编译(JIT)可以更充分地利用硬件资源,从而加快操作。每个 PostgreSQL 版本都会增加新的并行处理特性。

水平伸缩既可以依靠物理复制,也可以依靠逻辑复制。借助这些机制,可以构建基于 PostgreSQL 的集群,实现高性能、容错和跨地域分布。这类系统的例子包括 Citus(Citusdata)、Postgres-BDR(2ndQuadrant)、Multimaster 和 BiHA(Postgres Professional),以及 Patroni(Zalando)。

查询规划器

PostgreSQL 使用基于代价的查询规划器。规划器利用收集到的统计信息,在数学模型中同时考虑磁盘操作和 CPU 时间,即使是最复杂的查询也能进行优化。先进商业数据库系统所具备的各种访问路径和连接方法,它都可以使用。

索引

PostgreSQL 提供多种类型的索引。除了传统的 B-树(B-tree),还可以使用许多其他访问方法。

  • Hash:基于哈希的索引。与 B-树不同,这类索引只能用于等值检查,但在某些情况下可能更加高效、紧凑。

  • GiST:一种通用的平衡搜索树。这种访问方法用于无法排序的数据。例如,R-树可以为平面上的点建立索引,支持快速的 k 近邻(k-NN)搜索,也可以为相互重叠的区间建立索引。

  • SP-GiST:一种通用的非平衡树,将搜索空间划分为互不相交的嵌套分区。例如,用于空间数据的四叉树,以及用于文本字符串的基数树。

  • GIN:一种通用倒排索引,用于包含多个元素的复合值。它主要用于全文检索,查找包含搜索查询中所用词语的文档。另一个例子是在数据数组中搜索元素。

  • RUM:对 GIN 方法的增强,用于全文检索。这种索引以扩展形式提供,可以加速短语搜索,并按相关性顺序返回结果,无需额外计算。

  • BRIN:一种紧凑的数据结构,在索引大小和搜索效率之间作出取舍。这种索引适用于规模庞大的聚簇表。

  • Bloom:基于布隆过滤器的索引。它采用紧凑的表示方式,可以快速过滤掉不匹配的元组,但对剩余元组还需要再次检查。

许多索引类型既可以建立在单列上,也可以建立在多列上。无论哪种类型,索引不仅可以建立在列上,还可以建立在任意表达式上。也可以针对特定的行集合创建部分索引。覆盖索引能够加速查询,因为所需的全部数据都可以直接从索引中获取,无需访问堆。

规划器可以使用位图扫描,将多个索引组合起来,加快数据访问。

跨平台支持

PostgreSQL 既可以运行在 Unix 操作系统上(包括服务器和客户端 Linux 发行版、FreeBSD、Solaris 和 macOS),也可以运行在 Windows 系统上。

其可移植的开源 C 代码使 PostgreSQL 能够在多种平台上构建,即使社区没有为这些平台提供软件包也不例外。

可扩展性

PostgreSQL 架构的一大优势是可扩展性。无需修改系统核心代码,用户就可以添加各种功能,例如:

  • 数据类型

  • 支持新数据类型的函数和操作符

  • 索引访问方法和表访问方法

  • 服务器端编程语言

  • 外部数据包装器

  • 可加载的扩展

完善的扩展支持使开发者能够实现任意复杂程度的新功能,按需安装,而无需修改 PostgreSQL 核心。例如,下列复杂系统都以扩展形式实现:

  • CitusDB:实现大规模并行查询执行,以及不同 PostgreSQL 实例之间的数据分布(分片)。

  • PostGIS:最流行、最强大的地理信息数据处理系统之一。

  • TimescaleDB:提供时间序列数据支持,包括专门的分区和分片功能。

仅 PostgreSQL 17 的标准发行版就包含约五十个经实践证明实用而可靠的扩展。

易于获取和使用

宽松的 PostgreSQL 许可证与 BSD、MIT 许可证类似,允许不受限制地使用 PostgreSQL;你也可以不受限制地修改 PostgreSQL 代码,并将其集成到其他产品中,包括商业软件和闭源软件。

独立性

PostgreSQL 不属于任何一家公司,而是由汇聚了世界各地开发者的国际社区共同开发。这意味着,使用 PostgreSQL 的系统不依赖某个特定供应商,因此能够在任何情况下保护已有投资。