Centos7下PostgreSQL 12主备集群的高可用实践与优化
1. 环境准备与基础配置在CentOS7上部署PostgreSQL 12主备集群前需要做好以下准备工作。我遇到过不少因为基础环境没配好导致的部署失败案例这里把关键点都列出来。1.1 系统环境要求建议使用CentOS 7.6及以上版本我这里用的是CentOS 7.8。硬件配置根据业务需求来定测试环境可以用4核8G内存生产环境建议至少8核16G起步。磁盘空间要预留充足特别是WAL日志目录。先更新系统yum update -y yum install -y epel-release1.2 主机名与hosts配置主备节点的主机名要区分开我在/etc/hosts里做了如下配置# 主节点执行 hostnamectl set-hostname pg-master echo 192.168.1.101 pg-master 192.168.1.102 pg-slave /etc/hosts # 备节点执行 hostnamectl set-hostname pg-slave echo 192.168.1.101 pg-master 192.168.1.102 pg-slave /etc/hosts测试网络连通性ping pg-master ping pg-slave1.3 关闭防火墙和SELinux为了避免网络访问问题建议关闭防火墙systemctl stop firewalld systemctl disable firewalld关闭SELinuxsetenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config1.4 安装依赖包PostgreSQL需要一些基础依赖yum install -y readline-devel zlib-devel openssl-devel \ libxml2-devel libxslt-devel python-devel tcl-devel gcc make2. PostgreSQL安装与初始化2.1 安装PostgreSQL 12添加PostgreSQL官方源yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm安装PostgreSQL 12yum install -y postgresql12-server postgresql12-contrib2.2 初始化数据库主备节点都需要初始化/usr/pgsql-12/bin/postgresql-12-setup initdb systemctl enable postgresql-122.3 基础配置调整修改postgresql.conf关键参数vim /var/lib/pgsql/12/data/postgresql.conf listen_addresses * # 允许远程连接 port 5432 max_connections 500 # 根据实际情况调整 shared_buffers 1GB # 建议内存的25% wal_level replica # 流复制必须设置修改pg_hba.conf允许远程访问host all all 0.0.0.0/0 md5 host replication all 0.0.0.0/0 md53. 主备集群配置3.1 主节点配置创建复制专用用户CREATE USER replicator WITH REPLICATION LOGIN ENCRYPTED PASSWORD Replicator123;配置归档目录mkdir -p /var/lib/pgsql/12/archivedir chown postgres:postgres /var/lib/pgsql/12/archivedir修改postgresql.confarchive_mode on archive_command test ! -f /var/lib/pgsql/12/archivedir/%f cp %p /var/lib/pgsql/12/archivedir/%f max_wal_senders 10 # 最大WAL发送进程数 wal_keep_segments 64 # 保留的WAL段数重启主库生效systemctl restart postgresql-123.2 备节点配置先停止备节点服务systemctl stop postgresql-12清空数据目录rm -rf /var/lib/pgsql/12/data/*使用pg_basebackup从主节点同步数据su - postgres -c pg_basebackup -h pg-master -U replicator -D /var/lib/pgsql/12/data -P -R -X stream配置recovery.confPostgreSQL 12版本cat /var/lib/pgsql/12/data/standby.signal EOF standby_mode on primary_conninfo hostpg-master port5432 userreplicator passwordReplicator123 EOF启动备节点systemctl start postgresql-124. 高可用验证与优化4.1 主备状态检查在主节点查看复制状态SELECT client_addr, state, sync_state FROM pg_stat_replication;在备节点查看接收状态SELECT status, last_msg_send_time FROM pg_stat_wal_receiver;4.2 主备切换测试模拟主节点故障# 在主节点执行 systemctl stop postgresql-12提升备节点为主# 在备节点执行 su - postgres -c pg_ctl promote原主节点恢复为备# 在原主节点执行 rm -rf /var/lib/pgsql/12/data/* su - postgres -c pg_basebackup -h pg-slave -U replicator -D /var/lib/pgsql/12/data -P -R -X stream systemctl start postgresql-124.3 性能优化建议WAL相关参数优化wal_buffers 16MB checkpoint_timeout 15min max_wal_size 2GB min_wal_size 1GB内存参数调整work_mem 16MB maintenance_work_mem 256MB effective_cache_size 4GB并行查询设置max_parallel_workers_per_gather 4 max_parallel_workers 85. 常见问题解决方案5.1 复制中断处理当主备复制中断时可以尝试以下步骤检查网络连通性检查主备节点的PostgreSQL日志在备节点执行su - postgres -c pg_rewind --target-pgdata/var/lib/pgsql/12/data --source-serverhostpg-master userpostgres5.2 WAL堆积问题如果发现备节点WAL堆积可以检查备节点是否处于恢复状态增加wal_keep_segments参数值考虑设置归档命令自动清理旧WAL5.3 连接池优化建议使用pgbouncer管理连接yum install -y pgbouncer配置示例[databases] mydb hostpg-master dbnamemydb [pgbouncer] pool_mode transaction max_client_conn 500 default_pool_size 506. 监控与维护6.1 关键指标监控建议监控以下指标复制延迟连接数锁等待磁盘空间使用可以使用Prometheus Grafana方案配合postgres_exporter采集数据。6.2 定期维护任务定期执行VACUUMVACUUM (VERBOSE, ANALYZE) mytable;重建索引REINDEX TABLE mytable;统计信息更新ANALYZE VERBOSE;6.3 备份策略建议采用物理备份逻辑备份组合# 物理备份 pg_basebackup -h pg-master -D /backup/pg_basebackup -P -U replicator # 逻辑备份 pg_dump -h pg-master -U postgres -Fc mydb /backup/mydb.dump我在实际生产环境中使用这套方案已经稳定运行了2年多主备切换平均耗时在30秒以内。关键是要做好监控及时发现并处理潜在问题。