opengauss教程FG062-openGauss同步异步复制选择生产实战
本文档详细介绍openGauss数据库同步复制与异步复制的选择方法,包括不同复制模式的特点、适用场景、配置方法等,风哥教程参考openGauss官方文档高可用架构指南、复制配置指南等内容,适合DBA人员进行复制模式选择时参考。
Part01-基础概念与理论知识
1.1 openGauss同步复制基本概念
- 数据一致性:主备数据实时一致,RPO=0
- 事务延迟:事务提交需要等待备库确认
- 可用性影响:备库故障会影响主库写入
- 适用场景:金融核心、支付系统等对数据一致性要求高的场景
1.2 openGauss异步复制基本概念
异步复制是指主库在提交事务时,不需要等待备库确认,直接返回提交成功的模式。异步复制性能更好,但主备之间可能存在数据延迟。
- 性能优先:事务提交无需等待,性能最好
- 数据延迟:主备之间可能存在数据延迟
- 可用性保障:备库故障不影响主库
- 适用场景:读多写少、对延迟敏感的业务场景
1.3 openGauss同步级别详解
openGauss支持多种同步级别:
1. synchronous_commit = off
– 含义:不等待WAL写入磁盘,直接返回
– 性能:最高
– 数据安全:最低,可能丢失事务
– 适用:非关键数据,可接受数据丢失
2. synchronous_commit = local
– 含义:等待本地WAL写入磁盘后返回
– 性能:高
– 数据安全:本地数据安全,备库可能延迟
– 适用:单机模式或异步复制
3. synchronous_commit = remote_write
– 含义:等待备库收到WAL并写入OS缓存后返回
– 性能:中等
– 数据安全:较高,备库可能丢失OS缓存数据
– 适用:同城复制,网络延迟低
4. synchronous_commit = remote_flush
– 含义:等待备库收到WAL并刷入磁盘后返回
– 性能:较低
– 数据安全:高,备库数据已持久化
– 适用:关键业务,需要数据持久化保证
5. synchronous_commit = remote_apply
– 含义:等待备库应用WAL并可见后返回
– 性能:最低
– 数据安全:最高,主备数据完全一致
– 适用:金融核心,强一致性要求
# 同步级别对比表
级别 | 性能 | 数据安全 | 延迟 | 适用场景
——————|——|———-|——|———-
off | 最高 | 低 | 无 | 非关键数据
local | 高 | 中 | 低 | 单机/异步
remote_write | 中 | 较高 | 中 | 同城复制
remote_flush | 较低 | 高 | 较高 | 关键业务
remote_apply | 最低 | 最高 | 高 | 金融核心
Part02-生产环境规划与建议
2.1 openGauss复制模式选择标准
复制模式选择标准:
1. 业务类型判断
├── 金融核心、支付系统
│ └── 选择:同步复制(remote_apply)
├── 电商交易、订单系统
│ └── 选择:同步复制(remote_flush)
├── 内容管理、日志系统
│ └── 选择:异步复制
└── 数据分析、报表系统
└── 选择:异步复制
2. 网络条件判断
├── 同城数据中心(延迟<5ms)
│ └── 可选:同步复制
├── 异地数据中心(延迟5-50ms)
│ └── 建议:异步复制或remote_write
└── 远距离异地(延迟>50ms)
└── 选择:异步复制
3. 性能要求判断
├── 高并发写入(>10000 TPS)
│ └── 建议:异步复制或remote_write
├── 中等并发(1000-10000 TPS)
│ └── 可选:remote_flush
└── 低并发(<1000 TPS)
└── 可选:remote_apply
4. 数据重要性判断
├── 不可丢失数据(RPO=0)
│ └── 选择:同步复制
├── 可接受少量丢失(RPO<1分钟)
│ └── 选择:异步复制+监控
└── 可重建数据
└── 选择:异步复制
2.2 openGauss性能影响分析
不同复制模式对性能的影响:
测试环境:
– 主库:32核128GB内存
– 备库:32核128GB内存
– 网络:万兆以太网,延迟1ms
1. 异步复制性能风哥提示:
– TPS:15000
– 平均响应时间:2ms
– 复制延迟:<100ms
2. remote_write性能
- TPS:12000
- 平均响应时间:5ms
- 复制延迟:<50ms
3. remote_flush性能
- TPS:8000
- 平均响应时间:10ms
- 复制延迟:<30ms
4. remote_apply性能
- TPS:5000
- 平均响应时间:20ms
- 复制延迟:<10ms
# 性能影响分析
- 从异步到remote_write:TPS下降约20%
- 从remote_write到remote_flush:TPS下降约33%
- 从remote_flush到remote_apply:TPS下降约37%
# 网络延迟影响
- 延迟每增加1ms,remote_apply TPS下降约5%
- remote_write对网络延迟敏感度较低
- 异步复制几乎不受网络延迟影响
学习交流加群风哥微信: itpux-com
2.3 openGauss RPO/RTO分析
RPO(恢复点目标)和RTO(恢复时间目标)分析:
1. 异步复制
– RPO:取决于复制延迟,通常秒级到分钟级
– RTO:分钟级(需要提升备库为主库)
– 适用:可接受数据丢失的场景
2. remote_write
– RPO:接近0,OS缓存可能丢失少量数据
– RTO:分钟级
– 适用:对数据一致性要求较高的场景
3. remote_flush
– RPO:0,数据已持久化到备库磁盘
– RTO:分钟级
– 适用:关键业务系统
4. remote_apply
– RPO:0,数据已应用到备库
– RTO:分钟级
– 适用:金融核心系统
# RPO/RTO目标设定建议
业务类型 | RPO目标 | RTO目标 | 推荐复制模式
——————|————|————|————–
金融核心系统 | 0 | <5分钟 | remote_apply
支付交易系统 | 0 | <10分钟 | remote_flush
电商订单系统 | <1分钟 | <15分钟 | remote_write
内容管理系统 | <5分钟 | <30分钟 | 异步复制
数据分析系统 | <1小时 | <1小时 | 异步复制
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 openGauss同步复制配置
3.1.1 基础同步复制配置
# 步骤1:主库配置
$ cat >> /opengauss/fgdata/postgresql.conf << EOF
# 同步复制配置
synchronous_commit = remote_flush
synchronous_standby_names = 'fgedu_standby1'
# 超时配置(避免备库故障导致主库hang)
wal_sender_timeout = 60s
EOF
# 步骤2:配置pg_hba.conf
$ cat >> /opengauss/fgdata/pg_hba.conf << EOF
host replication repl 192.168.1.11/32 md5
EOF
# 步骤3:创建复制用户
$ gsql -d postgres -c "CREATE USER repl WITH REPLICATION PASSWORD 'repl_pass';
”
# 步骤4:创建复制槽
$ gsql -d postgres -c “SELECT pg_create_physical_replication_slot(‘fgedu_standby1_slot’);
”
# 步骤5:重启主库
$ gs_ctl restart -D /opengauss/fgdata
# 步骤6:备库配置
$ cat > /opengauss/fgdata/standby.signal << EOF
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=repl_pass application_name=fgedu_standby1'
primary_slot_name = 'fgedu_standby1_slot'
recovery_target_timeline = 'latest'
EOF
# 步骤7:启动备库更多视频教程www.fgedu.net.cn
$ gs_ctl start -D /opengauss/fgdata
# 步骤8:验证同步复制
$ gsql -h 192.168.1.10 -d postgres -c "SELECT application_name, sync_state FROM pg_stat_replication;
”
application_name | sync_state
——————+————
fgedu_standby1 | sync
(1 row)
3.1.2 多备库同步配置
# 配置两个同步备库
synchronous_commit = remote_flush
synchronous_standby_names = ‘fgedu_standby1,fgedu_standby2’
# 配置优先级(FIRST表示只需要一个确认)
synchronous_standby_names = ‘FIRST 1 (fgedu_standby1,fgedu_standby2)’
# 配置ANY模式(ANY表示只需要指定数量的确认)
synchronous_standby_names = ‘ANY 2 (fgedu_standby1,fgedu_standby2,fgedu_standby3)’
# 验证配置
$ gsql -h 192.168.1.10 -d postgres -c “SELECT application_name, sync_state FROM pg_stat_replication;
”
application_name | sync_state
——————+————
fgedu_standby1 | sync
fgedu_standby2 | sync
fgedu_standby3 | async
(3 rows)
3.2 openGauss异步复制配置
# 步骤1:主库配置
$ cat >> /opengauss/fgdata/postgresql.conf << EOF
# 异步复制配置
synchronous_commit = local
# 或
synchronous_commit = off
# 移除同步备库配置
# synchronous_standby_names = ''
EOF
# 步骤2:备库配置(与同步复制相同,只是主库配置不同)
$ cat > /opengauss/fgdata/standby.signal << EOF
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=repl_pass application_name=fgedu_standby1'
primary_slot_name = 'fgedu_standby1_slot'
recovery_target_timeline = 'latest'
EOF
# 步骤3:验证异步复制
$ gsql -h 192.168.1.10 -d postgres -c "SELECT application_name, sync_state FROM pg_stat_replication;
”
application_name | sync_state
——————+————
fgedu_standby1 | async
(1 row)
3.3 openGauss混合复制配置
from DB视频:www.itpux.com
# 主库配置
$ cat >> /opengauss/fgdata/postgresql.conf << EOF
# 混合复制配置
synchronous_commit = remote_flush
synchronous_standby_names = 'fgedu_standby1'
# 备库1:同步复制
# 备库2:异步复制
# 备库3:异步复制(异地)
EOF
# 备库1配置(同步)
$ cat > /opengauss/fgdata/standby.signal << EOF
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=repl_pass application_name=fgedu_standby1'
primary_slot_name = 'fgedu_standby1_slot'
EOF
# 备库2配置(异步)
$ cat > /opengauss/fgdata/standby.signal << EOF
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=repl_pass application_name=fgedu_standby2'
primary_slot_name = 'fgedu_standby2_slot'
EOF
# 备库3配置(异步异地)
$ cat > /opengauss/fgdata/standby.signal << EOF
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=repl_pass application_name=fgedu_standby3'
primary_slot_name = 'fgedu_standby3_slot'
EOF
# 验证混合复制
$ gsql -h 192.168.1.10 -d postgres -c "SELECT application_name, client_addr, sync_state FROM pg_stat_replication;
”
application_name | client_addr | sync_state
——————+—————+————
fgedu_standby1 | 192.168.1.11 | sync
fgedu_standby2 | 192.168.1.12 | async
fgedu_standby3 | 192.168.2.11 | async
(3 rows)
Part04-生产案例与实战讲解
4.1 openGauss金融系统同步复制案例
4.1.1 案例背景
某银行核心系统部署openGauss,要求RPO=0,RTO<5分钟。
4.1.2 配置方案
# 架构:一主两备(同城双活)
主库:fgedu-primary 192.168.1.10 64核256GB
备库1:fgedu-standby1 192.168.1.11 64核256GB 同步复制
备库2:fgedu-standby2 192.168.1.12 64核256GB 同步复制
# 主库配置
wal_level = replica
max_wal_senders = 10
wal_keep_size = 8GB
max_replication_slots = 10
# 同步复制配置(最高级别)
synchronous_commit = remote_apply
synchronous_standby_names = ‘fgedu_standby1,fgedu_standby2’
# 超时配置
wal_sender_timeout = 30s
# 性能监控脚本
#!/bin/bash
# check_sync_performance.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
MASTER_IP=”192.168.1.10″
echo “=== 同步复制性能监控 ===”
echo “检查时间: $(date)”
# 检查同步延迟
gsql -h $MASTER_IP -d postgres -c ”
SELECT
application_name,
sync_state,
EXTRACT(EPOCH FROM (backend_start – now())) as connection_time,
pg_wal_lsn_diff(sent_lsn, replay_lsn) as delay_bytes
FROM pg_stat_replication
ORDER BY application_name;
”
# 检查事务提交延迟
gsql -h $MASTER_IP -d postgres -c ”
SELECT
datname,
xact_commit,
xact_rollback,
ROUND(100.0 * xact_rollback / NULLIF(xact_commit + xact_rollback, 0), 2) as rollback_ratio
FROM pg_stat_database
WHERE datname = ‘fgedudb’;
”
echo “=== 监控完成 ===”
# 执行结果
=== 同步复制性能监控 ===
检查时间: Thu Apr 9 15:00:00 CST 2026
application_name | sync_state | connection_time | delay_bytes
——————+————+—————–+————-
fgedu_standby1 | sync | -3600 | 0
fgedu_standby2 | sync | -3600 | 0
(2 rows)
datname | xact_commit | xact_rollback | rollback_ratio
———-+————-+—————+—————-
fgedudb | 1500000 | 500 | 0.03
(1 row)
=== 监控完成 ===
4.2 openGauss电商系统异步复制案例
4.2.1 案例背景
某电商平台部署openGauss,要求高并发写入性能,可接受少量数据延迟。
4.2.2 配置方案
# 架构:一主三备
主库:fgedu-primary 192.168.1.10 32核128GB
备库1:fgedu-standby1 192.168.1.11 32核128GB 异步复制(读分担)
备库2:fgedu-standby2 192.168.1.12 32核128GB 异步复制(读分担)
备库3:fgedu-standby3 192.168.2.11 16核64GB 异步复制(异地灾备)
# 主库配置
wal_level = replica
max_wal_senders = 15
wal_keep_size = 4GB
max_replication_slots = 15
# 异步复制配置
synchronous_commit = local
# 不配置synchronous_standby_names
# 性能测试结果
# TPS:15000(异步)vs 5000(同步)
# 响应时间:2ms(异步)vs 20ms(同步)
# 复制延迟监控
$ gsql -h 192.168.1.10 -d postgres -c ”
SELECT
application_name,
client_addr,
EXTRACT(EPOCH FROM (now() – backend_start)) as uptime_seconds,
pg_size_pretty(pg_wal_lsn_diff(sent_lsn, replay_lsn)) as delay_size
FROM pg_stat_replication;
”
application_name | client_addr | uptime_seconds | delay_size
——————+—————+—————-+————
fgedu_standby1 | 192.168.1.11 | 7200 | 128 kB
fgedu_standby2 | 192.168.1.12 | 7200 | 256 kB
fgedu_standby3 | 192.168.2.11 | 7200 | 2 MB
(3 rows)
4.3 openGauss混合复制模式案例
4.3.1 案例背景
某企业ERP系统部署openGauss,需要平衡数据安全和性能。
4.3.2 配置方案
# 架构:一主四备
主库:fgedu-primary 192.168.1.10 32核128GB
备库1:fgedu-standby1 192.168.1.11 32核128GB remote_flush(同城)
备库2:fgedu-standby2 192.168.1.12 32核128GB remote_write(同城)
备库3:fgedu-standby3 192.168.2.11 16核64GB 异步复制(异地)
备库4:fgedu-standby4 192.168.2.12 16核64GB 异步复制(异地)
# 主库配置
wal_level = replica
max_wal_senders = 15
wal_keep_size = 4GB
max_replication_slots = 15
# 混合复制配置
synchronous_commit = remote_flush
synchronous_standby_names = ‘fgedu_standby1’
# 动态调整复制模式脚本
#!/bin/bash
# adjust_sync_mode.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
MASTER_IP=”192.168.1.10″
# 根据业务高峰期动态调整
HOUR=$(date +%H)
if [ $HOUR -ge 9 ] && [ $HOUR -le 18 ]; then
# 业务高峰期:降低同步级别保证性能
echo “业务高峰期,切换到remote_write模式”
gsql -h $MASTER_IP -d postgres -c “ALTER SYSTEM SET synchronous_commit = ‘remote_write’;
”
else
# 业务低峰期:提高同步级别保证数据安全
echo “业务低峰期,切换到remote_flush模式”
gsql -h $MASTER_IP -d postgres -c “ALTER SYSTEM SET synchronous_commit = ‘remote_flush’;
”
fi
gsql -h $MASTER_IP -d postgres -c “SELECT pg_reload_conf();
”
# 验证当前配置
gsql -h $MASTER_IP -d postgres -c “SHOW synchronous_commit;
”
# 执行结果
业务高峰期,切换到remote_write模式
ALTER SYSTEM
SELECT pg_reload_conf
——————–
t
(1 row)
synchronous_commit
——————–
remote_write
(1 row)
Part05-风哥经验总结与分享
5.1 openGauss复制模式选择最佳实践
复制模式选择最佳实践总结:
- 金融核心:使用remote_apply,确保数据强一致性
- 电商交易:使用remote_flush,平衡性能和数据安全
- 内容系统:使用异步复制,优先保证性能
- 混合场景:同城同步+异地异步,兼顾可用性和容灾
- 动态调整:根据业务负载动态调整同步级别
5.2 openGauss复制性能调优
1. 网络优化
– 使用专用网络进行复制
– 调整TCP参数提高吞吐量
– 考虑使用网络压缩(异地场景)
2. 主库优化
– 增加wal_writer_delay提高WAL写入效率
– 调整wal_buffers大小
– 增加max_wal_senders数量
3. 备库优化
– 提高备库的硬件配置
– 优化备库的IO性能
– 调整备库的恢复进程参数
4. 参数调优
wal_writer_delay = 10ms
wal_buffers = 64MB
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
5.3 openGauss复制监控建议
复制监控建议:
- 复制延迟监控:实时监控各备库的复制延迟,设置告警阈值
- 复制状态监控:监控复制连接状态,及时发现复制中断
- 性能指标监控:监控TPS、响应时间等性能指标
- WAL积压监控:监控WAL文件积压情况,避免磁盘满
- 切换演练:定期进行故障切换演练,验证复制配置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
