百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

Oracle Goldengate高可用配置(oracle高可用技术)

sinye56 2024-10-11 17:28 5 浏览 0 评论

刘亚辉,现就职于北京海天起点新疆办事处,OGG项目组成员。具有5年以上电信行业系统运维经验,熟悉Oracle数据库、Linux操作系统日常维护工作,擅长于OGG搭建方案的制定、运维优化及故障诊断。

OGG数据实时同步的特点决定了它将被经常使用在对数据实时性要求较高的系统中,所以对于其稳定性以及故障处理时间的要求是很高的。我所在的工作环境中就有几套OGG是在生产环境之间同步业务数据,如果源端进程出现异常,那么将影响所有的目标端数据。有一段时间,由于源端系统OGG版本较低,以及业务数据的复杂性,EXTRACT进程经常ABEND或者宕住,直接影响目标端系统的业务受理。所以,如果源端进程运行不稳定,人工维护工作量还是很高的,需要尽快找出问题并解决。

除了保障自身的稳定性,还要考虑到,其他故障也会影响OGG。简单的说,OGG是通过连接数据库读取事务日志工作的。如果数据库不可用,或者更严重些,OGG所在的主机崩溃了,那么OGG还是会受到影响。那么问题来了,如何实现OGG的高可用?

在Oracle RAC集群中,是通过集群软件统一管理多实例及其他资源的方式实现Oracle数据库的高可用。OGG的高可用原理也与此类似,只不过同时运行的OGG进程只有一套。在当前运行的节点发生故障时,可以自动切换到其他节点

OGG高可用原理

上面已经说到,OGG可以在发生故障时实现自动切换,那么具体的实现方式是什么?

  • 在RAC数据库的每个节点的相同目录下都部署OGG,并且配置相同的进程及参数;

  • 为OGG在集群中配置VIP地址,保证PUMP投递进程与目标主机的正常通信;

  • 将OGG作为资源注册到Oracle集群中,使用集群软件管理OGG;

  • 在发生故障时,可以通过集群的relocate resource功能自动切换到其他节点。

那么问题又来了,OGG在切换后是如何保证数据一致性的呢?假设在发生故障后,进程已经ABEND,如何让其他节点的OGG进程获取到故障节点OGG读取/写入的位置?这就涉及OGG的检查点文件。

大家都知道,通过ggsci命令行的 info <进程名> showch 命令可以查看进程的读检查点及写检查点的位置(以EXTRACT进程为例):

GGSCI(rac2)3>info EXTRACT showch

EXTRACT EXTRACT Last Started2017-04-0901:08Status RUNNING

Current Checkpoint Detail:

Read Checkpoint#1

Oracle Threaded Redo Log

Startup Checkpoint(starting position inthe data source):

Thread#: 1

Sequence#: 55762

RBA:3686956048

Timestamp:2017-04-0823:20:27.000000

SCN:3460.1956090641(14862542934801)

Redo File:+RECOC1/rac/onlinelog/group_10.285.864850395

Recovery Checkpoint(position of oldest unprocessed transaction inthe data source):

Thread#: 1

Sequence#: 59439

RBA:1029172752

Timestamp:2017-05-1711:15:10.000000

SCN:3465.1843266486(14883904947126)

Redo File:NotAvailable

Current Checkpoint(position of last record read inthe data source):

Thread#: 1

Sequence#: 59440

RBA:627996012

Timestamp:2017-05-1711:31:11.000000

SCN:3465.1854259346(14883915939986)

Redo File:NotAvailable

Write Checkpoint#1

GGS Log Trail

Current Checkpoint(current write position):

Sequence#: 28785

RBA:105063747

Timestamp:2017-05-1711:31:14.734831

Extract Trail:./dirdat/LA

Trail Type:EXTTRAIL

读检查点记录了上次启动的位置、下次恢复的位置以及当前读的位置;写检查点记录了当前在TRAIL文件中写的位置。这些信息都记录在dirchk目录的检查点文件中。所以只要让其他进程能够读取到dirchk目录下的检查点文件,即可从下次恢复的位置开始读取日志。

(可以做个小实验,将当前OGG的dirchk目录拷贝到其他测试OGG的目录下,不拷贝参数文件,查看相同进程的检查点信息与原进程是否一致。)

为了让TRAIL文件能够继续被读取/写入,TRAIL文件也要能够被其他节点进程访问到。所以如果划分出一块共享存储,将检查点文件及TRIAL文件放在上面,将OGG软件分别部署在每个节点上,即可实现OGG的高可用性及数据一致性。

OGG HA架构图

图中描述了两端均为RAC双节点的情况,其中:

源端和目标端都通过共享存储访问检查点文件及TRAIL文件;

源端和目标端的VIP地址均可漂移到其他节点;

源端通过目标端的VIP,向目标端传送TRAIL文件,而无需关心实际主机名或地址。

配置OGG HA

1.准备共享存储

Oracle推荐使用ACFS作为OGG的共享存储。

注:ACFS支持的数据库及OS版本可参考Metalink[ID 1369107.1]

2.准备集群及数据库

安装Oracle集群及数据库,并在每个节点的相同目录下,使用同一用户安装OGG。

3.配置检查点路径及TRAIL文件路径

使用Linux的符号链接命令将OGG安装目录下的dirchk及dirdat目录替换成指向共享存储目录的链接。

[oracle@rac1~]$cd/acfs

[oracle@rac1~]$mkdir dirchk dirdat

[oracle@rac1~]$cd$OGG_HOME

[oracle@rac1~]$rm–rf dirchk

[oracle@rac1~]$ln–s/acfs/dirchk dirchk

[oracle@rac1~]$rm–rf dirdat

[oracle@rac1~]$ln–s/acfs/dirdat dirdat

4.创建OGG VIP

注:配置VIP需要11gR2及以上。

1)使用root用户创建VIP

[root@rac1~]# /u01/app/11.2.0/grid/bin/appvipcfg create -network=1 \

>-ip=10.0.0.8\

>-vipname=oggvip\

>-user=root

其中,network为网络号,查看网络号命令:

[root@rac1~]# crsctl stat res -p |grep -ie .network -ie subnet |grep -ie name -ie subnet

NAME=ora.net1.network

USR_ORA_SUBNET=10.0.0.0

net1:表示网络号为1,USR_ORA_SUBNET表示VIP所在的子网范围。

ip:VIP的地址,必须在上面确定的子网范围内。

vipname:指定VIP名称为oggvip。

可以使用以下命令修改VIP的属性:

crsctl modify resource ggs-vip-attr"RESTART_ATTEMPTS=3,START_TIMEOUT=300,STOP_TIMEOUT=300, CHECK_INTERVAL=10"

2)授予管理用户(grid)启动该VIP的权限

$GRID_HOME/bin/crsctl setperm resource oggvip-uuser:grid:r-x

[root@rac1~]# /u01/app/11.2.0/grid/bin/crsctl setperm resource oggvip -u user:grid:r-x

3)以grid用户的身份,启动该 VIP 资源

$GRID_HOME/bin/crsctl start resource oggvip

[grid@rac1~]$/u01/app/11.2.0/grid/bin/crsctl start resource oggvip

CRS-2672:Attempting tostart'oggvip'on'rac2'

CRS-2676:Start of'oggvip'on'rac2'succeeded

4)检查VIP状态

$GRID_HOME/bin/crsctl status resource oggvip

[grid@rac1~]$/u01/app/11.2.0/grid/bin/crsctl status resource oggvip

NAME=oggvip

TYPE=app.appvip.type

TARGET=ONLINE

STATE=ONLINE on rac2

5.创建代理ACTION脚本

Oracle集群通过agent代理运行与资源相关的命令。通过创建代理ACTION脚本,用于后续集群的调用。

该代理脚本接受以下参数值:

start、stop、check、clean 和 abort。

必须将脚本保存在所有节点的相同路径,且以grid用户为属主,并具有执行权限(例如可以放在$GRID_HOME/crs/script/)。

[root@rac1 script]# chown grid:oinstall 11gr2_ogg_action.scr

[root@rac1 script]# chmod 755 11gr2_ogg_action.scr

具体脚本内容:

#!/bin/sh

# When you change the environment(hosts,databases ...etc),change the environment variables below too.

#set the Oracle Goldengate installation directory

export OGG_HOME=/home/ogg/ogg

#set the oracle home to the database to ensure GoldenGate will get the

#right environment settings to be able to connect to the database

export ORACLE_HOME=/u01/app/oracle/product/11.2.0.4/db_1/

#specify delay after start before checking for successful start

start_delay_secs=5

#Include the GoldenGate home in the library path to start GGSCI

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

#check_process validates that a manager process is running at the PID

#that GoldenGate specifies.

check_process(){

if([-f"${OGG_HOME}/dirpcs/MGR.pcm"])

then

pid=`cut-f8"${OGG_HOME}/dirpcs/MGR.pcm"`

if[${pid}=`ps-e|grep${pid}|grep mgr|cut-d" "-f2`]

then

#manager process is running on the PID exit success

exit0

else

if[${pid}=`ps-e|grep${pid}|grep mgr|cut-d" "-f1`]

then

#manager process is running on the PID exit success

exit0

else

#manager process is not running on the PID

exit1

fi

fi

else

#manager is not running because there is no PID file

exit1

fi

}

#call_ggsci is a generic routine that executes a ggsci command

call_ggsci(){

ggsci_command=$1

ggsci_output=`${OGG_HOME}/ggsci<<EOF

${ggsci_command}

exit

EOF`

}

case$1in

'start')

#start manager

call_ggsci'start manager'

#there is a small delay between issuing the start manager command

#and the process being spawned on the OS. wait before checking

sleep${start_delay_secs}

#check whether manager is running and exit accordingly

check_process

;;

'stop')

#attempt a clean stop for all non-manager processes

#call_ggsci 'stop er *'

#ensure everything is stopped

call_ggsci'stop er *!'

#call_ggsci 'kill er *'

#stop manager without (y/n) confirmation

call_ggsci'stop manager!'

#exit success

exit0

;;

'check')

check_process

;;

'clean')

#attempt a clean stop for all non-manager processes

#call_ggsci 'stop er *'

#ensure everything is stopped

#call_ggsci 'stop er *!'

#in case there are lingering processes

call_ggsci'kill er *'

#stop manager without (y/n) confirmation

call_ggsci'stop manager!'

#exit success

exit0

;;

'abort')

#ensure everything is stopped

call_ggsci'stop er *!'

#in case there are lingering processes

call_ggsci'kill er *'

#stop manager without (y/n) confirmation

call_ggsci'stop manager!'

#exit success

exit0

;;

esac

注:从脚本内容可以看出,脚本只启动manager进程,所以务必在manager进程中配置AUTOSTART参数。

6.在集群中注册OGG

以grid用户执行以下命令:

$GRID_HOME/bin/crsctl add resource oggapp-type cluster_resource\

-attr"ACTION_SCRIPT=/u01/app/11.2.0/grid/crs/script/11gr2_ogg_action.scr, \

CHECK_INTERVAL=30, START_DEPENDENCIES='hard(oggvip,ora.asm) \

pullup(oggvip)', STOP_DEPENDENCIES='hard(oggvip)' SCRIPT_TIMEOUT=300"

[grid@rac1 script]# /u01/app/11.2.0/grid/bin/crsctl add resource oggapp -type cluster_resource \

>-attr"ACTION_SCRIPT=/u01/app/11.2.0/grid/crs/script/11gr2_ogg_action.scr, \

> CHECK_INTERVAL=30, START_DEPENDENCIES='hard(oggvip,ora.asm) \

> pullup(oggvip)', STOP_DEPENDENCIES='hard(oggvip)' SCRIPT_TIMEOUT=300"

注:START_DEPENDENCIES:启动oggapp时与oggvip、ora.asm设置为强关联关系;

STOP_DEPENDENCIES:停止oggapp时与oggvip设置为强关联关系。

如果不使用VIP(源端与目标端在同一主机),则以以下方式注册:

$GRID_HOME/bin/crsctl add resource oggapp\

-type cluster_resource\

-attr"ACTION_SCRIPT=/u01/app/11.2.0/grid/crs/script/11gr2_ogg_action.scr, CHECK_INTERVAL=30, START_DEPENDENCIES='hard(ora.asm)' SCRIPT_TIMEOUT=300"

如果需要以其他用户管理,需要授权:

管理权限:

crsctl setperm resource oggapp-o<username>

启动权限:

crsctl setperm resource oggapp-uuser:<username>:r-x

7.启动OGG资源

添加该资源后,使用 crsctl集群命令启动 Oracle GoldenGate。以 grid用户登录,启动命令:

$GRID_HOME/bin/crsctl start resource oggapp

1)启动资源前,先确认ogg进程均已stop:

[oracle@rac2 ogg]$./ggsci

Oracle GoldenGate Command Interpreter forOracle

Version12.2.0.1.1OGGCORE_12.2.0.1.0_PLATFORMS_151211.1401_FBO

Linux,x64,64bit(optimized),Oracle11gon Dec12201500:54:38

Operating system character set identified asUTF-8.

Copyright(C)1995,2015,Oracle and/orits affiliates.All rights reserved.

GGSCI(rac2)1>info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER STOPPED

EXTRACT STOPPED EXT0100:00:0000:01:01

REPLICAT STOPPED REP0100:00:0000:01:37

2)启动资源:

[grid@rac2~]$crsctl start resource oggapp

CRS-2672:Attempting tostart'oggapp'on'rac2'

CRS-2676:Start of'oggapp'on'rac2'succeeded

3)再次查看ogg进程状态:

GGSCI(rac2)1>info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING

EXTRACT RUNNING EXT0100:01:0300:00:06

REPLICAT RUNNING REP0100:01:4500:00:03

4)检查app状态,输入以下命令:

$GRID_HOME/bin/crsctl status resource oggapp

[grid@rac2~]$crsctl status resource oggapp

NAME=oggapp

TYPE=cluster_resource

TARGET=ONLINE

STATE=ONLINE on rac2

8.管理OGG资源

要手工切换OGG到其他节点上,可使用带 force 选项的relocate resource命令。可以在集群中任何节点上以grid用户身份运行此命令。

1)执行前查看资源目前运行的节点:

[grid@rac2~]$crsctl status resource oggapp

NAME=oggapp

TYPE=cluster_resource

TARGET=ONLINE

STATE=ONLINE on rac2

2)执行relocate操作:

[root@rac2~]# crsctl relocate resource oggapp -f

CRS-2673:Attempting tostop'oggapp'on'rac2'

CRS-2677:Stop of'oggapp'on'rac2'succeeded

CRS-2673:Attempting tostop'oggvip'on'rac2'

CRS-2677:Stop of'oggvip'on'rac2'succeeded

CRS-2672:Attempting tostart'oggvip'on'rac1'

CRS-2676:Start of'oggvip'on'rac1'succeeded

CRS-2672:Attempting tostart'oggapp'on'rac1'

CRS-2676:Start of'oggapp'on'rac1'succeeded

3)在节点1查看ogg状态:

GGSCI(rac1)2>!

info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING

EXTRACT RUNNING EXT0100:01:1500:00:09

REPLICAT RUNNING REP0100:02:1100:00:02

4)通过crsctl查看集群资源也可以看到:

[grid@rac1~]$crsctl stat res-t

-----------------------------------------------------------------------

NAME TARGET STATE SERVER STATE_DETAILS

-----------------------------------------------------------------------

Cluster Resources

-----------------------------------------------------------------------

oggapp

1ONLINE ONLINE rac1

oggvip

1ONLINE ONLINE rac1

故障模拟测试案例

数据库主机宕机

查看OGG运行状态:

[grid@rac1~]$crsctl status resource oggapp

NAME=oggapp

TYPE=cluster_resource

TARGET=ONLINE

STATE=ONLINE on rac1

OGG在1节点运行,模拟1节点宕机(关闭1节点主机),查看oggapp状态:

[root@rac2~]# crsctl status resource oggapp

NAME=oggapp

TYPE=cluster_resource

TARGET=ONLINE

STATE=ONLINE on rac2

发现已经自动relocate至2节点。进入ggsci命令行查看进程状态:

GGSCI(rac2)1>info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING

EXTRACT RUNNING EXT0100:00:1500:00:04

REPLICAT RUNNING REP0100:00:2100:00:01

进程已经正常启动。

相关推荐

Linux基础知识之修改root用户密码

现象:Linux修改密码出现:Authenticationtokenmanipulationerror。故障解决办法:进入单用户,执行pwconv,再执行passwdroot。...

Linux如何修改远程访问端口

对于Linux服务器而言,其默认的远程访问端口为22。但是,出于安全方面的考虑,一般都会修改该端口。下面我来简答介绍一下如何修改Linux服务器默认的远程访问端口。对于默认端口而言,其相关的配置位于/...

如何批量更改文件的权限

如果你发觉一个目录结构下的大量文件权限(读、写、可执行)很乱时,可以执行以下两个命令批量修正:批量修改文件夹的权限chmod755-Rdir_name批量修改文件的权限finddir_nam...

CentOS「linux」学习笔记10:修改文件和目录权限

?linux基础操作:主要介绍了修改文件和目录的权限及chown和chgrp高级用法6.chmod修改权限1:字母方式[修改文件或目录的权限]u代表所属者,g代表所属组,o代表其他组的用户,a代表所有...

Linux下更改串口的权限

问题描述我在Ubuntu中使用ArduinoIDE,并且遇到串口问题。它过去一直有效,但由于可能不必要的原因,我觉得有必要将一些文件的所有权从root所有权更改为我的用户所有权。...

Linux chown命令:修改文件和目录的所有者和所属组

chown命令,可以认为是"changeowner"的缩写,主要用于修改文件(或目录)的所有者,除此之外,这个命令也可以修改文件(或目录)的所属组。当只需要修改所有者时,可使用...

chmod修改文件夹及子目录权限的方法

chmod修改文件夹及子目录权限的方法打开终端进入你需要修改的目录然后执行下面这条命令chmod777*-R全部子目录及文件权限改为777查看linux文件的权限:ls-l文件名称查看li...

Android 修改隐藏设置项权限

在Android系统中,修改某些隐藏设置项或权限通常涉及到系统级别的操作,尤其是针对非标准的、未在常规用户界面显示的高级选项。这些隐藏设置往往与隐私保护、安全相关的特殊功能有关,或者涉及开发者选项、权...

完蛋了!我不小心把Linux所有的文件权限修改了!在线等修复!

最近一个客户在群里说他一不小心把某台业务服务器的根目录权限给改了,本来想修改当前目录,结果执行成了根目录。...

linux改变安全性设置-改变所属关系

CentOS7.3学习笔记总结(五十八)-改变安全性设置-改变所属关系在以前的文章里,我介绍过linux文件权限,感兴趣的朋友可以关注我,阅读一下这篇文章。这里我们不在做过的介绍,注重介绍改变文件或者...

Python基础到实战一飞冲天(一)--linux基础(七)修改权限chmod

#07_Python基础到实战一飞冲天(一)--linux基础(七)--修改权限chmod-root-groupadd-groupdel-chgrp-username-passwd...

linux更改用户权限为root权限方法大全

背景在使用linux系统时,经常会遇到需要修改用户权限为root权限。通过修改用户所属群组groupid为root,此操作只能使普通用户实现享有部分root权限,普通用户仍不能像root用户一样享有超...

怎么用ip命令在linux中添加路由表项?

在Linux中添加路由表项,可以使用ip命令的route子命令。添加路由表项的基本语法如下:sudoiprouteadd<network>via<gateway>这...

Linux配置网络

1、网卡名配置相关文件回到顶部网卡名命名规则文件:/etc/udev/rules.d/70-persistent-net.rules#PCIdevice0x8086:0x100f(e1000)...

Linux系列---网络配置文件

1.网卡配置文件在/etc/sysconfig/network-scripts/下:[root@oldboynetwork-scripts]#ls/etc/sysconfig/network-s...

取消回复欢迎 发表评论: