XL, Chapter 26. High Availability, Load Balancing, and Replication
26.1. Comparison of Different Solutions
Shared Disk Failover
共享磁盘故障转移通过仅拥有一个数据库副本来避免同步开销。 它使用由多个服务器共享的单个磁盘阵列。 如果主数据库服务器出现故障,则备用服务器可以装入并启动数据库,就好像它正在从数据库崩溃中恢复一样。 这允许快速故障转移而不会丢失数据。
共享硬件功能在网络存储设备中很常见。 使用网络文件系统也是可能的,但必须注意文件系统具有完整的POSIX行为(参见第18.2.2节)。 此方法的一个重要限制是,如果共享磁盘阵列出现故障或损坏,则主服务器和备用服务器都不起作用。 另一个问题是备用服务器在主服务器运行时永远不应访问共享存储。
File System (Block Device) Replication
共享硬件功能的修改版本是文件系统复制,其中对文件系统的所有更改都镜像到驻留在另一台计算机上的文件系统。 唯一的限制是镜像必须以确保备用服务器具有文件系统的一致副本的方式完成 - 具体而言,对备用数据库的写入必须按照与主数据库相同的顺序进行。 DRBD是一种流行的Linux文件系统复制解决方案。
Write-Ahead Log Shipping
通过读取预写日志(WAL)记录流,可以使热备用服务器保持最新状态。 如果主服务器出现故障,则备用数据库几乎包含主服务器的所有数据,并且可以快速建立新的主数据库服务器。 这可以是同步的,也可以是异步的,只能对整个数据库服务器执行。
可以使用基于文件的日志传送(第26.2节)或流复制(请参阅第26.2.5节)或两者的组合来实现备用服务器。 有关热备用的信息,请参见第26.5节。
Logical Replication
逻辑复制允许数据库服务器将数据修改流发送到另一个服务器。 PostgreSQL逻辑复制构造来自WAL的逻辑数据修改流。 逻辑复制允许复制各个表的数据更改。 逻辑复制不需要将特定服务器指定为主服务器或副本,但允许数据在多个方向上流动。 有关逻辑复制的更多信息,请参阅第31章。通过逻辑解码接口(第48章),第三方扩展也可以提供类似的功能。
Trigger-Based Master-Standby Replication
主 - 备复制设置将所有数据修改查询发送到主服务器。 主服务器异步将数据更改发送到备用服务器。 备用数据库可以在主服务器运行时应答只读查询。 备用服务器是数据仓库查询的理想选择。
Slony-I是此类复制的一个示例,具有每表粒度,并支持多个备用服务器。 因为它以异步方式(批量)更新备用服务器,故障转移期间可能会丢失数据。
Statement-Based Replication Middleware
使用基于语句的复制中间件,程序拦截每个SQL查询并将其发送到一个或所有服务器。每个服务器独立运行。必须将读写查询发送到所有服务器,以便每个服务器都接收任何更改。但只读查询可以发送到一个服务器,允许读取工作负载在它们之间分配。
如果查询只是未经修改的广播,则random(),CURRENT_TIMESTAMP和sequence等函数可以在不同的服务器上具有不同的值。这是因为每个服务器都独立运行,并且因为SQL查询是广播的(而不是实际修改的行)。如果这是不可接受的,则中间件或应用程序必须从单个服务器查询此类值,然后在写入查询中使用这些值。另一种选择是将此复制选项与传统的主 - 备用设置一起使用,即数据修改查询仅发送到主服务器,并通过主 - 备复制而不是复制中间件传播到备用服务器。还必须注意所有事务在所有服务器上提交或中止,可能使用两阶段提交(PREPARE TRANSACTION和COMMIT PREPARED)。 Pgpool-II和Continuent Tungsten是这种复制的例子。
Asynchronous Multimaster Replication
对于没有定期连接的服务器,如笔记本电脑或远程服务器,在服务器之间保持数据一致是一项挑战。 使用异步多主机复制,每个服务器独立工作,并定期与其他服务器通信以识别冲突的事务。 用户或冲突解决规则可以解决冲突。 Bucardo就是这种复制的一个例子。
Synchronous Multimaster Replication
在同步多主机复制中,每个服务器都可以接受写入请求,并且在每个事务提交之前,已修改的数据从原始服务器传输到每个其他服务器。重写活动可能导致过度锁定,导致性能不佳。实际上,写入性能通常比单个服务器差。读取请求可以发送到任何服务器。某些实现使用共享磁盘来减少通信开销。同步多主机复制最适合大多数读取工作负载,但它的最大优点是任何服务器都可以接受写入请求 - 不需要在主服务器和备用服务器之间分配工作负载,并且因为数据更改从一个服务器发送到另一个服务器,对于像random()这样的非确定性函数没有问题。
PostgreSQL不提供这种类型的复制,但PostgreSQL两阶段提交(PREPARE TRANSACTION和COMMIT PREPARED)可用于在应用程序代码或中间件中实现此功能。
Commercial Solutions
由于PostgreSQL是开源的并且易于扩展,因此许多公司采用了PostgreSQL并创建了具有独特故障转移,复制和负载平衡功能的商业闭源解决方案。
Data Partitioning
数据分区将表拆分为数据集。 每组只能由一台服务器修改。 例如,数据可以由办公室分区,例如伦敦和巴黎,每个办公室都有一台服务器。 如果需要组合伦敦和巴黎数据的查询,则应用程序可以查询两个服务器,或者主/备复制可用于在每个服务器上保留其他办公室数据的只读副本。
Multiple-Server Parallel Query Execution
上述许多解决方案允许多个服务器处理多个查询,但是没有一个允许单个查询使用多个服务器来更快地完成。 此解决方案允许多个服务器在单个查询上同时工作。 它通常通过在服务器之间拆分数据并让每个服务器执行其部分查询并将结果返回到中央服务器来完成,然后将它们组合并返回给用户。 Pgpool-II具有此功能。 此外,这可以使用PL /代理工具集来实现。