1. 首页 > GoldenGate教程 > 正文

GoldenGate教程FG061-OGG高可用架构设计与双活数据中心实战

本文档风哥主要介绍Oracle GoldenGate高可用架构设计与双活数据中心实战方法,包括高可用概念、双活架构模式、关键组件、配置方法、故障切换等内容,风哥教程参考GoldenGate官方文档高可用架构、容灾设计等内容,适合需要设计和实施OGG高可用架构的架构师和运维人员参考。

Part01-基础概念与理论知识

1.1 OGG高可用架构概念

OGG高可用架构是指通过架构设计确保数据同步服务的连续性和可靠性,在单点故障发生时能够快速切换,保障业务连续性。更多视频教程www.fgedu.net.cn

OGG高可用的核心目标:

  • 消除单点故障
  • 实现快速故障切换
  • 保障数据零丢失
  • 支持业务连续性
  • 满足合规要求
# OGG高可用架构层次

# 第一层:进程级高可用
目标:单个进程故障自动恢复
实现方式:
– Manager自动重启
– 进程监控脚本
– 自动告警通知

# 第二层:服务器级高可用
目标:单台服务器故障自动切换
实现方式:
– OGG集群部署
– 共享存储
– VIP漂移

# 第三层:数据中心级高可用
目标:单个数据中心故障切换
实现方式:
– 双活数据中心
– 主备数据中心
– 多活数据中心

# 第四层:区域级高可用
目标:区域灾难恢复
实现方式:
– 异地容灾
– 多区域部署
– 全球负载均衡

# 高可用指标定义
| 指标 | 说明 | 计算方式 |
|————-|————————|———————-|
| RTO | 恢复时间目标 | 故障到恢复的时间 |
| RPO | 恢复点目标 | 可接受的数据丢失量 |
| MTTR | 平均恢复时间 | 总恢复时间/故障次数 |
| MTBF | 平均故障间隔 | 总运行时间/故障次数 |
| 可用性 | 服务可用率 | (总时间-故障时间)/总时间|

# 高可用级别
| 级别 | 可用性 | 年停机时间 | 适用场景 |
|——-|————|————-|——————|
| 2个9 | 99% | 87.6小时 | 非关键业务 |
| 3个9 | 99.9% | 8.76小时 | 一般业务 |
| 4个9 | 99.99% | 52.6分钟 | 关键业务 |
| 5个9 | 99.999% | 5.26分钟 | 核心业务 |

1.2 双活数据中心架构模式

双活数据中心是OGG高可用架构的重要实现方式:

# 双活数据中心架构模式

# 模式1:Active-Active(双活)
特点:
– 两个数据中心同时对外提供服务
– 数据双向实时同步
– 负载分担

优点:
– 资源利用率高
– 无切换时间
– 性能最优

缺点:
– 架构复杂
– 需要处理数据冲突
– 成本较高

适用场景:
– 核心交易系统
– 高并发业务
– 对RTO要求极高的场景

# 模式2:Active-Passive(主备)
特点:
– 主数据中心提供服务
– 备数据中心待命
– 数据单向同步

优点:
– 架构简单
– 无数据冲突
– 成本较低

缺点:
– 资源利用率低
– 需要切换时间
– 存在RTO

适用场景:
– 一般业务系统
– 成本敏感场景
– 对RTO要求不高的场景

# 模式3:Active-Active-Passive(双活+备)
特点:
– 两个数据中心双活
– 第三个数据中心作为备份
– 多层保护

优点:
– 高可靠性
– 支持多故障场景
– 灵活性高

缺点:
– 架构最复杂
– 成本最高
– 运维难度大

适用场景:
– 金融核心系统
– 对可用性要求极高
– 合规要求严格

# 双活架构示意图
+——————+ +——————+
| 数据中心A | | 数据中心B |
| (Active) | | (Active) |
+——————+ +——————+
| Oracle数据库 | | Oracle数据库 |
| OGG Extract | <---双向同步---> | OGG Extract |
| OGG Replicat | | OGG Replicat |
+——————+ +——————+
| |
+——————+——————–+
|
+——————+
| 全局负载均衡 |
| (GSLB/F5) |
+——————+
|
+——————+
| 应用层 |
+——————+

1.3 高可用关键组件

OGG高可用架构涉及多个关键组件:

# 组件1:OGG进程冗余
功能:确保OGG进程高可用
实现方式:
– 多个Extract进程并行
– 多个Replicat进程并行
– 进程自动重启

配置示例:
— 多Extract并行
EXTRACT E_FGEDU01
EXTTRAIL /GoldenGate/app/dirdat/ea
TABLE fgedu01.*;

EXTRACT E_FGEDU02
EXTTRAIL /GoldenGate/app/dirdat/eb
TABLE fgedu02.*;

# 组件2:Trail文件冗余
功能:确保数据文件高可用
实现方式:
– 多路径Trail文件
– Trail文件复制
– 共享存储

配置示例:
— 双路径Trail
EXTRACT E_FGEDU01
EXTTRAIL /GoldenGate/app/dirdat/ea, ALTTRAIL /GoldenGate/app/dirdat/ea_alt
TABLE fgedu01.*;

# 组件3:检查点冗余
功能:确保检查点高可用
实现方式:
– 检查点表+检查点文件
– 多检查点表
– 检查点备份

配置示例:
— 双检查点
CHECKPOINTTABLE fgedu.ogg_chkpt
CHECKPOINTFILE /GoldenGate/app/dirchk/E_FGEDU01.cpe

# 组件4:网络冗余
功能:确保网络高可用
实现方式:
– 多网络链路
– 网络负载均衡
– VIP漂移

配置示例:
— 多网络路径
RMTHOST host1, MGRPORT 7809, ALTHOST host2, ALTPORT 7809

# 组件5:存储冗余
功能:确保存储高可用
实现方式:
– RAID存储
– 存储复制
– 共享存储集群

# 组件6:监控告警
功能:及时发现和处理故障
实现方式:
– 进程监控
– 延迟监控
– 自动告警
– 自动切换

风哥提示:高可用架构设计要综合考虑成本、复杂度和业务需求,选择合适的架构模式,避免过度设计。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 高可用架构规划

制定详细的高可用架构规划是成功实施的关键:

高可用架构规划要点:

  • 明确业务需求和RTO/RPO
  • 评估现有架构风险
  • 选择合适的架构模式
  • 设计详细的实施方案
  • 制定完善的切换预案
# 高可用需求分析

# 步骤1:业务分级
| 业务级别 | RTO要求 | RPO要求 | 架构选择 |
|———–|———-|———-|——————|
| 核心业务 | <5分钟 | 0 | 双活数据中心 | | 重要业务 | <30分钟 | <5分钟 | 主备数据中心 | | 一般业务 | <4小时 | <1小时 | 本地高可用 | | 非关键业务 | <24小时 | <24小时 | 基础备份恢复 | # 步骤2:风险评估 | 风险类型 | 影响范围 | 发生概率 | 应对措施 | |-------------|-----------|-----------|------------------| | 单点故障 | 服务中断 | 高 | 冗余设计 | | 数据丢失 | 业务异常 | 中 | 数据同步 | | 网络故障 | 同步中断 | 中 | 多链路 | | 存储故障 | 数据丢失 | 低 | 存储冗余 | | 机房故障 | 服务中断 | 低 | 多机房部署 | | 区域故障 | 服务中断 | 极低 | 异地容灾 | # 步骤3:架构设计 # 双活数据中心架构设计 数据中心A(北京) 数据中心B(上海) +------------------+ +------------------+ | 数据库集群 | | 数据库集群 | | Oracle RAC | | Oracle RAC | +------------------+ +------------------+ | | +------------------+ +------------------+ | OGG服务器集群 | | OGG服务器集群 | | Node1/Node2 | | Node1/Node2 | +------------------+ +------------------+ | | +--------双向同步-------------+ | +------------------+ | 监控告警平台 | +------------------+ # 步骤4:资源规划 | 资源类型 | 数据中心A | 数据中心B | 说明 | |-----------|------------|------------|--------------| | 数据库服务器| 4台 | 4台 | RAC集群 | | OGG服务器 | 2台 | 2台 | 主备部署 | | 网络带宽 | 1Gbps | 1Gbps | 专线互联 | | 存储容量 | 10TB | 10TB | 同等配置 |

2.2 容灾策略选择

根据业务需求选择合适的容灾策略:

# 容灾策略对比

# 策略1:同城双活
特点:
– 两个数据中心在同一城市
– 距离通常<50公里 - 网络延迟<2ms 适用场景: - 金融核心系统 - 对RTO要求极高 - 数据实时同步 优势: - 切换时间短 - 数据零丢失 - 运维方便 劣势: - 无法应对城市级灾难 - 成本较高 # 策略2:异地主备 特点: - 主备数据中心在不同城市 - 距离通常>100公里
– 网络延迟>10ms

适用场景:
– 一般业务系统
– 对RTO要求适中
– 成本敏感

优势:
– 可应对城市级灾难
– 成本较低

劣势:
– 切换时间较长
– 可能存在数据丢失

# 策略3:两地三中心
特点:
– 同城双活+异地备份
– 多层保护
– 最高可靠性

适用场景:
– 金融核心系统
– 合规要求严格
– 对可用性要求极高

优势:
– 最高可靠性
– 多层保护
– 满足合规要求

劣势:
– 架构最复杂
– 成本最高
– 运维难度大

# 容灾策略选择矩阵
| 业务重要性 | RTO要求 | 推荐策略 | 成本等级 |
|————|———-|——————|———–|
| 极高 | <5分钟 | 两地三中心 | 高 | | 高 | <30分钟 | 同城双活 | 中高 | | 中 | <4小时 | 异地主备 | 中 | | 低 | <24小时 | 本地备份 | 低 |

2.3 切换策略规划

制定完善的切换策略是保障业务连续性的关键:

# 切换场景分类

# 场景1:计划内切换
触发条件:
– 机房维护
– 设备升级
– 演练测试

特点:
– 提前规划
– 业务低峰期
– 可控风险

切换流程:
1. 发布切换公告
2. 停止应用写入
3. 等待同步追平
4. 验证数据一致性
5. 切换应用到备中心
6. 验证业务功能
7. 恢复服务

# 场景2:故障切换
触发条件:
– 主中心故障
– 网络中断
– 数据库故障

特点:
– 突发事件
– 时间紧迫
– 风险较高

切换流程:
1. 故障检测
2. 故障确认
3. 决定切换
4. 启动备中心
5. 验证数据一致性
6. 切换应用
7. 恢复服务

# 场景3:回切
触发条件:
– 主中心恢复
– 演练结束
– 维护完成

特点:
– 主中心已恢复
– 需要数据同步
– 风险可控

切换流程:
1. 确认主中心恢复
2. 启动反向同步
3. 等待数据追平
4. 验证数据一致性
5. 切换应用到主中心
6. 验证业务功能
7. 恢复正常服务

# 切换时间规划
| 切换阶段 | 计划切换 | 故障切换 |
|—————–|———–|———–|
| 故障检测 | – | 1-5分钟 |
| 决策确认 | 5分钟 | 5分钟 |
| 数据验证 | 10分钟 | 5分钟 |
| 应用切换 | 5分钟 | 5分钟 |
| 功能验证 | 10分钟 | 5分钟 |
| 总计 | 30分钟 | 20分钟 |

风哥提示:切换策略要定期演练,确保在真实故障发生时能够快速、准确地执行切换操作。学习交流加群风哥QQ113257174

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

3.1 OGG高可用配置实战

3.1.1 OGG集群配置

# 步骤1:部署OGG集群
# 节点1配置
$ mkdir -p /GoldenGate/app
$ chown ogg:ogg /GoldenGate/app
$ cd /GoldenGate/app
$ unzip /software/fbo_ggs_Linux_x64_shiphome.zip
$ ./ggsci

GGSCI (ogg-node1)> CREATE SUBDIRS

# 节点2配置(相同步骤)
$ mkdir -p /GoldenGate/app
$ chown ogg:ogg /GoldenGate/app
$ cd /GoldenGate/app
$ unzip /software/fbo_ggs_Linux_x64_shiphome.zip
$ ./ggsci

GGSCI (ogg-node2)> CREATE SUBDIRS

# 步骤2:配置共享存储
# 在两个节点挂载共享存储
$ mkdir -p /GoldenGate/shared
$ mount -t nfs nas-server:/ogg-shared /GoldenGate/shared

# 配置Trail文件存储到共享存储
GGSCI (ogg-node1)> EDIT PARAMS E_FGEDU01

EXTRACT E_FGEDU01
USERIDALIAS fgedu_alias
EXTTRAIL /GoldenGate/shared/dirdat/ea
TABLE fgedu01.*;

# 步骤3:配置Manager高可用
GGSCI (ogg-node1)> EDIT PARAMS MGR

PORT 7809
PURGEOLDEXTRACTS /GoldenGate/shared/dirdat/*, USECHECKPOINTS

— 自动重启配置
AUTORESTART EXTRACT *, RETRIES 5, WAITMINUTES 2, RESETMINUTES 60
AUTORESTART REPLICAT *, RETRIES 5, WAITMINUTES 2, RESETMINUTES 60

— 故障转移配置
FAILOVER DYNAMIC

# 步骤4:配置检查点表
SQL> CREATE USER fgedu IDENTIFIED BY fgedu123;
SQL> GRANT CONNECT, RESOURCE, DBA TO fgedu;

GGSCI (ogg-node1)> DBLOGIN USERIDALIAS fgedu_alias
GGSCI (ogg-node1)> ADD CHECKPOINTTABLE fgedu.ogg_chkpt

# 步骤5:配置多路径Trail
GGSCI (ogg-node1)> EDIT PARAMS E_FGEDU01

EXTRACT E_FGEDU01
USERIDALIAS fgedu_alias
EXTTRAIL /GoldenGate/shared/dirdat/ea
ALTTRAIL /GoldenGate/local/dirdat/ea
TABLE fgedu01.*;

# 步骤6:配置Data Pump冗余
GGSCI (ogg-node1)> EDIT PARAMS P_FGEDU01

EXTRACT P_FGEDU01
USERIDALIAS fgedu_alias
RMTHOST ogg-node2, MGRPORT 7809
ALTHOST ogg-node3, ALTPORT 7809
RMTTRAIL /GoldenGate/shared/dirdat/ra
TABLE fgedu01.*;

# 步骤7:启动OGG集群
# 节点1
GGSCI (ogg-node1)> START MANAGER
GGSCI (ogg-node1)> START EXTRACT E_FGEDU01
GGSCI (ogg-node1)> START EXTRACT P_FGEDU01

# 节点2
GGSCI (ogg-node2)> START MANAGER
GGSCI (ogg-node2)> START REPLICAT R_FGEDU01

# 步骤8:验证集群状态
GGSCI (ogg-node1)> INFO ALL

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING
EXTRACT RUNNING E_FGEDU01 00:00:00 00:00:05
EXTRACT RUNNING P_FGEDU01 00:00:00 00:00:03

3.1.2 进程自动重启配置

# 步骤1:配置Manager自动重启
GGSCI (fgedu.net.cn)> EDIT PARAMS MGR

PORT 7809
PURGEOLDEXTRACTS /GoldenGate/app/dirdat/*, USECHECKPOINTS

— Extract进程自动重启
AUTORESTART EXTRACT E_*, RETRIES 5, WAITMINUTES 2, RESETMINUTES 60
AUTORESTART EXTRACT P_*, RETRIES 5, WAITMINUTES 2, RESETMINUTES 60

— Replicat进程自动重启
AUTORESTART REPLICAT R_*, RETRIES 5, WAITMINUTES 2, RESETMINUTES 60

— 启动延迟配置
STARTUPVALIDATIONDELAY 30

# 步骤2:创建进程监控脚本
#!/bin/bash
# ogg_ha_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/ha_monitor.log
MAX_RETRIES=3

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

# 检查进程状态
check_process() {
local process_name=$1
cd $OGG_HOME

status=$(echo “INFO EXTRACT $process_name 2>/dev/null || INFO REPLICAT $process_name” | ./ggsci | grep “Status” | awk ‘{print $2}’)

if [ “$status” != “RUNNING” ]; then
return 1
fi
return 0
}

# 重启进程
restart_process() {
local process_name=$1
cd $OGG_HOME

# 判断进程类型
if echo “INFO ALL” | ./ggsci | grep “EXTRACT.*$process_name” > /dev/null; then
echo “START EXTRACT $process_name” | ./ggsci
else
echo “START REPLICAT $process_name” | ./ggsci
fi
}

# 主监控循环
main() {
log_message “开始OGG高可用监控”

cd $OGG_HOME
processes=$(echo “INFO ALL” | ./ggsci | grep -E “EXTRACT|REPLICAT” | awk ‘{print $3}’)

for proc in $processes; do
if ! check_process $proc; then
log_message “进程 $proc 异常,尝试重启”

retry=0
while [ $retry -lt $MAX_RETRIES ]; do
retry=$((retry + 1))
log_message “第 $retry 次尝试重启 $proc”

restart_process $proc
sleep 10

if check_process $proc; then
log_message “进程 $proc 重启成功”
break
fi
done

if [ $retry -eq $MAX_RETRIES ]; then
log_message “进程 $proc 重启失败,发送告警”
# 发送告警
/GoldenGate/app/scripts/alert/send_alert.sh “P1” “OGG进程重启失败” “$proc 重启失败,需要人工介入”
fi
fi
done

log_message “OGG高可用监控完成”
}

main

# 步骤3:设置定时任务
$ crontab -e
*/1 * * * * /GoldenGate/app/scripts/ogg_ha_monitor.sh >> /GoldenGate/app/logs/cron.log 2>&1

3.2 双活数据中心配置实战

3.2.1 双向同步配置

# 步骤1:数据中心A配置
GGSCI (dc-a.fgedu.net.cn)> EDIT PARAMS E_TO_B

EXTRACT E_TO_B
USERIDALIAS fgedu_alias
EXTTRAIL /GoldenGate/app/dirdat/ab
TABLE fgedu01.*;
TABLE fgedu02.*;

GGSCI (dc-a.fgedu.net.cn)> EDIT PARAMS R_FROM_B

REPLICAT R_FROM_B
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS
MAP fgedu01.*, TARGET fgedu01.*;
MAP fgedu02.*, TARGET fgedu02.*;

— 避免循环复制
TRANLOGOPTIONS EXCLUDETAG 99

# 步骤2:数据中心B配置
GGSCI (dc-b.fgedu.net.cn)> EDIT PARAMS E_TO_A

EXTRACT E_TO_A
USERIDALIAS fgedu_alias
EXTTRAIL /GoldenGate/app/dirdat/ba
TABLE fgedu01.*;
TABLE fgedu02.*;

GGSCI (dc-b.fgedu.net.cn)> EDIT PARAMS R_FROM_A

REPLICAT R_FROM_A
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS
MAP fgedu01.*, TARGET fgedu01.*;
MAP fgedu02.*, TARGET fgedu02.*;

— 避免循环复制
TRANLOGOPTIONS EXCLUDETAG 99

# 步骤3:创建进程
# 数据中心A
GGSCI (dc-a)> ADD EXTRACT E_TO_B, TRANLOG, BEGIN NOW
GGSCI (dc-a)> ADD EXTTRAIL /GoldenGate/app/dirdat/ab, EXTRACT E_TO_B
GGSCI (dc-a)> ADD REPLICAT R_FROM_B, EXTTRAIL /GoldenGate/app/dirdat/ba, CHECKPOINTTABLE fgedu.ogg_chkpt

# 数据中心B
GGSCI (dc-b)> ADD EXTRACT E_TO_A, TRANLOG, BEGIN NOW
GGSCI (dc-b)> ADD EXTTRAIL /GoldenGate/app/dirdat/ba, EXTRACT E_TO_A
GGSCI (dc-b)> ADD REPLICAT R_FROM_A, EXTTRAIL /GoldenGate/app/dirdat/ab, CHECKPOINTTABLE fgedu.ogg_chkpt

# 步骤4:启动双向同步
# 数据中心A
GGSCI (dc-a)> START EXTRACT E_TO_B
GGSCI (dc-a)> START REPLICAT R_FROM_B

# 数据中心B
GGSCI (dc-b)> START EXTRACT E_TO_A
GGSCI (dc-b)> START REPLICAT R_FROM_A

# 步骤5:验证双向同步
# 在数据中心A插入数据
SQL> INSERT INTO fgedu01.fgedu_orders VALUES (1, ‘DC-A’, SYSDATE);
SQL> COMMIT;

# 在数据中心B验证
SQL> SELECT * FROM fgedu01.fgedu_orders WHERE id = 1;

ID SOURCE CREATE_TIME
———- ———- ——————-
1 DC-A 2026-04-10 10:00:00

# 在数据中心B插入数据
SQL> INSERT INTO fgedu01.fgedu_orders VALUES (2, ‘DC-B’, SYSDATE);
SQL> COMMIT;

# 在数据中心A验证
SQL> SELECT * FROM fgedu01.fgedu_orders WHERE id = 2;

ID SOURCE CREATE_TIME
———- ———- ——————-
2 DC-B 2026-04-10 10:00:05
from GoldenGate视频:www.itpux.com

3.2.2 冲突处理配置

# 步骤1:配置冲突检测
GGSCI (dc-a.fgedu.net.cn)> EDIT PARAMS R_FROM_B

REPLICAT R_FROM_B
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS

— 冲突处理配置
MAP fgedu01.fgedu_orders, TARGET fgedu01.fgedu_orders,
COMPARECOLS (ALL, EXCEPT create_time),
RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, DISCARD)),
RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, DISCARD));

— 记录冲突日志
REPORTCOUNT EVERY 1 MINUTES, RATE
REPORTROLLOVER AT 00:00

# 步骤2:配置异常处理表
SQL> CREATE TABLE fgedu.ogg_conflicts (
conflict_time TIMESTAMP,
table_name VARCHAR2(100),
operation VARCHAR2(10),
conflict_type VARCHAR2(50),
source_data CLOB,
target_data CLOB,
resolution VARCHAR2(50)
);

# 步骤3:配置冲突处理函数
GGSCI (dc-a.fgedu.net.cn)> EDIT PARAMS R_FROM_B

REPLICAT R_FROM_B
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS

— 使用存储过程处理冲突
MAP fgedu01.fgedu_orders, TARGET fgedu01.fgedu_orders,
COMPARECOLS (ALL, EXCEPT create_time),
RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, USEMAX (update_time)));

# 步骤4:创建冲突监控脚本
#!/bin/bash
# conflict_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/conflict.log

check_conflicts() {
# 检查冲突日志
cd $OGG_HOME

for report in dirrpt/R_*.rpt; do
conflicts=$(grep -c “CONFLICT” $report 2>/dev/null)
if [ $conflicts -gt 0 ]; then
echo “[$(date)] 发现 $conflicts 个冲突: $report” >> $LOG_FILE

# 发送告警
/GoldenGate/app/scripts/alert/send_alert.sh “P2” “OGG数据冲突” “发现 $conflicts 个数据冲突”
fi
done
}

check_conflicts

3.3 故障切换实战演练

# 步骤1:创建切换脚本
#!/bin/bash
# ogg_failover.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

ACTION=$1
LOG_FILE=/GoldenGate/app/logs/failover.log

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

# 切换到备中心
failover_to_standby() {
log_message “开始切换到备中心”

# 1. 停止主中心OGG进程
log_message “停止主中心OGG进程”
echo “STOP EXTRACT *” | ggsci
echo “STOP REPLICAT *” | ggsci

# 2. 等待Trail文件传输完成
log_message “等待Trail文件传输完成”
sleep 30

# 3. 验证数据一致性
log_message “验证数据一致性”
# 执行数据校验脚本

# 4. 启动备中心OGG进程
log_message “启动备中心OGG进程”
ssh standby-dc “echo ‘START EXTRACT *’ | ggsci”
ssh standby-dc “echo ‘START REPLICAT *’ | ggsci”

# 5. 切换应用VIP
log_message “切换应用VIP”
# VIP切换脚本

# 6. 验证服务
log_message “验证服务状态”
# 服务验证脚本

log_message “切换完成”
}

# 切换回主中心
failback_to_primary() {
log_message “开始切换回主中心”

# 1. 确认主中心已恢复
log_message “确认主中心已恢复”

# 2. 启动反向同步
log_message “启动反向同步”
echo “START EXTRACT E_TO_PRIMARY” | ggsci

# 3. 等待数据追平
log_message “等待数据追平”
sleep 60

# 4. 验证数据一致性
log_message “验证数据一致性”

# 5. 停止备中心写入
log_message “停止备中心写入”
ssh standby-dc “echo ‘STOP EXTRACT *’ | ggsci”

# 6. 切换应用VIP
log_message “切换应用VIP”

# 7. 启动主中心OGG进程
log_message “启动主中心OGG进程”
echo “START EXTRACT *” | ggsci
echo “START REPLICAT *” | ggsci

log_message “切换完成”
}

case “$ACTION” in
failover)
failover_to_standby
;;
failback)
failback_to_primary
;;
*)
echo “用法: $0 {failover|failback}”
;;
esac

# 步骤2:执行切换演练
$ ./ogg_failover.sh failover

[2026-04-10 10:00:00] 开始切换到备中心
[2026-04-10 10:00:01] 停止主中心OGG进程
[2026-04-10 10:00:30] 等待Trail文件传输完成
[2026-04-10 10:01:00] 验证数据一致性
[2026-04-10 10:01:30] 启动备中心OGG进程
[2026-04-10 10:02:00] 切换应用VIP
[2026-04-10 10:02:30] 验证服务状态
[2026-04-10 10:03:00] 切换完成

# 步骤3:验证切换结果
# 检查备中心进程状态
GGSCI (standby-dc)> INFO ALL

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING
EXTRACT RUNNING E_FGEDU01 00:00:00 00:00:05
REPLICAT RUNNING R_FGEDU01 00:00:00 00:00:03

# 检查数据同步状态
SQL> SELECT COUNT(*) FROM fgedu01.fgedu_orders;

COUNT(*)
———-
10000

Part04-生产案例与实战讲解

4.1 金融行业双活案例

某银行核心系统双活数据中心实施案例:

# 项目背景
– 业务:银行核心交易系统
– 要求:RTO<5分钟,RPO=0 - 数据量:约10TB - 交易量:约10000 TPS # 架构设计 两地三中心架构: 北京主中心(生产) 北京备中心(双活) 上海灾备中心 +------------------+ +------------------+ +------------------+ | Oracle RAC | | Oracle RAC | | Oracle单机 | | 4节点 | | 4节点 | | 2节点 | +------------------+ +------------------+ +------------------+ | | | +------------------+ +------------------+ +------------------+ | OGG集群 |<---->| OGG集群 |—–>| OGG单机 |
| 双向同步 | | 双向同步 | | 单向同步 |
+——————+ +——————+ +——————+

# 关键配置
# 1. 双向同步配置
— 北京主中心
EXTRACT E_TO_BJ_B
EXTTRAIL /GoldenGate/app/dirdat/bb
TABLE FGCORE.*;

REPLICAT R_FROM_BJ_B
ASSUMETARGETDEFS
TRANLOGOPTIONS EXCLUDETAG 99
MAP FGCORE.*, TARGET FGCORE.*;

# 2. 异步复制到灾备
EXTRACT P_TO_SH
RMTHOST sh-dr-center, MGRPORT 7809
RMTTRAIL /GoldenGate/app/dirdat/sh
TABLE FGCORE.*;

# 3. 冲突处理
MAP FGCORE.TRANS_LOG, TARGET FGCORE.TRANS_LOG,
RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, USEMAX (TRANS_TIME)));

# 实施效果
| 指标 | 实施前 | 实施后 |
|—————|————-|————-|
| RTO | 4小时 | 3分钟 |
| RPO | 1小时 | 0 |
| 可用性 | 99.9% | 99.999% |
| 年故障时间 | 8.76小时 | 5.26分钟 |

# 运维要点
1. 每日检查同步状态
2. 每周进行切换演练
3. 每月进行灾备演练
4. 每季度进行架构评审

4.2 高可用常见问题

# 问题1:脑裂问题
# 现象
两个数据中心同时认为自己是主中心

# 原因分析
网络分区导致通信中断

# 解决方案
# 1. 配置仲裁机制
— 使用第三方仲裁服务器
FAILOVER DYNAMIC RESOLVE MASTER ogg-arbiter, PORT 7809

# 2. 配置心跳检测
— 配置多个心跳链路
RMTHOST host1, MGRPORT 7809, ALTHOST host2, ALTPORT 7809

# 问题2:数据冲突
# 现象
双向同步时出现数据不一致

# 原因分析
同一记录在两个中心同时修改

# 解决方案
# 1. 配置冲突处理规则
RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, USEMAX (UPDATE_TIME)))

# 2. 业务层面避免
– 按用户ID分片
– 按业务类型分片
– 使用分布式锁

# 问题3:切换后数据丢失
# 现象
切换后发现部分数据丢失

# 原因分析
Trail文件未完全传输

# 解决方案
# 1. 切换前检查同步状态
GGSCI> LAG REPLICAT R_FGEDU01

# 2. 使用检查点表
CHECKPOINTTABLE fgedu.ogg_chkpt

# 3. 验证数据一致性后再切换

4.3 高可用解决方案

# 解决方案1:完整高可用监控脚本
#!/bin/bash
# ogg_ha_complete.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/ha_complete.log

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

# 健康检查
health_check() {
log_message “开始健康检查”

# 检查进程状态
processes=$(echo “INFO ALL” | ggsci | grep -E “EXTRACT|REPLICAT” | awk ‘{print $3}’)

for proc in $processes; do
status=$(echo “INFO $proc” | ggsci | grep “Status” | awk ‘{print $2}’)

if [ “$status” != “RUNNING” ]; then
log_message “进程 $proc 状态异常: $status”
return 1
fi
done

# 检查延迟
for proc in $processes; do
lag=$(echo “LAG $proc” | ggsci | grep “Last record lag” | awk ‘{print $4}’)

if [ -n “$lag” ]; then
lag_seconds=$(echo $lag | awk -F: ‘{print ($1*3600)+($2*60)+$3}’)
if [ $lag_seconds -gt 300 ]; then
log_message “进程 $proc 延迟过大: $lag”
return 1
fi
fi
done

# 检查存储空间
disk_usage=$(df -h /GoldenGate | tail -1 | awk ‘{print $5}’ | cut -d% -f1)
if [ $disk_usage -gt 80 ]; then
log_message “存储空间不足: ${disk_usage}%”
return 1
fi

log_message “健康检查通过”
return 0
}

# 自动故障处理
auto_failover() {
log_message “开始自动故障处理”

# 检查是否需要切换
if ! health_check; then
log_message “检测到故障,准备切换”

# 通知备中心准备接管
ssh standby-dc “/GoldenGate/app/scripts/prepare_takeover.sh”

# 执行切换
/GoldenGate/app/scripts/ogg_failover.sh failover
fi
}

# 主程序
case “$1” in
check)
health_check
;;
failover)
auto_failover
;;
*)
echo “用法: $0 {check|failover}”
;;
esac

# 解决方案2:数据一致性验证脚本
#!/bin/bash
# data_consistency_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

PRIMARY_DB=”fgedu@primary-db”
STANDBY_DB=”fgedu@standby-db”
LOG_FILE=/GoldenGate/app/logs/consistency.log

check_table_count() {
local table=$1

primary_count=$(sqlplus -s $PRIMARY_DB <

Part05-风哥经验总结与分享

5.1 高可用最佳实践

根据多年高可用架构实施经验,总结以下最佳实践:

高可用最佳实践:

  • 设计要简洁,避免过度复杂
  • 定期演练,确保切换流程有效
  • 监控要全面,及时发现问题
  • 文档要完善,便于操作执行
  • 团队要培训,确保人员能力
# 最佳实践1:架构设计
– 选择合适的架构模式
– 避免过度设计
– 考虑成本效益
– 预留扩展空间

# 最佳实践2:切换演练
– 定期进行切换演练
– 记录演练过程和问题
– 持续优化切换流程
– 确保人员熟练操作

# 最佳实践3:监控告警
– 建立完善的监控体系
– 设置合理的告警阈值
– 确保告警及时送达
– 建立快速响应机制

# 最佳实践4:文档管理
– 完善架构设计文档
– 详细记录配置信息
– 编写操作手册
– 及时更新文档

5.2 高可用检查清单

# 架构检查清单
[ ] 消除所有单点故障
[ ] 配置冗余组件
[ ] 设计合理的切换流程
[ ] 建立完善的监控体系
[ ] 制定详细的应急预案

# 配置检查清单
[ ] OGG进程配置正确
[ ] 检查点配置正确
[ ] Trail文件路径正确
[ ] 网络配置正确
[ ] 存储配置正确

# 运维检查清单
[ ] 每日检查同步状态
[ ] 每周检查存储空间
[ ] 每月进行切换演练
[ ] 每季度进行灾备演练
[ ] 每年进行架构评审

5.3 风哥实战经验总结

在多年高可用架构实施过程中,总结以下实战经验:

风哥实战经验:

  • 高可用是投资,不是成本
  • 演练比设计更重要
  • 监控是高可用的基础
  • 文档是运维的保障
  • 团队是成功的关键
# 经验1:架构选择
– 根据业务需求选择
– 考虑成本效益
– 预留扩展空间

# 经验2:实施要点
– 分阶段实施
– 充分测试验证
– 完善文档记录

# 经验3:运维要点
– 定期演练
– 持续优化
– 团队培训

风哥提示:高可用架构是一项系统工程,需要从架构设计、配置实施、监控运维、应急响应等多个方面综合考虑,确保系统的高可用性。

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

联系我们

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

微信号:itpux-com

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