网站搜索

如何在 CentOS 8 中配置 PostgreSQL 12 流复制


PostgreSQL数据库支持多种复制解决方案来构建高可用性、可扩展、容错的应用程序,其中之一是预写日志WAL ) 船运。该解决方案允许使用基于文件的日志传送或流复制或在可能的情况下结合使用这两种方法来实现备用服务器。

通过流式复制,备用(复制从属)数据库服务器配置为连接到主服务器/主服务器,后者在生成 WAL 记录时将其流式传输到备用服务器,而无需等待 WAL 要填写的文件。

默认情况下,流复制是异步的,其中在主服务器上提交事务后将数据写入备用服务器。这意味着在主服务器中提交事务和更改在备用服务器中变得可见之间存在很小的延迟。这种方法的一个缺点是,如果主服务器崩溃,任何未提交的事务可能不会被复制,这可能会导致数据丢失。

本指南介绍如何在 CentOS 8 上设置 Postgresql 12 主备流复制。我们将为备用服务器使用“复制槽”作为解决方案,以避免主服务器在备用服务器收到旧的WAL段之前回收它们。

请注意,与其他方法相比,复制槽仅保留已知需要的段数。

测试环境:

本指南假设您通过 SSH 以 root 身份连接到主数据库服务器和备用数据库服务器(如果您以具有管理权限的普通用户身份连接,则必要时使用 Sudo 命令):

Postgresql master database server: 		10.20.20.9
Postgresql standby database server:		10.20.20.8

两台数据库服务器都必须安装 Postgresql 12,否则请参阅:如何在 CentOS 8 中安装 PostgreSQL 和 pgAdmin。

注意PostgreSQL 12 对复制实现和配置进行了重大更改,例如替换 recovery.conf 和将 recovery.conf 参数转换为普通 PostgreSQL 配置参数,使配置集群复制变得更加容易。

第1步:配置PostgreSQL主/主数据库服务器

1. 在主服务器上,切换到 postgres 系统帐户并配置主服务器将侦听来自客户端的连接的 IP 地址。

在这种情况下,我们将使用 * 表示全部。

su - postgres
psql -c "ALTER SYSTEM SET listen_addresses TO '*';"

ALTER SYSTEM SET SQL 命令是一项强大的功能,可以直接使用 SQL 查询更改服务器的配置参数。配置保存在位于数据文件夹根部的 postgresql.conf.auto 文件中(例如 /var/lib/pgsql/12/data/)并读取附加内容存储在 postgresql.conf 中的内容。但前者中的配置优先于后者和其他相关文件中的配置。

2. 然后使用 createuser 程序创建一个复制角色,用于从备用服务器到主服务器的连接。在以下命令中,-P 标志提示输入新角色的密码,-e 回显 createuser 生成并发送到数据库服务器的命令。

su – postgres
createuser --replication -P -e replicator
exit

3. 然后在 /var/lib/pgsql/12/data/pg_hba.conf 客户端身份验证配置文件末尾输入以下条目,并将数据库字段设置为复制如屏幕截图所示。

host    replication     replicator      10.20.20.8/24     md5

4. 现在使用以下 systemctl 命令重新启动 Postgres12 服务以应用更改。

systemctl restart postgresql-12.service

5.接下来,如果您运行了firewalld服务,则需要在firewalld配置中添加Postgresql服务,以允许从备用服务器到主服务器的请求。

firewall-cmd --add-service=postgresql --permanent
firewall-cmd --reload

第 2 步:进行基本备份以引导备用服务器

6.接下来,需要从备用服务器对主服务器进行基础备份;这有助于引导备用服务器。您需要停止备用服务器上的postgresql 12服务,切换到postgres用户帐户,备份数据目录(/var/lib/pgsql/12/data/),然后删除其下的所有内容如图所示,在进行基本备份之前。

systemctl stop postgresql-12.service
su - postgres
cp -R /var/lib/pgsql/12/data /var/lib/pgsql/12/data_orig
rm -rf /var/lib/pgsql/12/data/*

7. 然后使用pg_basebackup工具以正确的所有权进行基础备份(数据库系统用户,即Postgres,在 Postgres 用户帐户)并具有正确的权限。

在以下命令中,选项:

  • -h – 指定作为主服务器的主机。
  • -D – 指定数据目录。
  • -U – 指定连接用户。
  • -P – 启用进度报告。
  • -v – 启用详细模式。
  • -R – 启用恢复配置的创建:创建一个 standby.signal 文件并将连接设置附加到数据下的 postgresql.auto.conf目录。
  • -X – 用于在备份中包含所需的预写日志文件(WAL 文件)。 Stream 值表示在创建备份时流式传输 WAL。
  • -C – 允许在开始备份之前创建由 -S 选项命名的复制槽。
  • -S – 指定复制槽名称。
pg_basebackup -h 10.20.20.9 -D /var/lib/pgsql/12/data -U replicator -P -v  -R -X stream -C -S pgstandby1
exit

8. 备份过程完成后,备用服务器上的新数据目录应如屏幕截图中所示。创建standby.signal并将连接设置附加到postgresql.auto.conf。您可以使用 ls 命令列出其内容。

ls -l /var/lib/pgsql/12/data/

如果 hot_standby 参数在 postgresql.conf 中设置为 on(默认值),并且复制从服务器将以“Hot Standby”模式运行数据目录中存在一个 standby.signal 文件。

9. 现在回到主服务器,当您打开 pg_replication_slots 视图时,您应该能够看到名为 pgstandby1 的复制槽,如下所示。

su - postgres
psql -c "SELECT * FROM pg_replication_slots;"
exit

10. 要查看 postgresql.auto.conf 文件中附加的连接设置,请使用 cat 命令。

cat /var/lib/pgsql/12/data/postgresql.auto.conf

11. 现在,通过启动 PostgreSQL 服务,在备用服务器上开始正常的数据库操作,如下所示。

systemctl start postgresql-12

步骤 3:测试 PostgreSQL 流复制

12.一旦主备服务器成功建立连接,您将在备用服务器中看到一个WAL接收进程,状态为流式传输,您可以查看此进程使用 pg_stat_wal_receiver 视图。

psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"

以及主/主服务器中相应的 WAL 发送进程,其状态为流式处理且 sync_state 为异步,您可以检查此 pg_stat_replication pg_stat_replication 视图。

psql -c "\x" -c "SELECT * FROM pg_stat_replication;"

从上面的截图来看,流式复制是异步的。在下一节中,我们将演示如何有选择地启用同步复制。

13. 现在通过在主服务器中创建测试数据库来测试复制是否正常工作,并检查它是否存在于备用服务器中。
[master]postgres=# 创建数据库 howtoing;
[备用]postgres=# \l

可选:启用同步复制

14.同步复制提供了同时向主数据库和备用数据库/副本数据库提交事务(或写入数据)的能力。仅当事务所做的所有更改均已传输到一台或多台同步备用服务器时,才确认事务成功。

要启用同步复制,还必须将synchronous_commit设置为on(这是默认值,因此无需任何更改),并且还需要设置synchronous_standby_names参数为非空值。对于本指南,我们将其设置为全部。

psql -c "ALTER SYSTEM SET synchronous_standby_names TO  '*';"

15. 然后重新加载 PostgreSQL 12 服务以应用新的更改。

systemctl reload postgresql-12.service

16.现在,当您再次查询主服务器上的WAL发送进程时,它应该显示流状态和sync_state同步

psql -c "\x" -c "SELECT * FROM pg_stat_replication;"

我们已经到了本指南的结尾。我们展示了如何在 CentOS 8 中设置 PostgreSQL 12 主备数据库流式复制。我们还介绍了如何在 PostgreSQL 数据库集群中启用同步复制。

复制有多种用途,您始终可以选择满足您的 IT 环境和/或应用程序特定要求的解决方案。有关更多详细信息,请参阅 PostgreSQL 12 文档中的日志传送备用服务器。