Postgresql主备集群搭建——基于同步流复制

Posted by

Postgresql提供了多种高可用集群的搭建方式。具体可以参见:https://www.postgresql.org/docs/13/high-availability.html

而这次主要是为了搭建一个简单的主备集群,用来避免单点故障导致的数据丢失。至于更复杂的主备切换、负载均衡等其他高阶用法,之后有时间再详细总结。

对于Postgresql的主备机群,这里选择的是基于复制的主备集群解决方案。这里主要是有2个解决方案:

  • 基于WAL的复制
  • 逻辑复制

而本次主要是考虑到,一是简单的配置实现主备,二是直接对整个库实现备份,因此采用了第一种方案,也就是基于WAL的复制。具体参考的文档:https://www.postgresql.org/docs/13/warm-standby.html

然后复制的方式选择:流复制(streaming replication)

同时启用1个节点的同步复制,保证强一致性(之后可以增加异步复制节点)

准备工作

  1. 准备两台以上的机器,其中一个作为主节点
  2. 注意保存tablespace的位置必须要一致,这个是postgresql文档所要求的
  3. postgresql的版本,这里选择的是13.1。之前的版本可能略有些不同。

搭建步骤

首先要声明的是:对于空数据库还是已经保存有数据的库,都可以采用相同的方法来进行搭建

 

1. 主库配置

配置一个用于复制的账户,如

CREATE ROLE repacct NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT REPLICATION LOGIN PASSWORD ‘repacct’;

修改pg_hba.conf文件,增加replication账号相关的配置(TBD attach file)。可以参见示例文件。

修改postgresql.conf文件,配置一些主备机群相关的选项。(TBD attach file)。可以参见示例文件。

不过需要注意的是,对于配置同步复制的节点,需要修改synchronous_standby_names = ‘ANY 1 (*)’这个配置项。这个配置项主要是来指定哪一些节点是同步节点。而这里的ANY 1 (*)指的是,只要有一个节点同步完成就可以了,不需要关注具体哪一个。可以根据自己的需要来配置各种规则。

最后启动主库就可以了。

2. 备库配置

对于备库,由于postgresql强制需要通过pg_basebackup来初始化备库基础数据,否则备库即便配置好同步,也会因为各种错误导致无法成功工作。

因此,首先要初始化备库基础数据。基本原理是从主库同步一份数据出来。可以执行类似下面的命令来在备库上初始化数据:

/postgres/bin/pg_basebackup -D data -h 192.168.31.231 -p 15432 -U repacct -W

这里指定了要保存到的文件夹、主库ip端口、以及用于replication的账号名密码。

之后就可以等待同步完成了。注意这里就像本章最开始说的,不论是新库还是有数据的库都要通过这种方式来创建备库。

接着,在同步完成后的数据文件夹中新建一个空白文件:standby.signal。表明这个节点是standby节点。

最后,修改备库postgresql.conf文件中的唯一一个配置,连接到主库,即可完成备库配置:

primary_conninfo = ‘application_name=standby01 host=192.168.31.231 port=15432 user=repacct password=repacct’

注意这里除了配置了ip端口、用户,也配置了application_name,这个主要用于配置主库的需要强制指定为同步节点的名称。

在备库的这个配置文件中,如果需要启用备库可读的功能,可以在打开这个开关:

hot_standby = on

至此,备库的配置也完成了。可以直接启动备库,观察是否正常同步。

3. 其他

对于启用了streaming replication的主备库,可以连同包括DDL操作在内的变更从主库同步到备库。而且整体的overhead相对较低。

主备切换

其他问题

  1. 版本升级问题。基于WAL的复制不支持不同版本的PG在在同一时间运行。因此需要一个解决方案来保证主备库升级的流程。

其他参考文档

https://www.cnblogs.com/wy20201111/p/14002403.html

https://blog.csdn.net/weixin_43631631/article/details/108888831

https://www.postgresql.org/docs/13/warm-standby.html

 

Leave a Reply