1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG120-PG高可用实战:企业级主从架构规划与运维

本文档风哥主要介绍PostgreSQL数据库企业级主从架构的规划与运维相关知识,包括高可用的概念、复制类型、架构设计、主从搭建、故障转移配置等内容,风哥教程参考PostgreSQL官方文档High Availability, Load Balancing, and Replication内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 PostgreSQL数据库高可用的概念

高可用(High Availability,HA)是指系统在面对各种故障时,能够保持持续可用的能力。对于PostgreSQL数据库来说,高可用意味着在主库发生故障时,能够快速切换到备用库,保证服务不中断。更多视频教程www.fgedu.net.cn

PostgreSQL数据库高可用的目标:

  • 减少停机时间
  • 提高系统可靠性
  • 保证数据一致性
  • 实现自动故障转移
  • 提供可扩展性

1.2 PostgreSQL数据库复制类型

PostgreSQL数据库支持多种复制类型:

  • 物理复制:基于WAL日志的复制,复制整个数据库集群
  • 逻辑复制:基于逻辑变更的复制,可以复制特定表或数据库
  • 同步复制:主库等待备库确认后才提交事务
  • 异步复制:主库不等待备库确认,直接提交事务
  • 半同步复制:主库等待至少一个备库确认后才提交事务

1.3 PostgreSQL数据库高可用架构

PostgreSQL数据库常见的高可用架构:

  • 主从架构:一个主库,一个或多个从库
  • 级联复制:从库作为其他从库的主库
  • 多主架构:多个主库,相互复制
  • 集群架构:使用Patroni、PostgreSQL Cluster等工具
风哥提示:选择合适的高可用架构需要考虑业务需求、性能要求、成本预算等因素。主从架构是最常见、最成熟的高可用方案。

Part02-生产环境规划与建议

2.1 PostgreSQL数据库高可用规划

PostgreSQL数据库高可用规划要点:

# 高可用架构规划
– 架构选择:主从架构、多主架构、集群架构
– 复制类型:物理复制、逻辑复制
– 同步方式:同步复制、异步复制、半同步复制
– 故障转移:手动故障转移、自动故障转移
– 负载均衡:读写分离、连接池

# 节点规划
– 主库:处理所有写操作和部分读操作
– 从库:处理读操作,作为备用库
– 仲裁节点:用于脑裂检测和决策

# 网络规划
– 网络拓扑:局域网、广域网
– 网络带宽:满足复制需求
– 网络延迟:影响复制性能
– 网络可靠性:冗余网络连接

# 存储规划
– 存储类型:SSD、HDD
– 存储容量:满足数据增长需求
– 存储性能:满足I/O需求
– 存储冗余:RAID、多路径

2.2 PostgreSQL数据库高可用硬件要求

PostgreSQL数据库高可用硬件要求:

# 主库硬件要求
– CPU:8核以上
– 内存:16GB以上
– 存储:SSD,容量根据数据量确定
– 网络:千兆网卡以上

# 从库硬件要求
– CPU:与主库相当或略低
– 内存:与主库相当或略低
– 存储:与主库相当
– 网络:与主库相当

# 仲裁节点硬件要求
– CPU:2核以上
– 内存:4GB以上
– 存储:50GB以上
– 网络:千兆网卡以上

# 负载均衡器硬件要求
– CPU:4核以上
– 内存:8GB以上
– 网络:千兆网卡以上

2.3 PostgreSQL数据库高可用网络要求

PostgreSQL数据库高可用网络要求:

  • 网络带宽:至少1Gbps,满足WAL日志传输需求
  • 网络延迟:主从之间延迟应小于10ms
  • 网络可靠性:建议使用冗余网络连接
  • 网络安全:使用VLAN隔离,配置防火墙规则
  • DNS配置:配置域名解析,支持故障转移
风哥教程针对风哥教程针对风哥教程针对生产环境建议:网络是高可用架构的关键因素,确保网络的可靠性和性能对于高可用架构的稳定运行至关重要。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 PostgreSQL数据库主从架构搭建

3.1.1 环境准备

# 1. 服务器信息
– 主库:192.168.1.101,fgedu-master
– 从库:192.168.1.102,fgedu-slave
– 操作系统:Oracle Linux 9.3
– PostgreSQL版本:15.0

# 2. 安装PostgreSQL
$ sudo dnf install postgresql-server postgresql-contrib
$ sudo postgresql-setup –initdb
$ sudo systemctl enable postgresql
$ sudo systemctl start postgresql

# 3. 配置防火墙
$ sudo firewall-cmd –permanent –add-port=5432/tcp
$ sudo firewall-cmd –reload

3.1.2 主库配置

# 1. 编辑postgresql.conf文件
$ sudo vi /postgresql/data/postgresql.conf

# 启用归档模式
archive_mode = on
archive_command = ‘cp %p /postgresql/archive/%f’

# 配置复制参数
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
max_replication_slots = 10

# 配置监听地址
listen_addresses = ‘*’

# 保存并退出

# 2. 编辑pg_hba.conf文件
$ sudo vi /postgresql/data/pg_hba.conf

# 添加复制用户访问权限
fgedu.net.cn replication replicator 192.168.1.102/32 md5

# 保存并退出

# 3. 创建复制用户
$ sudo -u pgsql psql
CREATE USER replicator WITH REPLICATION PASSWORD ‘replicator_password’;
\q

# 4. 创建归档目录
$ sudo mkdir -p /postgresql/archive
$ sudo chown pgsql: pgsql /postgresql/archive

# 5. 重启PostgreSQL服务
$ sudo systemctl restart postgresql

3.1.3 从库配置

# 1. 停止PostgreSQL服务
$ sudo systemctl stop postgresql

# 2. 删除默认数据目录
$ sudo rm -rf /postgresql/data/*

# 3. 使用pg_basebackup从主库复制数据
$ sudo -u pgsql pg_basebackup -h 192.168.1.101 -U replicator -D /postgresql/data -X stream -P
Password: replicator_password
31756/31756 kB (100%), 1/1 fgedutbs

# 4. 创建recovery.conf文件
$ sudo vi /postgresql/data/recovery.conf

standby_mode = ‘on’
primary_conninfo = ‘fgedu.net.cn=192.168.1.101 port=5432 fgedu=replicator password=replicator_password fgapplication_name=fgedu-slave’
restore_command = ‘cp /postgresql/archive/%f %p’
hot_standby = on

# 保存并退出

# 5. 启动PostgreSQL服务
$ sudo systemctl start postgresql

3.2 PostgreSQL数据库复制配置

3.2.1 配置半同步复制

# 1. 在主库上安装半同步复制插件
$ sudo -u pgsql psql
CREATE EXTENSION pg_stat_statements;
\q

# 2. 编辑postgresql.conf文件
$ sudo vi /postgresql/data/postgresql.conf

# 启用半同步复制
shared_preload_libraries = ‘pg_stat_statements, pg_stat_kcache, pg_semi_sync_master’
synchronous_commit = on
synchronous_standby_names = ‘fgedu-slave’

# 保存并退出

# 3. 在从库上安装半同步复制插件
$ sudo -u pgsql psql
CREATE EXTENSION pg_stat_statements;
\q

# 4. 编辑postgresql.conf文件
$ sudo vi /postgresql/data/postgresql.conf

# 启用半同步复制
shared_preload_libraries = ‘pg_stat_statements, pg_stat_kcache, pg_semi_sync_standby’

# 保存并退出

# 5. 重启主库和从库
$ sudo systemctl restart postgresql

# 6. 验证半同步复制状态
$ sudo -u pgsql psql -c “SELECT * FROM pg_stat_replication;”
pid | usesysid | usename | fgapplication_name | client_addr | client_fgedu.net.cnname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
—–+———-+———+——————+————-+—————–+————-+—————+————–+——-+———-+———–+———–+————+———–+———–+————+—————+————
123 | 16384 | replicator | fgedu-slave | 192.168.1.102 | | 5432 | 2026-04-02 10:00:00 | | streaming | 0/12345678 | 0/12345678 | 0/12345678 | 0/12345678 | | | | 1 | sync
(1 row)

3.3 PostgreSQL数据库故障转移配置

3.3.1 配置手动故障转移

# 1. 监控主库状态
$ sudo -u pgsql psql -h 192.168.1.101 -c “SELECT pg_is_in_recovery();”
pg_is_in_recovery
——————-
f
(1 row)

# 2. 模拟主库故障
$ sudo systemctl stop postgresql

# 3. 在从库上执行故障转移
$ sudo -u pgsql psql -c “SELECT pg_promote();”
pg_promote
————
t
(1 row)

# 4. 验证从库是否成为主库
$ sudo -u pgsql psql -c “SELECT pg_is_in_recovery();”
pg_is_in_recovery
——————-
f
(1 row)

# 5. 更新应用连接配置
# 将应用连接指向新的主库(192.168.1.102)

3.3.2 配置自动故障转移(使用Patroni)

# 1. 安装Patroni和依赖
$ sudo pip3 install patroni psycopg2-binary etcd3

# 2. 配置etcd
$ sudo dnf install etcd
$ sudo systemctl enable etcd
$ sudo systemctl start etcd

# 3. 创建Patroni配置文件
$ sudo vi /etc/patroni.yml

scope: pgsql namespace: /db/
name: node1

restapi:
listen: 192.168.1.101:8008
connect_address: 192.168.1.101:8008

etcd:
fgedu.net.cn: 192.168.1.101:2379

postgresql:
listen: 192.168.1.101:5432
connect_address: 192.168.1.101:5432
data_dir: /postgresql/data
bin_dir: /usr/bin
pgpass: /tmp/pgpass
authentication:
replication:
fgeduname: replicator
password: replicator_password
superfgedu:
fgeduname: pgsql password: postgres_password
parameters:
wal_level: replica
hot_standby: “on”
max_connections: 100
shared_buffers: 256MB

# 4. 启动Patroni服务
$ sudo systemctl start patroni
$ sudo systemctl enable patroni

# 5. 验证Patroni状态
$ sudo patronictl -c /etc/patroni.yml list
+ Cluster: pgsql (6905470283994048833) —+—-+———–+
| Member | Host | Role | State | TL | Lag in MB |
+——–+—————-+———+———+—-+———–+
| node1 | 192.168.1.101:5432 | Leader | running | 1 | 0 |
| node2 | 192.168.1.102:5432 | Replica | running | 1 | 0 |
+——–+—————-+———+———+—-+———–+

风哥提示:自动故障转移可以大大减少人工干预,提高系统的可用性。建议在生产环境中使用Patroni等工具实现自动故障转移。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 PostgreSQL数据库高可用常见问题

在PostgreSQL数据库高可用管理过程中,可能会遇到以下问题:

4.1.1 复制延迟

# 问题现象:从库复制延迟较大
# 分析步骤:

# 1. 检查复制状态
$ sudo -u pgsql psql -c “SELECT * FROM pg_stat_replication;”
pid | usesysid | usename | fgapplication_name | client_addr | client_fgedu.net.cnname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
—–+———-+———+——————+————-+—————–+————-+—————+————–+——-+———-+———–+———–+————+———–+———–+————+—————+————
123 | 16384 | replicator | fgedu-slave | 192.168.1.102 | | 5432 | 2026-04-02 10:00:00 | | streaming | 0/12345678 | 0/12340000 | 0/12330000 | 0/12320000 | 00:00:01 | 00:00:02 | 00:00:03 | 1 | sync
(1 row)

# 2. 检查网络状态
$ ping 192.168.1.101 -c 10
$ iperf3 -c 192.168.1.101

# 3. 检查从库性能
$ sudo -u pgsql psql -c “SELECT * FROM pg_stat_fgedudb;”
$ top

# 4. 检查WAL生成速率
$ sudo -u pgsql psql -c “SELECT pg_current_wal_lsn();”
$ sleep 60
$ sudo -u pgsql psql -c “SELECT pg_current_wal_lsn();”

# 5. 解决方法
# – 优化网络带宽
# – 提高从库性能
# – 调整WAL相关参数
# – 考虑使用级联复制

4.2 PostgreSQL数据库高可用问题解决方案

# 常见高可用问题及解决方案

# 1. 复制延迟
– 症状:从库与主库数据不一致,延迟较大
– 解决方案:
$ sudo vi /postgresql/data/postgresql.conf
# 增加WAL发送器数量
max_wal_senders = 20
# 增加WAL保留大小
wal_keep_size = 2GB
# 调整检查点参数
checkpoint_timeout = 30min
max_wal_size = 1GB

# 2. 脑裂
– 症状:多个节点同时认为自己是主库
– 解决方案:
# 使用Patroni等工具管理集群
# 配置仲裁节点
# 使用网络分区检测

# 3. 故障转移失败
– 症状:主库故障后,从库无法成为主库
– 解决方案:
# 检查从库状态
$ sudo -u pgsql psql -c “SELECT pg_is_in_recovery();”
# 手动执行故障转移
$ sudo -u pgsql psql -c “SELECT pg_promote();”
# 检查recovery.conf文件配置

# 4. 网络分区
– 症状:主从之间网络中断
– 解决方案:
# 配置冗余网络
# 使用心跳检测
# 调整网络超时参数

# 5. 性能问题
– 症状:高可用架构性能下降
– 解决方案:
# 优化PostgreSQL参数
# 配置读写分离
# 使用连接池
# 考虑水平扩展

4.3 PostgreSQL数据库高可用实战案例

# 案例:企业级PostgreSQL高可用架构部署

# 1. 架构设计
– 主库:192.168.1.101
– 从库1:192.168.1.102
– 从库2:192.168.1.103
– Patroni:管理集群
– etcd:分布式一致性存储
– HAProxy:负载均衡
– Keepalived:VIP管理

# 2. 部署步骤

# 2.1 安装PostgreSQL
$ sudo dnf install postgresql-server postgresql-contrib
$ sudo postgresql-setup –initdb

# 2.2 配置主库
$ sudo vi /postgresql/data/postgresql.conf
archive_mode = on
archive_command = ‘cp %p /postgresql/archive/%f’
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
max_replication_slots = 10
listen_addresses = ‘*’

$ sudo vi /postgresql/data/pg_hba.conf
fgedu.net.cn replication replicator 192.168.1.0/24 md5

$ sudo -u pgsql psql
CREATE USER replicator WITH REPLICATION PASSWORD ‘replicator_password’;
\q

# 2.3 配置从库
$ sudo systemctl stop postgresql
$ sudo rm -rf /postgresql/data/*
$ sudo -u pgsql pg_basebackup -h 192.168.1.101 -U replicator -D /postgresql/data -X stream -P
$ sudo vi /postgresql/data/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘fgedu.net.cn=192.168.1.101 port=5432 fgedu=replicator password=replicator_password fgapplication_name=fgedu-slave1’
restore_command = ‘cp /postgresql/archive/%f %p’
hot_standby = on

# 2.4 安装配置Patroni
$ sudo pip3 install patroni psycopg2-binary etcd3
$ sudo vi /etc/patroni.yml
# 配置文件内容参考前面章节
$ sudo systemctl start patroni
$ sudo systemctl enable patroni

# 2.5 安装配置HAProxy
$ sudo dnf install haproxy
$ sudo vi /etc/haproxy/haproxy.cfg
# 配置内容参考前面章节
$ sudo systemctl start haproxy
$ sudo systemctl enable haproxy

# 2.6 安装配置Keepalived
$ sudo dnf install keepalived
$ sudo vi /etc/keepalived/keepalived.conf
# 配置VIP
$ sudo systemctl start keepalived
$ sudo systemctl enable keepalived

# 3. 验证高可用架构
$ sudo patronictl -c /etc/patroni.yml list
$ sudo haproxy -c -f /etc/haproxy/haproxy.cfg
$ sudo ip addr show

# 4. 测试故障转移
$ sudo systemctl stop postgresql on master
$ sudo patronictl -c /etc/patroni.yml list
$ sudo ip addr show

风哥教程针对风哥教程针对风哥教程针对生产环境建议:企业级高可用架构需要考虑多方面因素,包括硬件、网络、软件配置等。建议定期进行故障演练,确保在真正的故障发生时能够快速响应。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 PostgreSQL数据库高可用最佳实践

PostgreSQL数据库高可用最佳实践:

  • 选择合适的架构:根据业务需求选择合适的高可用架构
  • 合理配置复制:根据业务需求选择同步或异步复制
  • 使用专业工具:使用Patroni等工具管理高可用集群
  • 定期监控:监控复制状态、网络状态、系统性能
  • 定期演练:定期进行故障转移演练,确保系统可靠性
  • 备份策略:制定合理的备份策略,确保数据安全
  • 文档化:详细记录高可用架构的配置和操作流程
  • 培训:对运维人员进行高可用相关培训
风哥提示:高可用架构的设计和维护需要综合考虑多个因素,包括技术、人员、流程等。建议建立完善的高可用管理体系,确保系统的稳定运行。from PostgreSQL:www.itpux.com

5.2 PostgreSQL数据库高可用检查清单

# 高可用架构检查清单
– [ ] 选择合适的高可用架构
– [ ] 配置合理的复制参数
– [ ] 安装并配置Patroni等管理工具
– [ ] 配置负载均衡器
– [ ] 配置监控系统
– [ ] 制定故障转移流程
– [ ] 定期进行故障演练
– [ ] 建立备份策略
– [ ] 文档化配置和操作流程
– [ ] 对运维人员进行培训

# 高可用故障处理流程
1. 发现故障
2. 确认故障类型和影响范围
3. 启动故障转移流程
4. 验证新主库状态
5. 处理原主库故障
6. 重新加入集群
7. 总结经验,优化流程

5.3 PostgreSQL数据库高可用管理工具推荐

PostgreSQL数据库高可用管理常用工具:

from oracle:www.itpux.com

  • Patroni:自动化PostgreSQL集群管理工具
  • etcd:分布式一致性存储,用于Patroni集群
  • HAProxy:负载均衡器,用于读写分离
  • Keepalived:实现VIP管理
  • PgBouncer:连接池,提高性能
  • Prometheus+Grafana:监控系统
  • pgBackRest:备份工具
  • Barman:备份和恢复管理工具
持续改进:高可用架构的管理是一个持续的过程,需要定期review和优化。建议建立高可用管理的规范和流程,不断改进高可用管理水平。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息