PostgreSQL高可用方案对比 有更新!

  , ,
评论 • 326 浏览

PostgreSQL高可用方案对比

最近项目上有需要,于是便研究了下PostgreSQL的高可用。
以前了解过一点mysql的主备方案。mysql的主从是通过从库监听主库的binlog来实现主从同步的。但是在我接手PostgreSQL主从同步时,同事一个劲的和我说流复制。。听得我有点懵。。于是我去官网看了一圈,发现所谓的流复制是Write-Ahead Log Shipping简称wal的一种高效实现方式,基于流复制传递日志。本质上还是传递日志。
于是这里便把PostgreSQL的官网,关于高可用的说明给翻译过来

好记性不如烂笔头。

关于pg的高可用方案实现,大致有这么几种。

1.Shared Disk Failover—共享磁盘故障转移

共享磁盘故障转移本质上是通过多台服务共享一个磁盘矩阵来实现,当主服务宕机后,从库能够很快的切换为主服务,并且没有数据丢失。
注意:
在官网给出的说明中要求如果使用网络文件系统的话,必须具有POSIX行为。
如果共享磁盘阵列出现故障或损坏,主服务器和备用服务器都将无法正常工作。另外,在主服务器运行时,备用服务器不应访问共享存储。

2.File System (Block Device) Replication—文件系统复制

共享硬件功能的修改版本是文件系统复制,所有文件系统的修改都会以镜像复制的方式复制到另外一台计算上。唯一的限制是镜像在备用服务器上的写入必须以与主服务器上相同的顺序进行。DRBD是一种流行的Linux文件系统复制解决方案。

3.Write-Ahead Log Shipping—预写日志传输

ps:预写日志传输是我字面翻译过来的,不一定准确。
通过读取提前写入日志(wal)记录流,可以确保热备份服务器的数据是最新的状态。如果主服务器发生故障,备用服务器几乎包含主服务器的所有数据,可以快速地成为新的主数据库服务器。这可以是同步的,也可以是异步的,并且只能在整个数据库服务器上完成。
备用服务器可以使用基于文件的日志传送(第26.2节)或流式复制(见第26.2.5节)或两者的组合来实现。有关热备的信息,请参见第26.5节

4.Logical Replication—逻辑复制

逻辑复制允许数据库服务器向另一个服务器发送数据修改流。PostgreSQL逻辑复制从Wal构造逻辑数据修改流。逻辑复制允许复制单个表中的数据更改。逻辑复制不需要将特定服务器指定为主服务器或副本,允许数据向多个方向流动。有关逻辑复制的更多信息,请参阅第31章。通过逻辑解码接口(第48章),第三方扩展也可以提供类似的功能。
逻辑备份和日志传输备份区别在于,日志传输有主从服务器之分。

5.Trigger-Based Master-Standby Replication—基于触发器的主从复制

从服务器发送数据修改查询到主服务器,主服务器接受到请求后可以异步的将数据修改发送到从服务器。在主服务器运行时,从服务器提供只读查询。备用服务器是数据仓库查询的理想选择。
Slony-I是这种复制的一个例子,具有每个表的粒度,并且支持多个备用服务器。因为它以异步方式(批量)更新备用服务器,所以在故障转移期间可能会丢失数据。

6.Statement-Based Replication Middleware—基于语句的复制中间件

基于语句复制的中间件可以截取每个SQL查询语句,并且将这个语句发送到其他的服务器。每台服务器独立运行,Read-write(这里理解成写操作更合理)操作必须发送到每台服务器,但是查询操作可以只发送到一台服务器。这样可以很好的实现分布式。
注意:
一些操作在不同服务器上可能会有不同的值,比如:random(), CURRENT_TIMESTAMP以及序列这种。针对这种情况,中间件可以通过路由设计将这些读写操作路由到同一台服务上。另一个选项是将此复制选项与传统的主备用设置一起使用,即数据修改查询仅发送到主服务器,并通过主备用复制(而不是复制中间件)传播到备用服务器。还必须注意,所有服务器上的所有事务要么提交,要么中止,可能使用两阶段提交(准备事务和准备提交)。PGPool II和Continuent钨就是这种复制的例子。

7.Asynchronous Multimaster Replication—异步多主备份

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

8.Synchronous Multimaster Replication—同步多主备份

在同步多主机复制中,每个服务器都可以接受写请求,修改后的数据在每个事务提交之前从原始服务器传输到其他服务器。大量的写操作会导致过度锁定,导致性能低下。实际上,写性能通常比单个服务器差。读取请求可以发送到任何服务器。一些实现使用共享磁盘来减少通信开销。同步多主机复制最适合大多数读工作负载,尽管它的最大优点是任何服务器都可以接受写请求-不需要在主服务器和备用服务器之间划分工作负载,而且由于数据更改是从一个服务器发送到另一个服务器,因此对于诸如random()这样的非确定性函数来说,没有问题。
PostgreSQL不提供这种类型的复制,尽管PostgreSQL的两阶段提交(准备事务和准备提交)可以在应用程序代码或中间件中实现。

9.Commercial Solutions—商业解决方案

由于PostgreSQL是开放源代码且易于扩展,许多公司采用了PostgreSQL并创建了具有独特故障转移、复制和负载平衡功能的商业闭源解决方案。

下表摘自官网总结了上述各种解决方案的能力。

Snipaste_20190320_205915png

评论
validate