opengauss教程FG061-openGauss一主多备架构配置生产实战
本文档详细介绍openGauss数据库一主多备架构的配置方法,包括主库配置、多备库部署、复制关系建立等操作,风哥教程参考openGauss官方文档高可用架构指南、主备复制指南等内容,适合DBA人员进行一主多备环境部署时参考。
Part01-基础概念与理论知识
1.1 openGauss一主多备架构概念
- 高可用性:多个备库提供冗余,单个备库故障不影响整体
- 读写分离:读操作分散到多个备库,提升系统吞吐量
- 负载均衡:多个备库分担查询压力
- 灵活切换:主库故障时有多个备库可选
1.2 openGauss一主多备架构优势
一主多备架构相比一主一备的优势:
1. 可用性提升
– 一主一备:备库故障后无冗余
– 一主多备:单个备库故障仍有其他备库
2. 性能提升
– 一主一备:读操作集中在单个备库
– 一主多备:读操作分散到多个备库
3. 容灾能力
– 一主一备:只能本地容灾
– 一主多备:支持异地多中心容灾
4. 维护便利
– 一主一备:维护备库时需要停止复制
– 一主多备:可以逐个维护备库不影响业务
架构对比:
一主一备:
主库 <-> 备库
一主三备:
+-> 备库1(同步复制)
主库 -+-> 备库2(异步复制)
+-> 备库3(异步复制,异地)
1.3 openGauss一主多备应用场景
一主多备架构适用场景:
- 高并发读业务:电商平台、社交应用等读多写少场景
- 核心业务系统:金融核心、支付系统等高可用要求场景
- 异地容灾:需要多地域部署的企业
- 大数据分析:备库用于数据分析,不影响主库业务
Part02-生产环境规划与建议
2.1 openGauss一主多备架构设计
一主多备架构设计要点:
架构拓扑:
+——————+
| 主库 |
| fgedu-primary |
| 192.168.1.10 |
| (同城中心A) |
+——–+———+
|
+——————-+——————-+
| | |
+——–v———+ +——-v——–+ +——-v——–+
| 备库1 | | 备库2 | | 备库3 |
| fgedu-standby1 | | fgedu-standby2| | fgedu-standby3|
| 192.168.1.11 | | 192.168.1.12 | | 192.168.2.11 |
| (同城中心A) | | (同城中心B) | | (异地中心) |
| (同步复制) | | (异步复制) | | (异步复制) |
| (优先切换) | | (读分担) | | (灾备) |
+——————+ +—————-+ +—————-+
角色分工:
– 主库:处理所有写操作,部分读操作
– 备库1:同步复制,优先切换候选,部分读操作
– 备库2:异步复制,主要承担读操作
– 备库3:异地异步复制,灾备用途
复制模式选择:
– 备库1:同步复制(synchronous_commit = remote_write)
– 备库2:异步复制
– 备库3:异步复制
2.2 openGauss资源规划配置
资源规划配置:
1. 服务器配置
– 主库:32核128GB内存 2TB SSD RAID10
– 备库1:32核128GB内存 2TB SSD RAID10
– 备库2:32核128GB内存 2TB SSD RAID10
– 备库3:16核64GB内存 2TB SATA RAID5(异地)
2. 网络配置
– 主库-备库1:万兆内网,延迟<1ms
- 主库-备库2:万兆内网,延迟<1ms
- 主库-备库3:专线20Mbps,延迟<50ms
3. 存储规划
- 数据目录:/opengauss/fgdata(SSD)
- 日志目录:/opengauss/fglog(SSD)
- 归档目录:/opengauss/archive(SATA)
4. 软件配置
- 操作系统:Oracle Linux 9.3
- 数据库版本:openGauss 5.0.0
- 复制槽数量:max_replication_slots = 10
- WAL发送进程:max_wal_senders = 10
2.3 openGauss网络规划配置
网络规划配置:
# 网络规划
1. IP地址规划
– 主库:192.168.1.10/24
– 备库1:192.168.1.11/24
– 备库2:192.168.1.12/24
– 备库3:192.168.2.11/24
2. 主机名规划
– 主库:fgedu-primary.fgedu.net.cn
– 备库1:fgedu-standby1.fgedu.net.cn
– 备库2:fgedu-standby2.fgedu.net.cn
– 备库3:fgedu-standby3.fgedu.net.cn
3. 防火墙配置
# 所有节点开放端口
firewall-cmd –permanent –add-port=5432/tcp
firewall-cmd –permanent –add-port=22/tcp
firewall-cmd –reload
4. 网络测试
# 主库测试到各备库连通性
ping -c 4 192.168.1.11
ping -c 4 192.168.1.12
ping -c 4 192.168.2.11
# 测试端口连通性
telnet 192.168.1.11 5432
telnet 192.168.1.12 5432
telnet 192.168.2.11 5432学习交流加群风哥微信: itpux-com
Part03-生产环境项目实施方案
3.1 openGauss主库部署配置
3.1.1 主库基础配置
# 步骤1:配置postgresql.conf
$ cat > /opengauss/fgdata/postgresql.conf << EOF
# 基本配置
listen_addresses = '*'
port = 5432
max_connections = 2000
# 内存配置
shared_buffers = 64GB
max_process_memory = 100GB
work_mem = 128MB
maintenance_work_mem = 4GB
# WAL配置
wal_level = replica
max_wal_senders = 10
wal_keep_size = 4GB
max_replication_slots = 10
wal_sender_timeout = 60s
# 归档配置
archive_mode = on
archive_command = 'cp %p /opengauss/archive/%f'
archive_timeout = 1800
# 复制配置
synchronous_commit = remote_write学习交流加群风哥QQ113257174
synchronous_standby_names = 'fgedu_standby1'
# 热备配置
hot_standby = on
max_standby_archive_delay = 30s
max_standby_streaming_delay = 30s
# 日志配置
logging_collector = on
log_directory = '/opengauss/fglog'
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_age = 1d
log_rotation_size = 100MB
EOF
# 步骤2:配置pg_hba.conf
$ cat >> /opengauss/fgdata/pg_hba.conf << EOF
# 复制连接配置
host replication repl 192.168.1.11/32 md5
host replication repl 192.168.1.12/32 md5
host replication repl 192.168.2.11/32 md5
host all all 192.168.1.0/24 md5
host all all 192.168.2.0/24 md5
EOF
# 步骤3:创建复制用户
$ gsql -d postgres -c "CREATE USER repl WITH REPLICATION PASSWORD 'repl_pass';
”
CREATE ROLE
# 步骤4:创建复制槽
$ gsql -d postgres -c “SELECT * FROM pg_create_physical_replication_slot(‘fgedu_standby1_slot’);
”
$ gsql -d postgres -c “SELECT * FROM pg_create_physical_replication_slot(‘fgedu_standby2_slot’);
”
$ gsql -d postgres -c “SELECT * FROM pg_create_physical_replication_slot(‘fgedu_standby3_slot’);
”
slot_name | lsn
——————–+—–
fgedu_standby1_slot| 0/0
fgedu_standby2_slot| 0/0更多视频教程www.fgedu.net.cn
fgedu_standby3_slot| 0/0
(3 rows)
# 步骤5:重启主库
$ gs_ctl restart -D /opengauss/fgdata
3.2 openGauss多备库部署配置
3.2.1 备库1部署配置(同步复制)
# 步骤1:从主库备份
$ gs_probackup backup -B /opengauss/backup –instance=fgedudb -b FULL –remote-host=192.168.1.10 –remote-user=opengauss
# 步骤2:恢复备份
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata
# 步骤3:配置standby.signal
$ 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
# 步骤4:配置postgresql.conf
$ cat >> /opengauss/fgdata/postgresql.conf << EOF
hot_standby = on
max_standby_archive_delay = 30s
max_standby_streaming_delay = 30s
EOF
# 步骤5:启动备库
$ gs_ctl start -D /opengauss/fgdata
3.2.2 备库2部署配置(异步复制)
# 步骤1-2:与备库1相同(备份和恢复)
# 步骤3:配置standby.signal
$ 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'
recovery_target_timeline = 'latest'
EOF
# 步骤4-5:与备库1相同
3.2.3 备库3部署配置(异地异步复制)
# 步骤1:从主库备份(可能需要更长时间)
$ gs_probackup backup -B /opengauss/backup –instance=fgedudb -b FULL –remote-host=192.168.1.10 –remote-user=opengauss
# 步骤2:恢复备份
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata
# 步骤3:配置standby.signal(增加压缩和超时配置)
$ 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'
recovery_target_timeline = 'latest'
EOF
# 步骤4:配置postgresql.conf(针对异地优化)from DB视频:www.itpux.com
$ cat >> /opengauss/fgdata/postgresql.conf << EOF
hot_standby = on
wal_receiver_status_interval = 10s
wal_receiver_timeout = 120s
wal_retrieve_retry_interval = 10s
EOF
# 步骤5:启动备库
$ gs_ctl start -D /opengauss/fgdata
3.3 openGauss复制关系配置
3.3.1 验证复制状态
# 步骤1:在主库查看所有备库状态
$ gsql -h 192.168.1.10 -d postgres -c “SELECT client_addr, application_name, state, sync_state, sent_lsn, replay_lsn FROM pg_stat_replication;
”
client_addr | application_name | state | sync_state | sent_lsn | replay_lsn
————–+——————+———–+————+———–+————
192.168.1.11 | fgedu_standby1 | streaming | sync | 0/5000100 | 0/5000100
192.168.1.12 | fgedu_standby2 | streaming | async | 0/5000100 | 0/50000F0
192.168.2.11 | fgedu_standby3 | streaming | async | 0/5000100 | 0/50000A0
(3 rows)
# 步骤2:检查各备库延迟
$ gsql -h 192.168.1.11 -d postgres -c “SELECT EXTRACT(EPOCH FROM (now() – pg_last_xact_replay_timestamp())) AS delay_seconds;
”
delay_seconds
—————
0.01
$ gsql -h 192.168.1.12 -d postgres -c “SELECT EXTRACT(EPOCH FROM (now() – pg_last_xact_replay_timestamp())) AS delay_seconds;
”
delay_seconds
—————
0.05
$ gsql -h 192.168.2.11 -d postgres -c “SELECT EXTRACT(EPOCH FROM (now() – pg_last_xact_replay_timestamp())) AS delay_seconds;
”
delay_seconds
—————
2.50
# 步骤3:测试数据同步
# 在主库插入数据
$ gsql -h 192.168.1.10 -d fgedudb -c “INSERT INTO fgedu.test_replication VALUES (1, ‘test’, now());
”
# 在各备库查询
$ gsql -h 192.168.1.11 -d fgedudb -c “SELECT * FROM fgedu.test_replication;
”
$ gsql -h 192.168.1.12 -d fgedudb -c “SELECT * FROM fgedu.test_replication;
”
$ gsql -h 192.168.2.11 -d fgedudb -c “SELECT * FROM fgedu.test_replication;
”
Part04-生产案例与实战讲解
4.1 openGauss一主三备部署案例
4.1.1 案例背景
某电商平台部署一主三备架构,满足高可用和读写分离需求。
4.1.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 = 10
wal_keep_size = 4GB
max_replication_slots = 10
synchronous_commit = remote_write
synchronous_standby_names = ‘fgedu_standby1’
# 部署验证脚本
#!/bin/bash
# check_multi_standby.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
MASTER_IP=”192.168.1.10″
echo “=== 一主三备复制状态检查 ===”
echo “检查时间: $(date)”
echo “”
# 检查主库复制状态
echo “— 主库复制状态 —”
gsql -h $MASTER_IP -d postgres -c ”
SELECT
application_name,
client_addr,
state,
sync_state,
pg_size_pretty(pg_wal_lsn_diff(sent_lsn, replay_lsn)) as delay_size
FROM pg_stat_replication
ORDER BY sync_state, application_name;
”
# 检查复制槽状态
echo “”
echo “— 复制槽状态 —”
gsql -h $MASTER_IP -d postgres -c ”
SELECT
slot_name,
active,
restart_lsn,
pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) as retained_wal
FROM pg_replication_slots;
”
echo “”
echo “=== 检查完成 ===”
# 执行结果
=== 一主三备复制状态检查 ===
检查时间: Thu Apr 9 14:30:00 CST 2026
— 主库复制状态 —
application_name | client_addr | state | sync_state | delay_size
——————+—————+———–+————+————
fgedu_standby1 | 192.168.1.11 | streaming | sync | 0 bytes
fgedu_standby2 | 192.168.1.12 | streaming | async | 16 kB
fgedu_standby3 | 192.168.2.11 | streaming | async | 256 kB
(3 rows)
— 复制槽状态 —
slot_name | active | restart_lsn | retained_wal
——————–+——–+————-+————–
fgedu_standby1_slot| t | 0/5000100 | 0 bytes
fgedu_standby2_slot| t | 0/50000F0 | 16 kB
fgedu_standby3_slot| t | 0/50000A0 | 256 kB
(3 rows)
=== 检查完成 ===
4.2 openGauss一主五备部署案例
4.2.1 案例背景
某金融系统部署一主五备架构,满足最高可用性要求。
4.2.2 部署配置
# 环境信息
主库:fgedu-primary 192.168.1.10 64核256GB
备库1:fgedu-standby1 192.168.1.11 64核256GB 同步复制(同城A)
备库2:fgedu-standby2 192.168.1.12 64核256GB 同步复制(同城A)
备库3:fgedu-standby3 192.168.1.13 32核128GB 异步复制(同城B)
备库4:fgedu-standby4 192.168.2.11 32核128GB 异步复制(异地)
备库5:fgedu-standby5 192.168.2.12 32核128GB 异步复制(异地)
# 主库关键配置
wal_level = replica
max_wal_senders = 15
wal_keep_size = 8GB
max_replication_slots = 15
synchronous_commit = remote_apply
synchronous_standby_names = ‘fgedu_standby1,fgedu_standby2’
# 同步复制配置说明
# 需要两个同步备库都确认后才提交
# 提供最高级别的数据保护
4.3 openGauss读写分离配置案例
4.3.1 案例背景
基于一主三备架构配置读写分离,提升系统读性能。
4.3.2 配置方案
# 架构
写操作 -> 主库 192.168.1.10
读操作 -> 备库2 192.168.1.12 或 备库3 192.168.2.11
# 应用层读写分离配置(Java)
# application.yml
spring:
datasource:
master:
url: jdbc:opengauss://192.168.1.10:5432/fgedudb
username: fgedu
password: fgedu_pass
slave:
url: jdbc:opengauss://192.168.1.12:5432/fgedudb
username: fgedu
password: fgedu_pass
# 使用中间件实现读写分离(ShardingSphere)
# 配置读写分离规则
spring:
shardingsphere:
datasource:
names: master,slave0,slave1
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: org.opengauss.Driver
jdbc-url: jdbc:opengauss://192.168.1.10:5432/fgedudb
slave0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: org.opengauss.Driver
jdbc-url: jdbc:opengauss://192.168.1.12:5432/fgedudb
slave1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: org.opengauss.Driver
jdbc-url: jdbc:opengauss://192.168.2.11:5432/fgedudb
masterslave:
name: ms_ds
master-data-source-name: master
slave-data-source-names: slave0,slave1
load-balance-algorithm-type: round_robin
# 监控读写分离效果
# 查看各备库的查询负载
$ gsql -h 192.168.1.12 -d postgres -c “SELECT count(*) FROM pg_stat_activity WHERE state=’active’ AND query LIKE ‘SELECT%’;
”
$ gsql -h 192.168.2.11 -d postgres -c “SELECT count(*) FROM pg_stat_activity WHERE state=’active’ AND query LIKE ‘SELECT%’;
”
Part05-风哥经验总结与分享
5.1 openGauss一主多备最佳实践
一主多备架构最佳实践总结:
- 合理选择备库数量:根据业务需求和成本预算选择,通常3-5个备库
- 区分备库角色:明确各备库的用途(同步、异步、灾备、读分担)
- 监控复制延迟:建立完善的复制延迟监控和告警
- 定期演练:定期进行故障切换演练,验证各备库的可用性
- 负载均衡:合理分配读请求到各备库,避免单点压力过大
5.2 openGauss部署检查清单
# 部署前检查
□ 服务器硬件配置一致
□ 网络带宽和延迟满足要求
□ 防火墙端口开放
□ 操作系统参数配置
# 部署中检查
□ 主库配置正确
□ 各备库备份恢复成功
□ 复制槽创建成功
□ 复制关系建立成功
# 部署后检查
□ 所有备库复制状态正常
□ 复制延迟在可接受范围
□ 数据同步测试通过
□ 故障切换测试通过
□ 读写分离配置正确
□ 监控告警配置完成
5.3 openGauss常见问题处理
一主多备架构常见问题及解决方案:
- 主库压力过大:增加WAL发送进程,优化网络,考虑级联复制
- 复制延迟过高:检查网络带宽,优化备库性能,调整复制参数
- 复制槽满:检查备库状态,清理异常复制槽,调整WAL保留策略
- 备库不一致:重建备库,检查数据完整性,重新建立复制
- 切换失败:检查备库状态,确认复制延迟,检查应用连接
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
