1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG298-PG异地容灾实战:跨机房主从架构搭建

本文档风哥主要介绍PostgreSQL的异地容灾方案,包括跨机房主从架构的搭建、监控和故障切换。风哥教程参考PostgreSQL官方文档和企业级容灾最佳实践,适合需要高可用性和灾难恢复能力的企业环境。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 异地容灾概述

异地容灾是指在不同地理位置的数据中心部署数据库系统,当主数据中心发生灾难时,能够快速切换到备用数据中心,确保业务连续性。异地容灾的核心目标:

  • 业务连续性:确保灾难发生时业务能够持续运行
  • 数据安全:保护数据不丢失,确保数据一致性
  • 快速恢复:在灾难发生后能够快速恢复业务
  • 最小化损失:减少灾难对业务的影响
异地容灾的重要性:

随着业务对数据可靠性要求的不断提高,异地容灾已经成为企业IT基础设施的必备组成部分。对于金融、电信、电商等关键行业,异地容灾更是法规要求的一部分。

1.2 容灾级别与分类

根据容灾的恢复时间目标(RTO)和恢复点目标(RPO),容灾级别可以分为:

# 容灾级别与分类

## 1. 容灾级别

### 1.1 级别0:无容灾
– **RTO:** 几天到几周
– **RPO:** 完全数据丢失
– **特点:** 无备份或仅本地备份

### 1.2 级别1:本地备份
– **RTO:** 几小时到几天
– **RPO:** 几小时到几天的数据丢失
– **特点:** 定期本地备份,灾难发生后需要重建系统

### 1.3 级别2:热备份
– **RTO:** 几十分钟到几小时
– **RPO:** 几分钟到几小时的数据丢失
– **特点:** 有热备份系统,但需要手动切换

### 1.4 级别3:温备份
– **RTO:** 几分钟到几十分钟
– **RPO:** 几秒到几分钟的数据丢失
– **特点:** 有温备份系统,自动切换能力有限

### 1.5 级别4:热备份与自动切换
– **RTO:** 几秒到几分钟
– **RPO:** 近零数据丢失
– **特点:** 有热备份系统,支持自动切换

### 1.6 级别5:多活架构
– **RTO:** 零
– **RPO:** 零
– **特点:** 多个数据中心同时运行,自动负载均衡

## 2. 容灾分类

### 2.1 同步复制
– **特点:** 数据实时同步到备库,主库事务提交需要等待备库确认
– **优势:** 数据一致性高,RPO接近零
– **劣势:** 主库性能受网络延迟影响

### 2.2 异步复制
– **特点:** 数据异步同步到备库,主库事务提交不需要等待备库确认
– **优势:** 主库性能不受网络延迟影响
– **劣势:** 可能存在数据不一致,RPO大于零

### 2.3 半同步复制
– **特点:** 数据同步到至少一个备库后,主库才提交事务
– **优势:** 平衡数据一致性和性能
– **劣势:** 主库性能仍受一定影响

1.3 PostgreSQL复制技术

PostgreSQL提供了多种复制技术,适合不同的容灾场景:

# PostgreSQL复制技术

## 1. 物理复制
– **定义:** 基于WAL日志的复制,复制整个数据库集群
– **优势:** 复制效率高,支持增量同步
– **劣势:** 备库不能执行写操作
– **适用场景:** 异地容灾、读写分离

## 2. 逻辑复制
– **定义:** 基于逻辑变更的复制,可以复制特定表或数据库
– **优势:** 灵活性高,支持跨版本复制
– **劣势:** 复制效率较低
– **适用场景:** 数据迁移、部分数据复制

## 3. 流复制
– **定义:** 实时传输WAL日志的物理复制
– **优势:** 延迟低,数据一致性高
– **劣势:** 对网络要求较高
– **适用场景:** 高可用集群、异地容灾

## 4. 级联复制
– **定义:** 从备库复制到其他备库
– **优势:** 减轻主库负担,适合多数据中心场景
– **劣势:** 增加复制延迟
– **适用场景:** 多数据中心容灾

风哥提示:选择合适的复制技术需要根据网络条件、性能要求和数据一致性需求综合考虑。对于异地容灾,通常建议使用异步流复制或半同步流复制。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 规划考虑因素

PostgreSQL异地容灾方案的规划考虑因素:

# 规划考虑因素

## 1. 业务需求
– **RTO和RPO要求:** 根据业务重要性确定恢复时间和数据丢失容忍度
– **业务连续性:** 确保关键业务能够持续运行
– **数据安全:** 保护数据不丢失,确保数据一致性

## 2. 技术因素
– **复制类型:** 选择同步、异步或半同步复制
– **网络条件:** 评估跨机房网络带宽和延迟
– **存储规划:** 确保备库存储容量足够
– **监控系统:** 建立完善的监控和告警机制

## 3. 成本因素
– **硬件成本:** 服务器、存储和网络设备成本
– **运维成本:** 日常维护和演练成本
– **带宽成本:** 跨机房数据传输成本

## 4. 地理因素
– **距离:** 主备数据中心的距离
– **灾备覆盖:** 确保备数据中心不在同一灾难区域
– **法律合规:** 遵守数据存储和传输的法规要求

## 5. 运维因素
– **人员培训:** 确保运维人员掌握容灾切换流程
– **演练计划:** 定期进行灾难恢复演练
– **文档管理:** 完善容灾方案文档

2.2 资源估算

PostgreSQL异地容灾方案的资源估算:

# 资源估算

## 1. 存储估算
– **数据存储:** 与主库相同的存储容量
– **WAL日志:** 至少为数据存储的10-20%
– **备份存储:** 至少为数据存储的1-2倍

## 2. 内存估算
– **共享缓冲区:** 与主库相同或略小
– **工作内存:** 根据查询需求确定
– **维护工作内存:** 根据维护操作需求确定

## 3. CPU估算
– **核心数:** 与主库相同或略少
– **性能:** 确保备库能够处理复制和可能的读操作

## 4. 网络估算
– **带宽:** 根据数据变更量和复制模式确定
– 同步复制:需要足够的带宽确保低延迟
– 异步复制:可以适当降低带宽要求
– **延迟:** 理想情况下网络延迟应低于100ms

## 5. 资源计算公式
– **存储:** 总存储 = 数据存储 + WAL日志 + 备份存储
– **网络带宽:** 带宽 = 平均每秒WAL生成量 × 1.5(冗余系数)

2.3 网络要求

PostgreSQL异地容灾的网络要求:

网络配置建议:

  • 网络连接:建议使用专线或VPN连接,确保网络稳定性
  • 带宽:根据数据变更量和复制模式确定,建议至少100Mbps
  • 延迟:建议网络延迟低于100ms,以确保复制性能
  • 可靠性:建议使用多线路冗余,确保网络连接稳定
  • 安全性:建议使用加密传输,保护数据安全

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

3.1 主库搭建

3.1.1 环境准备

# 主库搭建

## 1. 环境准备
“`bash
# 安装PostgreSQL 18
sudo apt update
sudo apt install postgresql-18 postgresql-contrib-18

# 创建数据目录
sudo mkdir -p /data/pgsql
sudo chown pgsql: pgsql /data/pgsql

# 初始化数据库集群
sudo -u pgsql initdb -D /data/pgsql
“`

## 2. 配置主库
“`bash
# 编辑postgresql.conf
sudo vi /data/pgsql/postgresql.conf

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

# 配置复制参数
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
hot_standby = on

# 保存并退出

# 创建归档目录
sudo mkdir -p /data/archive
sudo chown pgsql: pgsql /data/archive

# 编辑pg_hba.conf,添加复制用户权限
sudo vi /data/pgsql/pg_hba.conf

# 在文件末尾添加
fgedu.net.cn replication replfgedu 192.168.1.0/24 md5
fgedu.net.cn replication replfgedu 10.0.0.0/24 md5

# 保存并退出

# 启动PostgreSQL服务
sudo systemctl start postgresql

# 创建复制用户
sudo -u pgsql psql -c “CREATE ROLE replfgedu WITH REPLICATION LOGIN PASSWORD ‘replpassword’;”
“`

3.2 异地备库搭建

3.2.1 环境准备

# 异地备库搭建

## 1. 环境准备
“`bash
# 安装PostgreSQL 18
sudo apt update
sudo apt install postgresql-18 postgresql-contrib-18

# 创建数据目录
sudo mkdir -p /data/pgsql
sudo chown pgsql: pgsql /data/pgsql
“`

## 2. 基础备份
“`bash
# 使用pg_basebackup创建基础备份
sudo -u pgsql pg_basebackup -h 192.168.1.100 -U replfgedu -D /data/pgsql -F p -X stream -P

# 输入密码:replpassword
“`

## 3. 配置备库
“`bash
# 创建recovery.conf文件
sudo -u pgsql vi /data/pgsql/recovery.conf

# 添加以下内容
standby_mode = ‘on’
primary_conninfo = ‘fgedu.net.cn=192.168.1.100 port=5432 fgedu=replfgedu password=replpassword fgapplication_name=standby1’
recovery_target_timeline = ‘latest’

# 保存并退出

# 启动PostgreSQL服务
sudo systemctl start postgresql
“`

## 4. 验证复制状态
“`bash
# 在主库上查看复制状态
sudo -u pgsql psql -c “SELECT * FROM pg_stat_replication;”

# 输出示例
# -[ RECORD 1 ]—-+——————————
# pid | 12345
# usesysid | 16384
# usename | replfgedu
# fgapplication_name | standby1
# client_addr | 10.0.0.100
# client_fgedu.net.cnname |
# client_port | 5432
# backend_start | 2024-01-01 10:00:00.000000+00
# backend_xmin |
# state | streaming
# sent_lsn | 0/12345678
# write_lsn | 0/12345678
# flush_lsn | 0/12345678
# replay_lsn | 0/12345678
# write_lag |
# flush_lag |
# replay_lag |
# sync_priority | 0
# sync_state | async

# 在备库上查看复制状态
sudo -u pgsql psql -c “SELECT * FROM pg_stat_wal_receiver;”
“`

3.3 监控与告警

3.3.1 Prometheus + Grafana监控

# 监控与告警

## 1. 安装PostgreSQL Exporter
“`bash
# 下载并安装PostgreSQL Exporter
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.15.0/postgres_exporter-0.15.0.linux-amd64.tar.gz
tar -xzf postgres_exporter-0.15.0.linux-amd64.tar.gz
cd postgres_exporter-0.15.0.linux-amd64
sudo cp postgres_exporter /usr/local/bin/

# 创建配置文件
sudo vi /etc/postgres_exporter.yml

# 添加以下内容
data_source_name: “postgresql://pgsql: pgsql@localfgedu.net.cn:5432/postgres?sslmode=disable”

# 创建systemd服务文件
sudo vi /etc/systemd/system/postgres_exporter.service

# 添加以下内容
[Unit]
Description=PostgreSQL Exporter
After=network.target

[Service]
Type=simple
User=pgsql ExecStart=/usr/local/bin/postgres_exporter –config.file=/etc/postgres_exporter.yml
Restart=always

[Install]
WantedBy=multi-fgedu.target

# 启动服务
sudo systemctl daemon-reload
sudo systemctl start postgres_exporter
sudo systemctl enable postgres_exporter
“`

## 2. 配置Prometheus
“`bash
# 编辑Prometheus配置文件
sudo vi /etc/prometheus/prometheus.yml

# 添加PostgreSQL Exporter目标
scrape_configs:
– job_name: ‘postgres’
static_configs:
– targets: [‘localfgedu.net.cn:9187’]
labels:
instance: ‘primary’
– job_name: ‘postgres_standby’
static_configs:
– targets: [‘10.0.0.100:9187’]
labels:
instance: ‘standby’

# 重启Prometheus
sudo systemctl restart prometheus
“`

## 3. 配置Grafana面板
“`bash
# 导入PostgreSQL监控面板
# 面板ID: 9628

# 配置告警规则
sudo vi /etc/prometheus/rules/postgres_alerts.yml

# 添加以下内容
groups:
– name: postgresql
rules:
– alert: PostgreSQLReplicationLag
expr: pg_replication_lag > 300
for: 5m
labels:
severity: critical
annotations:
summary: “PostgreSQL replication lag”
description: “Replication lag on {{ $labels.instance }} is {{ $value }} seconds”

– alert: PostgreSQLDown
expr: pg_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: “PostgreSQL down”
description: “PostgreSQL on {{ $labels.instance }} is down”

# 重启Prometheus
sudo systemctl restart prometheus
“`

风哥提示:监控系统是异地容灾方案的重要组成部分,需要实时监控主备库状态、复制延迟和网络连接。建议配置完善的告警机制,确保能够及时发现和处理问题。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 跨机房架构实现

4.1.1 架构设计

# 跨机房架构实现

## 1. 架构设计
– **主数据中心:** 生产环境,运行主库
– **备用数据中心:** 异地灾备,运行备库
– **网络连接:** 专线连接,确保网络稳定性
– **复制模式:** 异步流复制,平衡性能和数据一致性

## 2. 实施步骤

### 2.1 主库配置
“`bash
# 编辑postgresql.conf
sudo vi /data/pgsql/postgresql.conf

# 配置复制参数
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
hot_standby = on
archive_mode = on
archive_command = ‘cp %p /data/archive/%f’

# 保存并退出

# 编辑pg_hba.conf
sudo vi /data/pgsql/pg_hba.conf

# 添加复制用户权限
fgedu.net.cn replication replfgedu 10.0.0.0/24 md5

# 保存并退出

# 重启PostgreSQL
sudo systemctl restart postgresql

# 创建复制用户
sudo -u pgsql psql -c “CREATE ROLE replfgedu WITH REPLICATION LOGIN PASSWORD ‘replpassword’;”
“`

### 2.2 备库配置
“`bash
# 基础备份
sudo -u pgsql pg_basebackup -h 192.168.1.100 -U replfgedu -D /data/pgsql -F p -X stream -P

# 创建recovery.conf
sudo -u pgsql vi /data/pgsql/recovery.conf

# 添加以下内容
standby_mode = ‘on’
primary_conninfo = ‘fgedu.net.cn=192.168.1.100 port=5432 fgedu=replfgedu password=replpassword fgapplication_name=standby1’
recovery_target_timeline = ‘latest’

# 保存并退出

# 启动PostgreSQL
sudo systemctl start postgresql
“`

### 2.3 验证架构
“`bash
# 查看主库复制状态
sudo -u pgsql psql -c “SELECT * FROM pg_stat_replication;”

# 查看备库状态
sudo -u pgsql psql -c “SELECT pg_is_in_recovery();”

# 查看复制延迟
sudo -u pgsql psql -c “SELECT now() – pg_last_xact_replay_timestamp() AS replication_lag;”
“`

## 3. 网络优化
“`bash
# 配置网络路由
sudo vi /etc/network/interfaces

# 添加静态路由
auto eth0
iface eth0 inet static
address 10.0.0.100
netmask 255.255.255.0
gateway 10.0.0.1
post-up route add -net 192.168.1.0/24 gw 10.0.0.1

# 保存并退出

# 重启网络
sudo systemctl restart networking

# 测试网络连通性
ping 192.168.1.100
“`

4.2 故障切换实战

4.2.1 手动故障切换

# 故障切换实战

## 1. 手动故障切换

### 1.1 确认主库故障
“`bash
# 尝试连接主库
sudo -u pgsql psql -h 192.168.1.100 -c “SELECT now();”

# 如果连接失败,确认主库故障
“`

### 1.2 提升备库为主库
“`bash
# 在备库上停止PostgreSQL
sudo systemctl stop postgresql

# 删除recovery.conf文件
sudo rm /data/pgsql/recovery.conf

# 启动PostgreSQL
sudo systemctl start postgresql

# 确认备库已提升为主库
sudo -u pgsql psql -c “SELECT pg_is_in_recovery();”
# 输出应该为 false
“`

### 1.3 重新配置应用连接
“`bash
# 修改应用配置,指向新的主库
# 例如修改应用配置文件中的数据库连接字符串
# db_url = “postgresql://fgedu:password@10.0.0.100:5432/fgedudb”

# 重启应用服务
sudo systemctl restart fgapplication
“`

## 2. 使用Patroni自动故障切换

### 2.1 安装Patroni
“`bash
# 安装Python和pip
sudo apt install python3 python3-pip

# 安装Patroni和相关依赖
sudo pip3 install patroni psycopg2-binary python-etcd
“`

### 2.2 配置Patroni
“`bash
# 创建Patroni配置文件
sudo vi /etc/patroni.yml

# 添加以下内容
scope: pgsql topology:
primary: 192.168.1.100
standby: 10.0.0.100

postgresql:
listen: “*:5432”
connect_address: “192.168.1.100:5432”
data_dir: “/data/pgsql”
bin_dir: “/usr/lib/postgresql/18/bin”
parameters:
wal_level: replica
hot_standby: “on”
max_wal_senders: 10
max_replication_slots: 10
wal_keep_size: “1GB”

authentication:
replication:
fgeduname: replfgedu
password: replpassword
superfgedu:
fgeduname: pgsql password: pgsql etcd:
fgedu.net.cns: “192.168.1.100:2379,192.168.1.101:2379,192.168.1.102:2379”

# 保存并退出
“`

### 2.3 启动Patroni
“`bash
# 创建systemd服务文件
sudo vi /etc/systemd/system/patroni.service

# 添加以下内容
[Unit]
Description=Patroni PostgreSQL HA
After=network.target

[Service]
Type=simple
User=pgsql ExecStart=/usr/local/bin/patroni /etc/patroni.yml
Restart=always

[Install]
WantedBy=multi-fgedu.target

# 启动Patroni
sudo systemctl daemon-reload
sudo systemctl start patroni
sudo systemctl enable patroni
“`

### 2.4 测试自动故障切换
“`bash
# 模拟主库故障
sudo systemctl stop postgresql

# 查看Patroni日志
sudo journalctl -u patroni -f

# 确认备库已提升为主库
sudo -u pgsql psql -h 10.0.0.100 -c “SELECT pg_is_in_recovery();”
“`

4.3 灾难恢复演练

4.3.1 演练计划

# 灾难恢复演练

## 1. 演练计划
– **演练目标:** 验证异地容灾方案的有效性
– **演练频率:** 每季度一次
– **演练类型:** 全流程演练,包括故障切换和回切
– **参与人员:** DBA、系统管理员、应用开发人员

## 2. 演练步骤

### 2.1 准备工作
“`bash
# 确认主备库状态正常
sudo -u pgsql psql -c “SELECT * FROM pg_stat_replication;”

# 备份当前配置文件
sudo cp /etc/patroni.yml /etc/patroni.yml.bak

# 通知相关人员演练时间
“`

### 2.2 模拟灾难
“`bash
# 模拟主库故障
sudo systemctl stop postgresql

# 确认备库开始提升
sudo -u pgsql psql -h 10.0.0.100 -c “SELECT pg_is_in_recovery();”
“`

### 2.3 验证业务连续性
“`bash
# 检查应用是否自动连接到新的主库
# 执行业务测试,确认系统正常运行
# 检查数据一致性
“`

### 2.4 回切操作
“`bash
# 修复主库故障
# 重新配置为主库的备库

# 基础备份
sudo -u pgsql pg_basebackup -h 10.0.0.100 -U replfgedu -D /data/pgsql -F p -X stream -P

# 创建recovery.conf
sudo -u pgsql vi /data/pgsql/recovery.conf

# 添加以下内容
standby_mode = ‘on’
primary_conninfo = ‘fgedu.net.cn=10.0.0.100 port=5432 fgedu=replfgedu password=replpassword fgapplication_name=primary’
recovery_target_timeline = ‘latest’

# 启动PostgreSQL
sudo systemctl start postgresql

# 等待复制同步
# 执行回切操作
“`

## 3. 演练总结
– **记录演练过程中的问题和解决方案**
– **评估RTO和RPO是否达到预期目标**
– **更新容灾方案文档**
– **培训相关人员**

Part05-风哥经验总结与分享

5.1 最佳实践

PostgreSQL异地容灾的最佳实践:

# 最佳实践

## 1. 架构设计
– **选择合适的复制模式:** 根据网络条件和业务需求选择同步、异步或半同步复制
– **采用级联复制:** 对于多数据中心场景,使用级联复制减轻主库负担
– **配置合理的WAL保留策略:** 确保备库能够及时同步,避免WAL日志不足

## 2. 网络配置
– **使用专线连接:** 确保跨机房网络稳定可靠
– **配置网络监控:** 实时监控网络延迟和带宽使用情况
– **实施网络冗余:** 避免单点故障

## 3. 监控与告警
– **建立完善的监控系统:** 监控主备库状态、复制延迟和网络连接
– **配置合理的告警阈值:** 根据业务需求设置复制延迟和服务状态的告警阈值
– **定期检查监控系统:** 确保监控系统正常运行

## 4. 演练与测试
– **定期进行灾难恢复演练:** 每季度至少进行一次全流程演练
– **测试不同故障场景:** 包括主库故障、网络中断等场景
– **记录演练结果:** 分析问题并持续改进

## 5. 文档与培训
– **完善容灾方案文档:** 包括架构设计、配置步骤、故障切换流程等
– **培训相关人员:** 确保DBA和系统管理员掌握容灾切换流程
– **建立应急响应团队:** 明确各角色的职责和联系方式

5.2 常见挑战

PostgreSQL异地容灾的常见挑战:

# 常见挑战

## 1. 网络问题
– **网络延迟:** 跨机房网络延迟可能影响复制性能
– **带宽限制:** 有限的带宽可能导致复制延迟增加
– **网络中断:** 网络中断可能导致复制中断

## 2. 数据一致性
– **异步复制数据丢失:** 异步复制可能导致数据丢失
– **复制冲突:** 主备库数据不一致
– **WAL日志管理:** WAL日志不足或管理不当

## 3. 故障切换
– **手动切换出错:** 手动故障切换过程中可能出现错误
– **自动切换误触发:** 网络抖动可能导致自动切换误触发
– **应用连接配置:** 应用连接配置未及时更新

## 4. 运维管理
– **监控盲区:** 监控系统存在盲区
– **演练不足:** 灾难恢复演练不足,人员不熟悉流程
– **文档不完善:** 容灾方案文档不完善

## 5. 成本控制
– **硬件成本:** 异地备库需要额外的硬件资源
– **带宽成本:** 跨机房数据传输需要带宽成本
– **运维成本:** 容灾方案需要额外的运维成本

PostgreSQL异地容灾的未来趋势:

未来发展方向:

  • 云原生容灾:利用云服务提供商的容灾解决方案,简化部署和管理
  • 自动化运维:使用自动化工具管理容灾流程,减少人工操作
  • 智能监控:利用AI和机器学习技术预测和预防容灾问题
  • 多活架构:从主备架构向多活架构演进,提高系统可用性
  • 混合云容灾:结合公有云和私有云,提供更灵活的容灾方案
风哥提示:异地容灾是一个复杂的系统工程,需要综合考虑技术、成本和运维等多个因素。企业应该根据自身业务需求和资源情况,选择合适的容灾方案,并定期进行演练和优化。更多视频教程www.fgedu.net.cn,学习交流加群风哥微信: itpux-com

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

联系我们

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

微信号:itpux-com

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