GoldenGate教程FG061-OGG高可用架构设计与双活数据中心实战
本文档风哥主要介绍Oracle GoldenGate高可用架构设计与双活数据中心实战方法,包括高可用概念、双活架构模式、关键组件、配置方法、故障切换等内容,风哥教程参考GoldenGate官方文档高可用架构、容灾设计等内容,适合需要设计和实施OGG高可用架构的架构师和运维人员参考。
Part01-基础概念与理论知识
1.1 OGG高可用架构概念
OGG高可用架构是指通过架构设计确保数据同步服务的连续性和可靠性,在单点故障发生时能够快速切换,保障业务连续性。更多视频教程www.fgedu.net.cn
- 消除单点故障
- 实现快速故障切换
- 保障数据零丢失
- 支持业务连续性
- 满足合规要求
# 第一层:进程级高可用
目标:单个进程故障自动恢复
实现方式:
– 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高可用架构涉及多个关键组件:
功能:确保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:监控告警
功能:及时发现和处理故障
实现方式:
– 进程监控
– 延迟监控
– 自动告警
– 自动切换
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分钟 |
Part03-生产环境项目实施方案
3.1 OGG高可用配置实战
3.1.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 进程自动重启配置
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 双向同步配置
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 冲突处理配置
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 故障切换实战演练
#!/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. 配置仲裁机制
— 使用第三方仲裁服务器
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 高可用解决方案
#!/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 < 根据多年高可用架构实施经验,总结以下最佳实践: # 最佳实践2:切换演练 # 最佳实践3:监控告警 # 最佳实践4:文档管理 # 配置检查清单 # 运维检查清单 在多年高可用架构实施过程中,总结以下实战经验: # 经验2:实施要点 # 经验3:运维要点 本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.htmlPart05-风哥经验总结与分享
5.1 高可用最佳实践
– 选择合适的架构模式
– 避免过度设计
– 考虑成本效益
– 预留扩展空间
– 定期进行切换演练
– 记录演练过程和问题
– 持续优化切换流程
– 确保人员熟练操作
– 建立完善的监控体系
– 设置合理的告警阈值
– 确保告警及时送达
– 建立快速响应机制
– 完善架构设计文档
– 详细记录配置信息
– 编写操作手册
– 及时更新文档
5.2 高可用检查清单
[ ] 消除所有单点故障
[ ] 配置冗余组件
[ ] 设计合理的切换流程
[ ] 建立完善的监控体系
[ ] 制定详细的应急预案
[ ] OGG进程配置正确
[ ] 检查点配置正确
[ ] Trail文件路径正确
[ ] 网络配置正确
[ ] 存储配置正确
[ ] 每日检查同步状态
[ ] 每周检查存储空间
[ ] 每月进行切换演练
[ ] 每季度进行灾备演练
[ ] 每年进行架构评审
5.3 风哥实战经验总结
– 根据业务需求选择
– 考虑成本效益
– 预留扩展空间
– 分阶段实施
– 充分测试验证
– 完善文档记录
– 定期演练
– 持续优化
– 团队培训
