设置 PostgreSQL 流复制的分步指南

通过本分步教程,在 PostgreSQL 中建立可靠、高可用的流复制。了解如何使用 `wal_level = replica` 配置主服务器并更新 `pg_hba.conf`。我们详细介绍了使用 `pg_basebackup -R` 克隆数据目录的过程,并使用 `pg_stat_replication` 验证同步。本指南可确保您的 PostgreSQL 环境利用现代配置实践实现强大的数据冗余和故障转移功能。

41 浏览量

设置 PostgreSQL 流复制的分步指南

流复制是 PostgreSQL 环境中实现高可用性 (HA) 和读取可扩展性的基础机制。通过配置主 (master) 服务器持续将预写式日志 (WAL) 记录流式传输给一个或多个备用 (replica) 服务器,您可以确保数据同步,且延迟极小。

本综合指南将指导您完成建立稳定、异步流复制所需的关键步骤。我们涵盖了主服务器和备用服务器上必要的配置更改,并利用了现代 PostgreSQL 功能(例如 pg_basebackup 和信号文件)来简化设置。遵循本教程将为您稳健的 PostgreSQL 操作奠定可靠的基础。

先决条件和环境设置

在开始之前,请确保满足以下先决条件。本指南假定有两台服务器:主服务器和备用服务器,它们运行相同的主要 PostgreSQL 版本(建议版本 12 或更高)。

服务器 角色 IP 地址 (示例)
Primary (主) 事实来源 192.168.1.10
Standby (备用) 副本 192.168.1.11
  • 用户: 您必须在两台服务器上都拥有管理权限(例如 sudopostgres 系统用户)。
  • 网络: 备用服务器必须能够通过 PostgreSQL 端口(默认 5432)连接到主服务器。

步骤 1:配置主服务器

必须配置主服务器,以便它能够生成并提供 WAL 文件用于复制。

1.1 修改 postgresql.conf

编辑主配置文件,该文件通常位于数据目录中(例如 /etc/postgresql/14/main/postgresql.conf),并设置以下参数:

# 允许来自其他主机的连接
listen_addresses = '*'

# 将 WAL 级别设置为 'replica' 或更高
wal_level = replica

# 来自备用服务器的最大并发连接数
max_wal_senders = 5 

# 控制可同时活动的备用连接数
max_replication_slots = 5

# 备用服务器上进行只读查询所需 (热备用 Hot Standby)
hot_standby = on

1.2 创建专用的复制用户

出于安全考虑,创建一个具有 REPLICATION 属性的特定用户。该用户将仅供备用服务器用于拉取 WAL 记录。

# 连接到 PostgreSQL
psql -c "CREATE USER replica_user REPLICATION ENCRYPTED PASSWORD 'SuperSecurePassword123';"

1.3 更新客户端身份验证 (pg_hba.conf)

允许备用服务器 IP 地址的复制用户连接到特殊的 replication 伪数据库。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    replication     replica_user    192.168.1.11/32         md5

1.4 重启主服务器

通过重启 PostgreSQL 服务来应用更改:

sudo systemctl restart postgresql

步骤 2:准备备用服务器

在克隆数据之前,请确保备用服务器的 PostgreSQL 服务已停止,并且其现有数据目录已清空。

2.1 停止备用 PostgreSQL 服务

sudo systemctl stop postgresql

2.2 清空数据目录

警告: 此步骤将永久删除备用服务器数据目录中的所有现有数据。执行前请确认路径。

# PG 14 示例路径
PG_DATA=/var/lib/postgresql/14/main

sudo rm -rf $PG_DATA/*

2.3 使用 pg_basebackup 克隆数据

使用 pg_basebackup 创建主服务器数据目录的精确副本。-R 标志至关重要,因为它会自动生成流复制所需的配置文​​件 (standby.signalprimary_conninfo) (PostgreSQL 12+)。

在备用服务器上运行此命令:

PG_DATA=/var/lib/postgresql/14/main

sudo -u postgres pg_basebackup -h 192.168.1.10 -D $PG_DATA -U replica_user -P -v -R
选项 描述
-h 主服务器主机名/IP 地址。
-D 本地数据目录路径。
-U 复制用户名 (replica_user)。
-P 显示进度。
-v 详细输出。
-R 自动创建复制配置文件。

步骤 3:配置并启动备用服务器

3.1 验证备用配置

如果您在步骤 2.3 中使用了 -R 标志,pg_basebackup 会创建一个 standby.signal 文件,并设置 primary_conninfo 参数,该参数通常位于数据目录中名为 postgresql.auto.conf 的自动生成配置文件中。

验证 primary_conninfo 字符串的内容。它应类似于以下内容(检查 $PG_DATA/postgresql.auto.conf 内):

primary_conninfo = 'host=192.168.1.10 user=replica_user password=SuperSecurePassword123 application_name=standby_node'

提示: 确保密码包含在 primary_conninfo 中,或者您正在使用基于证书的身份验证。如果 pg_hba.conf 使用 trustcert 模式,则可以省略密码。

3.2 启动备用服务

由于数据目录中存在必需的信号文件 (standby.signal),服务将以只读备用模式启动,并立即尝试连接到主服务器。

sudo systemctl start postgresql

步骤 4:验证流复制

启动备用服务器后,您必须确认连接处于活动状态并且正在进行数据同步。

4.1 在主服务器上验证

连接到主服务器并查询 pg_stat_replication 视图。您应该看到一行表示来自备用服务器的连接。

psql -c "SELECT client_addr, state, sync_state, sent_lsn, write_lsn, flush_lsn FROM pg_stat_replication;"

预期输出(关键字段):

  • client_addr:应与备用服务器的 IP 地址匹配(例如 192.168.1.11)。
  • state:应为 streaming(流式传输中)。如果显示 startupcatching up(正在追赶),请稍候片刻。如果显示 walsender 正在启动,则表示即将成功。
  • sync_state:应为 async(异步)(对于标准的异步复制)。

4.2 测试数据同步

要确认数据流,请在主服务器上执行一项更改,并立即检查其在备用服务器上的存在性。

在主服务器上:

CREATE TABLE replication_test (id serial primary key, message text);
INSERT INTO replication_test (message) VALUES ('Data synchronized successfully');

在备用服务器上(只读):

-- 此操作必须成功且无错误
psql -c "SELECT * FROM replication_test;"

如果数据在备用服务器上可见,则表示流复制配置成功并处于活动状态。

最佳实践和故障排除

保持连接:复制槽

尽管是可选的,但强烈推荐使用复制槽。复制槽可确保主服务器不会过早丢弃备用服务器所需的 WAL 段,即使备用服务器暂时断开连接。

在主服务器上:

SELECT * FROM pg_create_physical_replication_slot('standby_slot_name');

然后,更新备用服务器上的 primary_conninfo 以利用此槽位:

primary_conninfo = 'host=192.168.1.10 user=replica_user ... application_name=standby_node **slotname=standby_slot_name**'

警告: 复制槽需要仔细监控。如果备用服务器长时间出现故障,受该槽位保护的累积 WAL 文件可能会导致主服务器的磁盘空间迅速占满。

常见问题故障排除

问题 潜在原因 解决方案
备用服务器停留在 starting(启动中)状态 网络防火墙或主服务器上的 pg_hba.conf 配置不正确。 验证端口 5432 是否打开;确认 pg_hba.conf 条目与备用服务器 IP 和用户匹配。
pg_basebackup 身份验证失败 密码不正确或 pg_hba.conf 中缺少主机条目。 仔细检查 replica_user 的密码;确保修改 pg_hba.conf 后主数据库已重启。
备用服务器是只读的 这是预期行为。 standby.signal 文件的存在强制服务器进入恢复模式。

结论

设置流复制是构建弹性 PostgreSQL 架构的关键一步。通过遵循这些步骤,您已成功配置了一个主备对,确保了持续的数据同步,显著增强了系统的高可用性能力。下一步是整合监控解决方案和故障转移机制(如 Patroni 或 Repmgr),以实现 HA 设置的完全自动化。