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个节点的同步复制,保证强一致性(之后可以增加异步复制节点)
准备工作
- 准备两台以上的机器,其中一个作为主节点
- 注意保存tablespace的位置必须要一致,这个是postgresql文档所要求的
- 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相对较低。
主备切换
其他问题
- 版本升级问题。基于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