PostgreSQL 18 主从架构实战:3步配置流复制,实现读写分离与高可用

PostgreSQL 18 主从架构实战:3步配置流复制,实现读写分离与高可用

PostgreSQL 18 主从架构实战:3步配置流复制,实现读写分离与高可用

在当今数据驱动的业务环境中,数据库的高可用性和读写分离能力已成为企业级应用的标配。PostgreSQL 18 作为最新版本的开源关系型数据库,其流复制功能为企业提供了稳定可靠的数据同步方案。本文将带您深入实践,通过三个关键步骤快速搭建生产级主从架构。

1. 环境准备与主节点配置

在开始配置前,我们需要确保所有节点满足以下基础条件:

  • 操作系统:Alibaba Cloud Linux 3/CentOS 8 或兼容系统
  • 硬件资源:建议至少4核CPU、8GB内存、100GB存储
  • 网络环境:节点间网络延迟<5ms,建议使用内网专线连接

1.1 安装PostgreSQL 18

首先在主节点执行以下命令添加官方YUM源并安装:

# 禁用系统默认PostgreSQL模块(仅CentOS 8需要) if [ -f /etc/os-release ]; then . /etc/os-release if [ "$ID" = "centos" ] && [ "${VERSION_ID%%.*}" = "8" ]; then sudo dnf --assumeyes module disable postgresql fi fi # 添加PostgreSQL官方仓库(使用阿里云镜像加速) sudo rpm -Uvh http://mirrors.cloud.aliyuncs.com/postgresql/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo sed -i "s@https://download.postgresql.org/pub@http://mirrors.cloud.aliyuncs.com/postgresql@g" /etc/yum.repos.d/pgdg-redhat-all.repo sudo sed -i "s@\$releasever@8@g" /etc/yum.repos.d/pgdg-redhat-all.repo # 安装服务端软件 sudo dnf install -y postgresql18-server

1.2 初始化主库配置

初始化数据库并修改关键参数:

# 初始化数据目录 sudo /usr/pgsql-18/bin/postgresql-18-setup initdb # 修改postgresql.conf核心参数 sudo tee -a /var/lib/pgsql/18/data/postgresql.conf << EOF listen_addresses = '*' wal_level = replica max_wal_senders = 3 archive_mode = on archive_command = 'test ! -f /var/lib/pgsql/18/archivedir/%f && cp %p /var/lib/pgsql/18/archivedir/%f' hot_standby = on EOF # 创建归档目录 sudo mkdir -p /var/lib/pgsql/18/archivedir sudo chown postgres:postgres /var/lib/pgsql/18/archivedir

1.3 配置复制用户与权限

创建专用复制账号并设置访问规则:

# 启动服务 sudo systemctl enable --now postgresql-18 # 创建复制用户 sudo -u postgres psql -c "CREATE ROLE replica_user WITH REPLICATION LOGIN PASSWORD 'SecurePass123!';" # 配置pg_hba.conf访问规则 sudo tee -a /var/lib/pgsql/18/data/pg_hba.conf << EOF host replication replica_user <从节点IP>/32 scram-sha-256 EOF # 创建物理复制槽(防止WAL日志被过早清理) sudo -u postgres psql -c "SELECT pg_create_physical_replication_slot('standby_slot1');" # 重启服务生效 sudo systemctl restart postgresql-18

注意:将<从节点IP>替换为实际从节点内网IP,生产环境密码应使用更复杂的组合

2. 从节点部署与数据同步

从节点需要从主库获取基础数据并配置为只读模式。

2.1 基础安装与准备

在从节点执行与主节点相同的安装步骤,但跳过初始化:

# 安装软件包(同主节点) sudo dnf install -y postgresql18-server # 创建密码文件 sudo -u postgres bash -c "echo '<主节点IP>:5432:replication:replica_user:SecurePass123!' > ~/.pgpass" sudo -u postgres chmod 600 ~/.pgpass

2.2 数据同步与配置

使用pg_basebackup进行基础备份:

# 清空现有数据目录 sudo rm -rf /var/lib/pgsql/18/data/* sudo chown postgres:postgres /var/lib/pgsql/18/data # 从主库同步数据 sudo -u postgres pg_basebackup -h <主节点IP> -D /var/lib/pgsql/18/data -U replica_user -P -v --wal-method=stream -R # 创建standby标识文件 sudo -u postgres touch /var/lib/pgsql/18/data/standby.signal

关键配置参数说明:

参数文件关键配置项作用说明
postgresql.confprimary_conninfo主库连接信息
postgresql.confprimary_slot_name复制槽名称
standby.signal(空文件)声明该实例为备库

2.3 启动从节点服务

完成配置后启动从节点:

sudo systemctl enable --now postgresql-18 # 验证复制状态 sudo -u postgres psql -c "SELECT pid, state, sync_state, replay_lag FROM pg_stat_replication;"

3. 高可用验证与优化

架构搭建完成后,需要进行全面的功能验证和性能调优。

3.1 复制状态监控

主节点上执行以下命令检查复制状态:

-- 查看复制连接状态 SELECT client_addr AS 从节点IP, state AS 状态, sync_state AS 同步模式, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) AS 延迟大小, EXTRACT(SECOND FROM (now() - reply_time)) AS 延迟秒数 FROM pg_stat_replication; -- 查看复制槽状态 SELECT slot_name, active, restart_lsn, confirmed_flush_lsn FROM pg_replication_slots;

3.2 故障转移测试

模拟主节点故障并验证高可用性:

  1. 停止主节点服务

    sudo systemctl stop postgresql-18
  2. 提升从节点为主

    sudo -u postgres pg_ctl promote -D /var/lib/pgsql/18/data
  3. 应用切换验证

    • 检查新主节点是否可读写
    • 验证历史数据完整性
    • 测试新写入数据是否持久化

3.3 性能优化建议

根据实际业务负载调整以下参数:

# 主节点postgresql.conf优化项 max_wal_senders = 5 # 根据从节点数量调整 wal_keep_size = 2GB # 保留的WAL日志大小 synchronous_commit = remote_apply # 同步提交级别 # 从节点postgresql.conf优化项 hot_standby_feedback = on # 避免主库vacuum清理正在查询的数据 max_standby_streaming_delay = 30s # 查询冲突时的最大延迟

4. 生产环境进阶配置

对于企业级应用,还需要考虑以下增强配置。

4.1 同步复制配置

确保数据零丢失的同步复制模式:

-- 在主节点执行 ALTER SYSTEM SET synchronous_standby_names = 'standby_slot1'; -- 验证配置 SELECT name, setting FROM pg_settings WHERE name LIKE 'synchronous%';

同步模式对比:

模式配置值数据安全性性能影响
异步off可能丢失少量数据最低
同步remote_write可能丢失1个事务中等
强同步remote_apply零数据丢失较高

4.2 自动故障转移方案

推荐使用Patroni等工具实现自动故障检测与切换:

# 示例Patroni配置片段 postgresql: parameters: wal_level: replica hot_standby: "on" use_pg_rewind: true recovery_conf: recovery_target_timeline: latest standby_mode: "on"

4.3 监控与告警配置

关键监控指标建议:

  • 主节点

    SELECT pg_current_wal_lsn() AS current_lsn, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS bytes_lag FROM pg_stat_replication;
  • 从节点

    SELECT pg_last_wal_receive_lsn() AS received_lsn, pg_last_wal_replay_lsn() AS replayed_lsn, pg_is_in_recovery() AS is_standby;

通过以上步骤,您已经成功搭建了PostgreSQL 18的高可用主从架构。这套方案不仅实现了数据的实时同步和读写分离,还能在主机故障时快速恢复服务,为业务连续性提供了坚实保障。