PostgreSQL 18 主从架构实战:3步配置流复制,实现读写分离与高可用
📅 2026/7/8 12:35:58
👁️ 阅读次数
📝 编程学习
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-server1.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/archivedir1.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 ~/.pgpass2.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.conf | primary_conninfo | 主库连接信息 |
| postgresql.conf | primary_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 故障转移测试
模拟主节点故障并验证高可用性:
停止主节点服务:
sudo systemctl stop postgresql-18提升从节点为主:
sudo -u postgres pg_ctl promote -D /var/lib/pgsql/18/data应用切换验证:
- 检查新主节点是否可读写
- 验证历史数据完整性
- 测试新写入数据是否持久化
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的高可用主从架构。这套方案不仅实现了数据的实时同步和读写分离,还能在主机故障时快速恢复服务,为业务连续性提供了坚实保障。
编程学习
技术分享
实战经验