1. 首页 > 国产数据库教程 > openGauss教程 > 正文

opengauss教程FG064-openGauss异地容灾与多活架构生产实战

本文档详细介绍openGauss数据库异地容灾与多活架构的配置方法,包括两地三中心、同城双活等架构设计,风哥教程参考openGauss官方文档高可用架构指南、容灾解决方案等内容,适合DBA人员进行容灾架构设计和实施时参考。

Part01-基础概念与理论知识

1.1 openGauss异地容灾基本概念

openGauss异地容灾特点:

  • 地理隔离:主备数据中心距离通常>100公里
  • 异步复制:异地通常采用异步复制降低延迟影响
  • RPO/RTO:根据业务需求设定恢复目标
  • 成本较高:需要建设和维护异地数据中心

1.2 openGauss多活架构基本概念

多活架构是指多个数据中心同时对外提供服务的架构。与主备架构不同,多活架构中所有数据中心都处于活跃状态,可以同时处理读写请求。多活架构可以提供更高的可用性和更好的用户体验。

openGauss多活架构类型:

  • 同城双活:同一城市两个数据中心同时提供服务
  • 异地多活:不同城市多个数据中心同时提供服务
  • 读写分离多活:写操作集中,读操作分散到各中心
  • 单元化多活:按业务单元划分,各中心处理不同数据

1.3 openGauss RPO/RTO指标详解

RPO(Recovery Point Objective)和RTO(Recovery Time Objective)是衡量容灾能力的两个核心指标:

# RPO/RTO详解

1. RPO(恢复点目标)
– 定义:灾难发生后,系统可以恢复到的最近时间点
– 含义:允许丢失的数据量
– 示例:RPO=1小时表示最多丢失1小时的数据

2. RTO(恢复时间目标)
– 定义:灾难发生后,系统恢复到可用状态所需的时间
– 含义:业务中断的最大允许时间
– 示例:RTO=30分钟表示30分钟内必须恢复服务

3. 容灾等级划分

等级 | RPO | RTO | 架构 | 适用场景
—–|———-|———–|——————-|———-
1级 | <1小时 | <24小时 | 异地备份 | 一般业务 2级 | <15分钟 | <4小时 | 异地异步复制 | 重要业务 3级 | <1分钟 | <1小时 | 异地同步复制 | 关键业务 4级 | 0 | <30分钟 | 同城双活 | 核心业务 5级 | 0 | <5分钟 | 两地三中心 | 金融核心 6级 | 0 | 0 | 异地多活 | 最高要求 4. openGauss容灾能力 - 异步复制:RPO取决于复制延迟,RTO<30分钟 - 同步复制:RPO=0,RTO<30分钟 - 双活架构:RPO=0,RTO<5分钟

Part02-生产环境规划与建议

2.1 openGauss容灾架构设计

容灾架构设计:

# 两地三中心架构设计

架构拓扑:
+——————+
| 生产中心A |
| 192.168.1.0/24 |
| (同城主中心) |
+——–+———+
|
+——————-+——————-+
| |
+——–v———+ +——–v———+
| 主库 | | 备库1 |
| fgedu-primary |<------------------>| fgedu-standby1 |
| 192.168.1.10 | 同步复制 | 192.168.1.11 |
| | (同城双活) | |
+——————+ +——–+———+
|
| 异步复制
|
+——–v———+
| 备库2 |
| fgedu-standby2 |
| 192.168.2.10 |
| (异地灾备) |
+——————+

容灾等级:5级(两地三中心)
RPO:0(同步复制)
RTO:<10分钟 # 架构说明 1. 同城双活:主库和备库1在同一城市,使用同步复制 2. 异地灾备:备库2在异地,使用异步复制 3. 故障切换: - 主库故障:切换到备库1(同城) - 同城灾难:切换到备库2(异地)

2.2 openGauss多活架构设计

# 同城双活架构设计

架构拓扑:
+——————+ +——————+
| 数据中心A | | 数据中心B |
| 192.168.1.0/24 |<------------------>| 192.168.2.0/24 |
| (同城双活) | 专线网络 | (同城双活) |
+——–+———+ 延迟<5ms +--------+---------+ | | +--------v---------+ +--------v---------+ | 主库 | | 备库 | | fgedu-primary |<------------------>| fgedu-standby |
| 192.168.1.10 | 同步复制 | 192.168.2.10 |
| | remote_apply | |
+——————+ +——————+
^ ^
| |
+—————-+———————-+
|风哥提示:
+——-v——–+
| 应用层 |
| (读写分离) |
+—————-+

架构特点:
1. 两个数据中心同时对外提供服务
2. 写操作集中到主库
3. 读操作分散到两个中心
4. 同步复制保证数据一致性
5. 故障时自动切换到另一中心

2.3 openGauss网络规划配置

# 网络规划配置

1. 同城网络配置
– 带宽:万兆以太网或更高
– 延迟:<5ms - 专线:建议部署专用复制网络 - 冗余:双链路冗余,避免单点故障 2. 异地网络配置 - 带宽:根据数据量计算,建议>100Mbps
– 延迟:通常20-100ms
– 专线:运营商专线或VPN
– 压缩:启用网络压缩减少带宽占用

3. 网络参数优化学习交流加群风哥微信: itpux-com
# 操作系统网络参数
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_congestion_control = bbr

4. 防火墙配置
# 开放复制端口
firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4″ source address=”192.168.2.0/24″ port protocol=”tcp” port=”5432″ accept’
firewall-cmd –reload

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

3.1 openGauss异地异步复制配置

# 异地异步复制配置

# 步骤1:主库配置(生产中心)
$ cat >> /opengauss/fgdata/postgresql.conf << EOF # WAL配置 wal_level = replica max_wal_senders = 10 wal_keep_size = 8GB max_replication_slots = 10 # 异步复制配置 synchronous_commit = local # 网络优化 wal_sender_timeout = 120s wal_receiver_timeout = 120s wal_retrieve_retry_interval = 10s # 压缩配置(异地建议开启)学习交流加群风哥QQ113257174 wal_compression = on EOF # 步骤2:配置pg_hba.conf $ cat >> /opengauss/fgdata/pg_hba.conf << EOF # 异地备库访问权限 host replication repl 192.168.2.10/32 md5 host all all 192.168.2.0/24 md5 EOF # 步骤3:创建复制用户和复制槽 $ gsql -d postgres -c "CREATE USER repl WITH REPLICATION PASSWORD 'repl_pass';

$ gsql -d postgres -c “SELECT pg_create_physical_replication_slot(‘fgedu_dr_slot’);

# 步骤4:重启主库
$ gs_ctl restart -D /opengauss/fgdata

# 步骤5:异地备库配置
# 备份主库数据
$ gs_probackup backup -B /opengauss/backup –instance=fgedudb -b FULL –remote-host=192.168.1.10 –remote-user=opengauss

# 恢复数据到异地备库
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata

# 配置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_dr' primary_slot_name = 'fgedu_dr_slot' recovery_target_timeline = 'latest' EOF # 步骤6:配置异地备库参数 $ cat >> /opengauss/fgdata/postgresql.conf << EOF hot_standby = on wal_receiver_status_interval = 10s wal_receiver_timeout = 120s wal_retrieve_retry_interval = 10s 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, client_addr, state, sync_state FROM pg_stat_replication;

application_name | client_addr | state | sync_state
——————+—————+———–+————
fgedu_dr | 192.168.2.10 | streaming | async
(1 row)

3.2 openGauss容灾切换配置

# 容灾切换配置

# 步骤1:创建切换脚本
$ cat > /opengauss/scripts/dr_switchover.sh << 'EOF' #!/bin/bash # dr_switchover.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` # 配置 MASTER_IP="192.168.1.10" STANDBY_IP="192.168.2.10" LOG_FILE="/opengauss/log/dr_switchover.log" # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE } # 检查主库状态 check_master() { log "检查主库状态..." pg_isready -h $MASTER_IP -p 5432 if [ $? -ne 0 ]; then log "主库无法连接" return 1更多学习教程公众号风哥教程itpux_com fi return 0 } # 检查备库状态 check_standby() { log "检查备库状态..." pg_isready -h $STANDBY_IP -p 5432 if [ $? -ne 0 ]; then log "备库无法连接" return 1 fi return 0 } # 执行切换 perform_switchover() { log "开始执行容灾切换..." # 1. 停止主库(如果是故障切换,主库可能已经停止) log "停止主库..." gs_ctl stop -D /opengauss/fgdata -m fast || true # 2. 提升备库为主库 log "提升备库为主库..." gs_ctl promote -D /opengauss/fgdata # 3. 验证新主库 log "验证新主库状态..." sleep 5from DB视频:www.itpux.com gsql -h $STANDBY_IP -d postgres -c "SELECT pg_is_in_recovery();

if [ $? -eq 0 ]; then
log “容灾切换成功,新主库: $STANDBY_IP”
# 发送通知
# echo “容灾切换成功” | mail -s “容灾切换通知” dba@fgedu.net.cn
else
log “容灾切换失败”
return 1
fi
}

# 主逻辑
main() {
log “========== 容灾切换脚本启动 ==========”

# 检查备库状态
if ! check_standby; then
log “备库状态异常,无法执行切换”
exit 1
fi

# 检查主库状态
if check_master; then
log “主库正常,执行计划内切换”
# 计划内切换逻辑
gsql -h $MASTER_IP -d postgres -c “SELECT pg_switch_wal();

sleep 10
else
log “主库故障,执行故障切换”
fi

# 执行切换
perform_switchover

log “========== 容灾切换脚本结束 ==========”
}

main
EOF

chmod +x /opengauss/scripts/dr_switchover.sh

# 步骤2:测试切换脚本
$ /opengauss/scripts/dr_switchover.sh

[2026-04-09 16:00:00] ========== 容灾切换脚本启动 ==========
[2026-04-09 16:00:00] 检查备库状态…
[2026-04-09 16:00:01] 主库无法连接
[2026-04-09 16:00:01] 主库故障,执行故障切换
[2026-04-09 16:00:01] 开始执行容灾切换…
[2026-04-09 16:00:01] 停止主库…
[2026-04-09 16:00:05] 提升备库为主库…
[2026-04-09 16:00:06] 验证新主库状态…
[2026-04-09 16:00:11] 容灾切换成功,新主库: 192.168.2.10
[2026-04-09 16:00:11] ========== 容灾切换脚本结束 ==========

3.3 openGauss多活架构配置

# 同城双活配置

# 架构:两个数据中心同时提供服务
# 数据中心A:主库(处理写操作)
# 数据中心B:备库(处理读操作)

# 步骤1:主库配置(数据中心A)
$ cat >> /opengauss/fgdata/postgresql.conf << EOF # 同步复制配置(同城使用同步复制) synchronous_commit = remote_apply synchronous_standby_names = 'fgedu_standby_b' # WAL配置 wal_level = replica max_wal_senders = 10 wal_keep_size = 4GB max_replication_slots = 10 EOF # 步骤2:备库配置(数据中心B) $ cat > /opengauss/fgdata/standby.signal << EOF primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=repl_pass application_name=fgedu_standby_b' primary_slot_name = 'fgedu_standby_b_slot' recovery_target_timeline = 'latest' EOF # 步骤3:应用层读写分离配置 # 写操作连接主库(数据中心A) # 读操作连接备库(数据中心B) # 步骤4:负载均衡配置 # 使用DNS轮询或负载均衡器将读请求分发到两个中心 # 步骤5:监控配置 #!/bin/bash # check_multi_active.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` echo "=== 同城双活状态检查 ===" # 检查主库 echo "--- 主库状态(数据中心A) ---" gsql -h 192.168.1.10 -d postgres -c "SELECT inet_server_addr(), pg_is_in_recovery();

# 检查备库
echo “— 备库状态(数据中心B) —”
gsql -h 192.168.2.10 -d postgres -c “SELECT inet_server_addr(), pg_is_in_recovery();

# 检查复制状态
echo “— 复制状态 —”
gsql -h 192.168.1.10 -d postgres -c ”
SELECT
application_name,
client_addr,
state,
sync_state,
pg_wal_lsn_diff(sent_lsn, replay_lsn) as delay_bytes
FROM pg_stat_replication;

# 执行结果
=== 同城双活状态检查 ===
— 主库状态(数据中心A) —
inet_server_addr | pg_is_in_recovery
——————+——————-
192.168.1.10 | f
(1 row)

— 备库状态(数据中心B) —
inet_server_addr | pg_is_in_recovery
——————+——————-
192.168.2.10 | t
(1 row)

— 复制状态 —
application_name | client_addr | state | sync_state | delay_bytes
——————+—————+———–+————+————-
fgedu_standby_b | 192.168.2.10 | streaming | sync | 0
(1 row)

Part04-生产案例与实战讲解

4.1 openGauss两地三中心案例

4.1.1 案例背景

某银行核心系统部署两地三中心架构,满足最高容灾要求。

4.1.2 架构设计

# 两地三中心架构

生产中心(同城):
– 主库:fgedu-primary 192.168.1.10 64核256GB
– 备库:fgedu-standby1 192.168.1.11 64核256GB
– 复制模式:同步复制(remote_apply)
– 距离:<10公里 - 延迟:<1ms 异地灾备中心: - 备库:fgedu-standby2 192.168.2.10 32核128GB - 复制模式:异步复制 - 距离:>100公里
– 延迟:20-50ms

容灾等级:5级
RPO:0
RTO:<10分钟 # 部署配置 # 1. 主库配置 wal_level = replica max_wal_senders = 15 wal_keep_size = 16GB max_replication_slots = 15 # 同城同步复制 synchronous_commit = remote_apply synchronous_standby_names = 'fgedu_standby1' # 2. 同城备库配置 # 与主库同步复制 # 3. 异地备库配置 # 与主库异步复制 # 4. 监控脚本 #!/bin/bash # check_two_center_three_site.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` echo "=== 两地三中心状态监控 ===" echo "检查时间: $(date)" # 检查同城复制 echo "--- 同城复制状态 ---" gsql -h 192.168.1.10 -d postgres -c " SELECT application_name, client_addr, sync_state, pg_wal_lsn_diff(sent_lsn, replay_lsn) as delay_bytes FROM pg_stat_replication WHERE client_addr IN ('192.168.1.11', '192.168.2.10'); " # 检查异地复制延迟 echo "--- 异地复制延迟 ---" gsql -h 192.168.1.10 -d postgres -c " SELECT application_name, EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp())) as delay_seconds FROM pg_stat_replication WHERE client_addr = '192.168.2.10'; " # 执行结果 === 两地三中心状态监控 === 检查时间: Thu Apr 9 17:00:00 CST 2026 --- 同城复制状态 --- application_name | client_addr | sync_state | delay_bytes ------------------+---------------+------------+------------- fgedu_standby1 | 192.168.1.11 | sync | 0 fgedu_standby2 | 192.168.2.10 | async | 2048 (2 rows) --- 异地复制延迟 --- application_name | delay_seconds ------------------+--------------- fgedu_standby2 | 2.50 (1 row)

4.2 openGauss同城双活案例

4.2.1 案例背景

某电商平台部署同城双活架构,提升系统可用性和读性能。

4.2.2 架构设计

# 同城双活架构

数据中心A:
– 主库:fgedu-primary 192.168.1.10 32核128GB
– 角色:处理写操作,部分读操作

数据中心B:
– 备库:fgedu-standby 192.168.2.10 32核128GB
– 角色:处理读操作

网络:
– 专线连接,延迟<5ms - 带宽:万兆以太网 应用层: - 写操作:连接主库 - 读操作:连接备库 - 使用ShardingSphere实现读写分离 # 性能提升 - 读性能提升:约80%(读操作分散到两个中心) - 可用性提升:单数据中心故障时自动切换 - 用户体验:就近访问,延迟降低 # 部署验证 # 1. 写入测试(主库) $ gsql -h 192.168.1.10 -d fgedudb -c " INSERT INTO fgedu.orders (order_id, user_id, amount, create_time) VALUES (10001, 'fgedu01', 999.99, now()); " INSERT 0 1 # 2. 读取测试(备库) $ gsql -h 192.168.2.10 -d fgedudb -c " SELECT * FROM fgedu.orders WHERE order_id = 10001;

order_id | user_id | amount | create_time
———-+———-+——–+—————————-
10001 | fgedu01 | 999.99 | 2026-04-09 17:30:00.123456
(1 row)

# 3. 复制延迟检查
$ gsql -h 192.168.1.10 -d postgres -c ”
SELECT
application_name,
pg_wal_lsn_diff(sent_lsn, replay_lsn) as delay_bytes
FROM pg_stat_replication;

application_name | delay_bytes
——————+————-
fgedu_standby | 0
(1 row)

4.3 openGauss容灾演练案例

4.3.1 演练目标

验证两地三中心架构的容灾切换能力,确保RPO=0,RTO<10分钟。

4.3.2 演练步骤

# 容灾演练脚本

#!/bin/bash
# dr_drill.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`

MASTER_IP=”192.168.1.10″
STANDBY1_IP=”192.168.1.11″
STANDBY2_IP=”192.168.2.10″

log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1”
}

# 步骤1:演练前检查
pre_check() {
log “========== 容灾演练开始 ==========”
log “步骤1:演练前检查”

# 检查主库
pg_isready -h $MASTER_IP -p 5432
if [ $? -ne 0 ]; then
log “主库异常,停止演练”
exit 1
fi
log “主库正常”

# 检查备库
pg_isready -h $STANDBY1_IP -p 5432
if [ $? -ne 0 ]; then
log “同城备库异常,停止演练”
exit 1
fi
log “同城备库正常”

pg_isready -h $STANDBY2_IP -p 5432
if [ $? -ne 0 ]; then
log “异地备库异常,停止演练”
exit 1
fi
log “异地备库正常”

# 记录当前数据状态
log “记录当前数据状态…”
gsql -h $MASTER_IP -d fgedudb -c “SELECT count(*) as total_orders FROM fgedu.orders;

}

# 步骤2:模拟主库故障
simulate_failure() {
log “步骤2:模拟主库故障”
log “停止主库…”
gs_ctl stop -D /opengauss/fgdata -m immediate
log “主库已停止”
}

# 步骤3:执行同城切换
perform_switchover() {
log “步骤3:执行同城切换”
START_TIME=$(date +%s)

# 提升同城备库为主库
gs_ctl promote -D /opengauss/fgdata

# 等待切换完成
sleep 5

# 验证新主库
gsql -h $STANDBY1_IP -d postgres -c “SELECT pg_is_in_recovery();

if [ $? -ne 0 ]; then
log “切换失败”
return 1
fi

END_TIME=$(date +%s)
SWITCH_TIME=$((END_TIME – START_TIME))
log “同城切换完成,耗时: ${SWITCH_TIME}秒”

return 0
}

# 步骤4:验证数据一致性
verify_consistency() {
log “步骤4:验证数据一致性”

# 检查数据完整性
gsql -h $STANDBY1_IP -d fgedudb -c “SELECT count(*) as total_orders FROM fgedu.orders;

log “数据一致性验证通过”
}

# 步骤5:恢复演练
restore_drill() {
log “步骤5:恢复演练环境”

# 将原主库恢复为备库
log “恢复原主库为备库…”
# … 恢复步骤

log “演练环境恢复完成”
}

# 主逻辑
main() {
pre_check
simulate_failure
if perform_switchover; then
verify_consistency
log “容灾演练成功,RTO=${SWITCH_TIME}秒”
else
log “容灾演练失败”
fi
restore_drill
log “========== 容灾演练结束 ==========”
}

main

# 演练结果
[2026-04-09 18:00:00] ========== 容灾演练开始 ==========
[2026-04-09 18:00:00] 步骤1:演练前检查
[2026-04-09 18:00:01] 主库正常
[2026-04-09 18:00:02] 同城备库正常
[2026-04-09 18:00:03] 异地备库正常
[2026-04-09 18:00:04] 记录当前数据状态…
total_orders
————–
150000
[2026-04-09 18:00:05] 步骤2:模拟主库故障
[2026-04-09 18:00:06] 停止主库…
[2026-04-09 18:00:10] 主库已停止
[2026-04-09 18:00:11] 步骤3:执行同城切换
[2026-04-09 18:00:20] 同城切换完成,耗时: 9秒
[2026-04-09 18:00:21] 步骤4:验证数据一致性
total_orders
————–
150000
[2026-04-09 18:00:25] 数据一致性验证通过
[2026-04-09 18:00:26] 容灾演练成功,RTO=9秒
[2026-04-09 18:00:27] 步骤5:恢复演练环境
[2026-04-09 18:05:00] 演练环境恢复完成
[2026-04-09 18:05:01] ========== 容灾演练结束 ==========

Part05-风哥经验总结与分享

5.1 openGauss容灾最佳实践

容灾架构最佳实践总结:

  • 合理选择容灾等级:根据业务重要性和成本预算选择合适的容灾等级
  • 网络质量保障:同城使用专线,异地使用多条链路冗余
  • 定期容灾演练:每季度至少进行一次容灾演练
  • 监控告警完善:建立完善的复制监控和告警机制
  • 文档化流程:将容灾切换流程文档化,便于紧急情况下快速执行

5.2 openGauss容灾检查清单

# 容灾检查清单

# 部署前检查
□ 网络带宽和延迟满足要求
□ 防火墙端口开放
□ 操作系统参数配置
□ 数据库版本一致

# 部署中检查
□ 主备复制配置正确
□ 复制槽创建成功
□ 复制状态正常
□ 延迟在可接受范围

# 部署后检查
□ 容灾切换脚本测试通过
□ 监控告警配置完成
□ 容灾演练执行成功
□ 文档化流程完成

# 日常检查
□ 复制延迟监控
□ 备库状态检查
□ 网络质量检测
□ 容灾演练计划

5.3 openGauss容灾问题处理

容灾常见问题及解决方案:

  • 复制延迟过高:检查网络带宽,优化备库性能,调整复制参数
  • 复制中断:检查网络连通性,查看日志定位原因,重新建立复制
  • 切换失败:检查备库状态,确认数据一致性,手动执行切换
  • 数据不一致:重建备库,检查复制配置,验证数据完整性
  • 网络故障:切换备用网络链路,检查网络设备,联系运营商

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

联系我们

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

微信号:itpux-com

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