2024年9月26日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

26.1. 不同解决方案的比较 #

共享磁盘故障转移

共享磁盘故障转移通过仅保留一个数据库副本,避免了同步开销。它使用由多个服务器共享的单个磁盘阵列。如果主数据库服务器发生故障,备用服务器能够挂载并启动数据库,就好像它从数据库崩溃中恢复一样。这允许快速故障转移,而不会丢失数据。

共享硬件功能在网络存储设备中很常见。使用网络文件系统也是可行的,但必须注意文件系统具有完整的POSIX行为(参见 第 18.2.2.1 节)。这种方法的一个重要限制是,如果共享磁盘阵列发生故障或损坏,主服务器和备用服务器都将无法工作。另一个问题是备用服务器永远不应该在主服务器运行时访问共享存储。

文件系统(块设备)复制

共享硬件功能的修改版本是文件系统复制,其中对文件系统的所有更改都镜像到驻留在另一台计算机上的文件系统。唯一的限制是镜像必须以确保备用服务器拥有文件系统一致副本的方式进行——具体而言,对备用服务器的写入必须按与主服务器相同的顺序进行。DRBD 是 Linux 上流行的文件系统复制解决方案。

预写日志传送

通过读取预写日志 (WAL) 记录流,可以使冷备用服务器和热备用服务器保持最新状态。如果主服务器发生故障,备用服务器包含几乎所有主服务器的数据,并且可以快速将其变为主数据库服务器。这可以是同步的或异步的,并且只能针对整个数据库服务器执行。

可以使用基于文件的日志传送来实现备用服务器(参见 第 26.2 节)或流复制(参见 第 26.2.5 节),或二者的结合。有关热备用信息,请参见 第 26.4 节

逻辑复制

逻辑复制允许数据库服务器将数据修改流发送到另一台服务器。 PostgreSQL 逻辑复制从 WAL 构造逻辑数据修改流。逻辑复制允许按表级复制数据更改。此外,发布自己更改的服务器也可以订阅来自另一台服务器的更改,允许数据在多个方向上流动。有关逻辑复制的更多信息,请参见 第 29 章。通过逻辑解码接口(参见 第 47 章),第三方扩展也可以提供类似的功能。

基于触发器的主备复制

基于触发器的复制设置通常将数据修改查询引导到指定的服务器。基于表级操作,主服务器将数据更改(通常)异步发送到备用服务器。备用服务器可以在主服务器运行时回答查询,并且可能允许一些本地数据更改或写入活动。这种形式的复制通常用于卸载大型分析或数据仓库查询。

Slony-I 是这种复制的一个示例,它具有按表级粒度,并支持多个备用服务器。因为它异步(批处理)更新备用服务器,因此在故障转移期间可能会丢失数据。

基于 SQL 的复制中间件

使用基于 SQL 的复制中间件,程序会拦截每个 SQL 查询并将其发送到一台或所有服务器。每个服务器独立运行。读写查询必须发送到所有服务器,以便每个服务器接收所有更改。但只读查询可以只发送到一台服务器,从而允许读取工作负载在它们之间分配。

如果查询只是简单地广播而未经修改,则像 random()CURRENT_TIMESTAMP 和序列这样的函数在不同服务器上可能具有不同的值。这是因为每个服务器都独立运行,并且因为广播的是 SQL 查询而不是实际数据更改。如果这是不可接受的,则中间件或应用程序必须从单一来源确定这些值,然后在写入查询中使用这些值。还必须注意所有事务在所有服务器上都必须提交或中止,也许使用两阶段提交(参见 PREPARE TRANSACTIONCOMMIT PREPARED)。Pgpool-IIContinuent Tungsten 是这种复制的示例。

异步多主复制

对于没有定期连接或通信链路缓慢的服务器(例如笔记本电脑或远程服务器),保持服务器之间的数据一致是一个挑战。使用异步多主复制,每个服务器独立工作,并定期与其他服务器通信以识别冲突事务。冲突可以通过用户或冲突解决规则来解决。Bucardo 是这种复制的一个示例。

同步多主复制

在同步多主复制中,每个服务器都可以接受写入请求,并且修改后的数据在每个事务提交之前从原始服务器传输到每个其他服务器。繁重的写入活动会导致过度的锁定和提交延迟,从而导致性能下降。读取请求可以发送到任何服务器。一些实现使用共享磁盘来减少通信开销。同步多主复制最适合大多数读取工作负载,尽管它的最大优势是任何服务器都可以接受写入请求——无需在主服务器和备用服务器之间划分工作负载,并且因为数据更改是从一台服务器发送到另一台服务器,所以不存在非确定性函数(如 random())的问题。

PostgreSQL 不提供这种类型的复制,尽管 PostgreSQL 两阶段提交(参见 PREPARE TRANSACTIONCOMMIT PREPARED)可用于在应用程序代码或中间件中实现此功能。

表 26.1 总结了上面列出的各种解决方案的功能。

表 26.1. 高可用性、负载均衡和复制功能矩阵

功能 共享磁盘 文件系统复制 预写日志传送 逻辑复制 基于触发器的复制 SQL 复制中间件 异步多主复制 同步多主复制
流行示例 NAS DRBD 内置流复制。 内置逻辑复制、pglogical Londiste、Slony pgpool-II Bucardo  
通信方法 共享磁盘 磁盘块 WAL 逻辑解码 表行 SQL 表行 表行和行锁
不需要特殊硬件  
允许多个主服务器        
对主服务器没有开销        
无需等待多个服务器   关闭同步 关闭同步    
主服务器故障永远不会丢失数据 打开同步 打开同步    
副本接受只读查询     使用热备用
按表级粒度        
无需冲突解决    

有几个解决方案不属于上述类别

数据分区

数据分区将表拆分为数据集。每个集只能由一台服务器修改。例如,可以按办公室对数据进行分区,例如伦敦和巴黎,每个办公室有一台服务器。如果需要组合伦敦和巴黎数据的查询,应用程序可以查询两台服务器,或者可以使用主备复制来在每台服务器上保留另一个办公室数据的只读副本。

多服务器并行查询执行

上述许多解决方案允许多台服务器处理多个查询,但没有解决方案允许单个查询使用多台服务器来更快地完成。此解决方案允许多台服务器同时处理单个查询。这通常通过将数据分散在服务器之间并让每台服务器执行其查询部分并将结果返回到中央服务器来完成,中央服务器将它们组合起来并返回给用户。可以使用 PL/Proxy 工具集来实现此功能。

还应注意,由于 PostgreSQL 是开源的并且易于扩展,许多公司已经采用 PostgreSQL 并创建了具有独特故障转移、复制和负载均衡功能的商业闭源解决方案。这里没有讨论这些解决方案。

提交更正

如果您在文档中看到任何不正确的内容,不符合您对特定功能的体验,或者需要进一步说明,请使用 此表格 报告文档问题。