一、pg高可用实现方案:

  • 共享磁盘的失效切换或磁盘的底层复制方案:使用共享存储,如SAN存储,一台机器故障后,把SAN存储 输出的磁盘挂到另一台机器上,然后把磁盘上的文件系统挂起来完成切换。

  • WAL日志同步或流复制同步方案:PostgreSQL自身提供了这种方案,通过该机制可以搭建主从数据库, 当主数据库故障时,把从数据库提升为主库,继续对外提供服务。

  • 基于触发器的同步方案:使用触发器记录数据变化,然后同步到另一台数据库上。 -基于语句复制的中间件:用户不直接连接到底层数据库,而是连接到一个中间件,中间件把数据库的变 更发送到底层多台数据库上完成数据的同步。

  • 基于改造PostgreSQL源码的方案:修改PostgreSQL源码来截取数据的变更,然后同步到另一台数据库 上。

二、Keepalived实现PostgreSQL高可用

Keepalived可提供VRRP以及health-check功能,可以只用它提供双机浮动的vip(VRRP虚拟路由功能),这 样可以简单实现一个双机热备高可用功能

优点:

  • 搭建比较简单,只需在每个pg数据库的机器部署一个keepalived的进程

  • 切换过程也比较简单,keepalived检查到主库心跳异常就进行切换 vip以及部分pg的动作,一个小脚本就 搞定

缺点:

  • 故障判断不够健全,比如主库一个抖动或者网络抖动就有可能导致切换

  • 切换过程中不会进行主从延迟判断直接就会切换(需要自行判断主从延迟情况是否可以切换)

  • 极端情况会出现脑列的情况

三、高可用之repmgr

repmgr是一个开源工具套件(类似于MySQL的MHA),用于管理PostgreSQL服务器集群中的复制和故障转 移。它使用工具来增强PostgreSQL的内置热备份功能,以设置备用服务器,监控复制以及执行管理任务,例 如故障转移或手动切换操作。

优点:

  • repmgr的特点是非常轻量,但功能全面:

  • 监视主从流复制过程

  • 自动故障切换和手动故障切换

  • 支持分布式管理集群节点,易扩展,可以在线增加或者删除节点

四、高可用Patroni

Patroni 起源于Compose项目Governor的一个分支,Patroni采用DCS存储元数据,能够严格的保障元数据的一 致性,可靠性高

其中Patroni不仅简单易用而且功能非常强大。比如

  • 支持自动failover和按需switchover

  • 支持一个和多个备节点

  • 支持级联复制

  • 支持同步复制,异步复制

  • 支持同步复制下备库故障时自动降级为异步复制(功效类似于MySQL的半同步,但是更加智能)

  • 支持控制指定节点是否参与选主,是否参与负载均衡- 以及是否可以成为同步备机

  • 支持通过pg_rewind自动修复旧主

  • 支持多种方式初始化集群和重建备机,包括pg_basebackup和支持wal_e,pgBackRest,barman等备份 工具的自定义脚本

  • 支持自定义外部callback脚本

  • 支持REST API

  • 支持通过watchdog防止脑裂

  • 支持k8s,docker等容器化环境部署

  • 支持多种常见DCS(Distributed Configuration Store)存储元数据,包括etcd,ZooKeeper,Consul, Kubernetes

五、Bucardo搭建PG的双主

Bucardo是PostgreSQL数据库中实现双向同步的软件,可以实现 bucardo中的同步都是异步的,它是通过触发器记录变化,程序是 主复制、主从同步,甚至可以以postgresql为源库,可以和 异步同步。

特点:

?PostgreSQL数据库的双master的方案,不过 perl写的。Bucardo可以实现postgresql的多

oracle、mysql、mongodb等很多数据库进行数据

1?Bucardo 是基于表复制的系统,通过触发器记录变化,同步的表必须有主键,不能同步DDL语句 (truncate可以同步)。

  • Bucardo 可以实现PostgreSQL数据库的双master/多master的方案。

  • Bucardo的核心是一个Perl守护进程,它侦听通知请求并对其进行操作,方法是连接到远程数据库并来回 复制数据。

六、Pgpool-II读写分离+负载均衡

Pgpool-II是一个在PostgreSQL服务器和PostgreSQL数据库客户端之间工作的中间件。Pgpool对服务器和应用 来说几乎是透明的,现有的数据库应用程序基本上可以不需要更改就可以使用pgpool

pgpool工作进程:

  • Pcp进程:向pgpool发送管理命令的

  • 父进程:负责检查数据库健康

  • Pgpool子进程:接受 发送sql

  • Work进程:检查延迟情况。

  • Pgpool logger:记录日志

  • Health Check:检查pg存活状态进程

七、Postgres-XC分布式数据库

大多数数据水平拆分方案都有很多限制,如不能跨机器Join,对SQL也有各种各样的使用限制,而Postres-XC 实现得更彻底,用户访问Postgres-XC集群,就像访问单机数据库一样,基本没有太大的差别

Postgres-XC有如下特点

  • 基于PostgreSQL实现的集群:可以使用PostgreSQL的客户端及驱动无差别地连接到Postgres- XC上。客 户端与PostgreSQL是完全兼容的

  • 并不是架构在PostgreSQL数据库之上的中间件:通过修改PostgtreSQL源代码实现的数据库集群

  • ………………

八、几种架构如何选择

  • Keepalived实现PostgreSQL高可用:集群数比较小,想简单跑起来,有高可用对数据一致性不是非常在 乎的场景可用选择这种方案

  • 高可用之repmgr:可用理解为 Keepalived的升级版本,如果对数据一致性比较在乎并且也想拥有高可用 的话 建议选择repmgr,不过类似于mha一样只能切换一次,切换后需要重新修改配置

  • 高可用Patroni其实和repmgr比较相识,只是Patroni至少需要三个节点以上才能部署,不过可以切换多 次,如果pg节点在三个节点以上,建议可以选择次方案 管理起来相对轻松

  • Bucardo搭建PG的双主:这个是双主的的同步架构,也就是可以两边写,如果有多谢这种需求可以使用, 但是性能损耗也相对比较大 20%大概

  • Pgpool-II读写分离:引入了类似中间件,来实现整个高可用切换和读写分离,以及负载均衡,大大简化了 程序客户端的一些配置,针对一些有读写分离需求,但是业务实现比较麻烦的时候 可以选用这种方案

  • Postgres-XC分布式数据库 ,单节点无法承载存储时,可以选择pg这种分布式数据库架构