[译]Windows下的流复制:快速指南

2022-12-27 13:49:35 浏览数 (2)

Windows下的流复制:快速指南

大家可能对Linux环境下搭建流复制很熟悉,对于windows环境下配置流复制可能会有些默认,从PostgreSQL weekly博客中看到有篇对Windows环境下搭建流复制的介绍,本文将其整理过来,以供参考。

PG weekly:https://postgresweekly.com/

DB weekly:https://www.dbweekly.com/

Postgres文档非常全面地包含了流复制方面内容,但您可能还需要一些更易于理解的内容以供参考。本文,讨论如何在Windows中设置流复制。

简要说,PG复制就是将数据从一个数据库服务(primary)拷贝到另一个(standby)。本文主要关注流复制。构建步骤和linux环境下基本相同,为方便起见,本文中的命令和代码示例都是针对windows环境的。假设已准备好2台按照了PG的服务器。我们的测试环境是windows server 2012,PG是11.9。

需要注意,primary指已运行的PG节点,可读写,备机仅可读。现在开始搭建:

1)更新postgres.conf和pg_hba.conf文件,在主上需要在postgres.conf附加以下配置:

代码语言:javascript复制
wal_level = hot_standby
full_page_writes = on
wal_log_hints = on
max_wal_senders = 6
max_replication_slots = 6
hot_standby = on
hot_standby_feedback = on

2)在pg_hba.conf中添加2台服务器的外部IP地址,下面是个例子:

代码语言:javascript复制
host replication repl_user IP_of_primary/32 scram-sha-256
host replication repl_user IP_of_standby/32 scram-sha-256

该文件会复制到备机。当该节点提升主时,已配置允许旧的主节点连接。

3)创建一个名为repl_user的复制用户

这是我们要创建的具有所需复制权限的用户。在主上,执行:

代码语言:javascript复制
psql -d postgres   -U postgres   -c "CREATE ROLE repl_user LOGIN REPLICATION ENCRYPTED PASSWORD 'secretpasswordhere';"

4)正如上面的配置max_replication_slots=6,我们在设置中使用复制槽,复制槽避免了备机关闭,并稍后恢复时无法找到预写日志段的问题。关于复制槽需要记住:当备机关闭时,复制槽没有更新,主将继续累积WAL,这将导致WAL目录被填满,知道备机接收WAL或者知道复制槽被删除。PG13引入了一个参数辅助复制槽和磁盘使用:max_slot_wal_keep_size,允许指定保留WAL复制槽的数量。这会阻止PG因等待丢失的备而不断累积WAL,但这也意味着WAL将被丢弃,并且由于必要的WAL不存在,备机将需要重新构建。

5)主上通过运行下面命令为备机重建复制槽:

代码语言:javascript复制
psql -d postgres -U postgres -c "SELECT * FROM pg_create_physical_replication_slot('standby1', true);"

6)执行一个基础备份,完成后,需要擦除现有的备机。需要先停机;

代码语言:javascript复制
pg_ctl -D "yourdatadirectory" stop -mi

停机后需要删除data目录,然后执行pg_basebackup做基础备份:

代码语言:javascript复制
pg_basebackup -D yourdatadirectory -Fp -R -Xs -c fast -l 'initial clone' -P -v -h IP_of_master -U repl_user

当然,如需要输入密码,还需要输入repl_user的密码。

7)更新备机的设置。PG11及之前版本,基础备份完成后,需要编辑备机的recovery.conf,添加复制槽名。PG12及之后版本,不再有recovery.conf文件,所有的配置以到了postgres.conf中:

代码语言:javascript复制
primary_slot_name = 'standby1'

8)使用pg_ctl -D [datadir] start,或者创建了服务的话可以使用net start命令启动。

9)可以从Logs中:看到检查流复制

代码语言:javascript复制
Started streaming from primary at [wal] on timeline [number]

也可以运行下面命令:

Primary:

代码语言:javascript复制
Select * from pg_stat_replication;

Slave:

代码语言:javascript复制
Select * from pg_stat_wal_receiver;

原文

https://www.crunchydata.com/blog/postgres-streaming-replication-on-windows-a-quick-guide

0 人点赞