支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 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 并创建了具有独特故障转移、复制和负载均衡功能的商业闭源解决方案。这些在这里不作讨论。

提交更正

如果您在文档中发现任何不正确、与您特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。