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

postgresqlcentosrdbms更新于 2024/8/15 7:40:17

简介

PostgreSQL 是最流行的开源关系数据库管理系统 (RDBMS) 之一。它提供了广泛的功能,例如数据完整性、容错性和可扩展性。流复制是 PostgreSQL 的一项基本功能。

它允许您通过将更改从主节点持续流式传输到备用节点,近乎实时地创建 PostgreSQL 数据库集群的多个副本。流复制的工作原理是通过网络连接将主节点生成的预写日志 (WAL) 数据流式传输到一个或多个备用节点。

配置主节点以进行流复制

在主节​​点上启用 WAL 归档

WAL(预写日志)是 PostgreSQL 中的关键组件,支持崩溃恢复和时间点恢复。为了设置流复制,我们需要在主节点上启用 WAL 归档。这将确保在主服务器上提交的所有事务除了写入 WAL 文件外,还写入指定的归档位置。

要启用 WAL 归档,您需要使用以下参数更新 `postgresql.conf` 文件 -

# 启用归档
archive_mode = on archive_command = 'cp %p /var/lib/pgsql/12/archive/%f'

在此示例中,我们启用了归档并指定了一个归档命令,该命令将 WAL 段从其默认目录(`pg_xlog`)复制到 `/var/lib/pgsql/12/archive`。您可以根据需要调整此路径。

配置 pg_hba.conf 文件以允许来自从节点的复制连接

为了让从节点能够连接主节点并复制数据,我们需要相应地配置 `pg_hba.conf` 文件。您需要在此文件中添加一个条目,指定允许来自特定 IP 地址或子网的复制连接 -

# 类型 数据库 用户 地址 复制方式 host 复制 repluser slave_ip/32 md5

在此示例中,我们添加了一个条目,允许使用 `md5` 身份验证方法从特定 IP 地址 (`slave_ip`) 进行连接。此外,我们创建了一个名为"replication"的新数据库,我们的复制用户将有权访问该数据库。

在主节点上创建具有适当权限的复制用户

现在,我们的主服务器已配置为流式复制,并且从服务器已获得连接授权,我们需要在主服务器上创建一个具有适当权限的新用户。该用户将负责对将复制到从服务器的主数据库进行必要的更改。要创建此用户,您可以以 PostgreSQL 超级用户身份使用以下 SQL 命令 -

CREATE ROLE repluser WITH REPLICATION LOGIN PASSWORD 'password';      

在本例中,我们创建了一个名为"repluser"的新角色,并赋予其复制权限。

我们还指定了登录权限并为其分配了密码。现在,我们的主节点已正确配置为流复制,我们可以继续配置从节点了。

配置从节点以进行流复制

在从节点上设置 recovery.conf 文件以连接到主节点

配置主节点进行流复制后,就可以设置从节点了。设置从节点的第一步是创建一个名为 recovery.conf 的配置文件。

此文件包含与主节点建立连接并启动流复制所需的信息。要创建此配置文件,首先需要确定需要设置的值。

通常,需要三个值:standby_mode、primary_conninfo 和 restore_command。Standby_mode 告知 PostgreSQL 此服务器将作为备用服务器运行,并应始终处于复制模式。

Primary_conninfo 提供有关如何连接到主节点的信息。Restore_command 告知 PostgreSQL 如何从归档 WAL 文件中检索任何丢失的数据。

确定这些值后,在 PostgreSQL 数据目录(通常为 /var/lib/pgsql/12/data/)中打开一个名为"recovery.conf"的新文件。按照以下格式将这些值添加为键/值对:

standby_mode = 'on' primary_conninfo = 'host= port=5432 user= password='
restore_command = 'cp /path/to/archive/%f "%p"'

请注意,%f 和 %p 是特殊字符,分别代表每个归档 WAL 段的名称和目标路径。

在从节点上启动 PostgreSQL 服务以启动复制过程

创建 recovery.conf 文件并正确填写必要参数后,就可以在从节点上启动 Postgres 服务了。

sudo systemctl start postgresql-12.service
sudo systemctl enable postgresql-12

此时,您的从服务器应该已成功与主服务器建立连接,并开始复制预写日志数据。

默认情况下,Postgres 会以连续循环的方式运行从服务器,检查主服务器上是否有新的 WAL 文件可用,并应用它们。您可以通过在从服务器节点上运行以下查询来检查复制是否正常工作:

SELECT * FROM pg_stat_replication;

这应该可以确认复制已在线并按预期工作。

测试和验证流复制设置

在配置主节点和从节点的流复制后,必须测试并验证复制是否已正确设置。为此,我们将使用一个名为 pg_stat_replication 的工具来显示有关流复制状态的信息。

首先,让我们使用 psql 连接到主节点-

bash 
$ sudo -i -u postgres psql 

现在执行以下命令显示有关流复制的信息 -

sql postgres=# SELECT client_addr, state, sync_state FROM pg_stat_replication;

上述查询返回有关每个已连接的流复制客户端实例的信息。"client_addr"列显示连接到主节点的每个从节点的 IP 地址;"state"显示当前连接是否正在用于流复制;而"sync_state"则显示数据当前是否正在从主节点流式传输到从节点。

使用 pg_stat_replication 视图检查复制状态

pg_stat_replication 视图为监控 PostgreSQL 12 中的副本提供了宝贵的见解。在监控 PostgreSQL 12 流复制方面,它是最关键的系统视图之一。

让我们了解如何使用 pg_stat_replication 视图检查副本(从)服务器是否与主(主)服务器同步。要检查所有副本是否与主服务器同步,请运行以下命令:

sql SELECT client_addr AS slave_ip_address,
state AS connection_state, sync_state AS synchronization_status
FROM pg_stat_replication;

此查询将显示每个副本的 IP 地址及其对应的连接状态和同步状态。

通过将从节点提升为新的主节点来测试故障转移

故障转移过程允许在当前主节点出现故障时进行切换。在 PostgreSQL 12 流复制中,故障转移过程必须手动完成。这意味着管理员需要干预并将其中一个从节点提升为新的主节点。

要执行故障转移,您需要执行以下步骤:

  • 断开与当前主节点的所有复制连接。

  • 通过将 recovery.conf 中的"recovery_target_timeline"设置为"latest"来提升其中一个从节点。

  • 在此提升的从属节点上启动 PostgreSQL 服务。

将从属节点提升为新的主节点后,必须检查所有其他从属节点是否已连接到此新主节点并正确接收数据。您可以再次使用 pg_stat_replication 视图来检查每个从属节点是否已成功连接 -

sql SELECT client_addr AS slave_ip_address,
state AS connection_state, sync_state AS synchronization_status
FROM pg_stat_replication

一旦您确定一切正常,就可以将应用程序的连接设置从旧的(故障的)主节点切换到新的主节点(提升的从属节点)。

结论

在本文中,我们讨论了如何在 CentOS 8 中配置 PostgreSQL 12 流复制,并详细介绍了如何设置主节点和从属节点。我们还学习了如何使用 pg_stat_replication 视图测试复制设置和监控副本服务器。我们还介绍了如何通过手动将其中一个从属节点提升为新的主节点来执行故障转移。