0471-Oracle Goldengate实时复制Oracle数据到CDH Kafka
sinye56 2024-10-12 10:53 6 浏览 0 评论
作者:Thomas Gu
1 Oracle Goldengate概述
Oracle Goldengate(以下简称OGG)是业界广泛使用的准实时数据复制软件,主要基于数据库日志进行变更数据的抽取,也就是我们常说的CDC(change data capture)的能力,Goldengate的优势主要体现支持各种异构环境下的数据复制,对生产库的影响最低(基于日志读取,非Sqoop这样直接查询数据的方式,同时可以支持remote capture)。
OGG的架构图如下:
1.1兼容性列表
Goldengate能够支持源端数据抽取和目标数据投递的种类和平台非常的多,几乎涵盖了目前主流的各种数据平台。
源端
Oracle\MySQL\Mariadb\SQLServer\Sybase\DB2(LUW/i-Series/zOS)\JMS\Nonstop SQLMX\Informix等
目标端
除了上述之外,还可以支持Hadoop\File\Teradata\ MongoDB\Elasticsearch\Greenplum\Netezza\Cassandra等
云端
除了支持Oracle Cloud之外,还支持Amazon RDS、Amazon Kinessis、Amazon S3上的相关数据库和大数据的远程抽取和投递;
后续版本
支持PostgreSQL的抽取;
支持Kudu的投递;
可以通过Oracle的官网链接来查询兼容性列表情况:
OGG 18C:https://www.oracle.com/technetwork/middleware/data-integration/goldengate-12-3-x-cert-matrix-3424388.xls
OGG 12.3: https://www.oracle.com/technetwork/middleware/ogg-18-1-0-0-0-cert-matrix-5172014.xls
因为OGG 18c版本最近刚发布,从兼容性列表来看,还没有发布支持Hadoop平台的For Bigdata版本,所以本文选择源端用OGG 18c版进行Oracle数据库数据的抽取,而目标用OGG 12.3 for Bigdata投递到CDH 5.14中。
OGG 18c兼容性列表中支持Oracle的版本:
OGG 12.3 For Bigdata支持CDH的版本:
可以支持向HDFS、Hive、HBase、Flume、Kafka进行复制,做为系列文章的第一篇,我们首先选择向Kafka进行复制。
1.2下载介质
OGG下载链接:
https://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html
源:
目标:
2
配置Oracle Goldengate
下面就开始Oracle Goldengate实现Oracle11204向CDH5.14 Kafka的数据复制链路
2.1环境信息
源端
目标
数据库版本
Oracle11.2.0.4
CDH 5.14 (Apache 0.10.2)
操作系统
CentOS 7.4 6 4bit
CentOS 7.4 64bit
OGG版本
18.1
12.3.2.1
2.2源端配置
1.数据库前提条件:
- 调整数据库参数
alter system set enable_goldengate_replication=true scope=both;
- 开启数据库附加日志和force logging
alter database add supplemental log data; alter database force logging;
设置后,查询数据库最小附加日志已经打开:
- 启用归档(测试环境可以不用,生产环境建议启用)
- 创建用户
需要在Oracle数据中创建一个Goldengate,用于保存OGG的元数据信息,建议为该用户配置独立的数据表空间;同时该用户的权限请参考链接:
https://docs.oracle.com/en/middleware/goldengate/core/18.1/oracle-db/establishing-oracle-goldengate-credentials.html#GUID-8207BAB7-A2AB-46CE-B7B5-14E75B0FDDEB
这里我们简化,直接授权DBA角色给该用户:
- 执行dbms_goldengate_auth.grant_admin_privilege
BEGIN dbms_goldengate_auth.grant_admin_privilege(grantee => 'oggadmin', privilege_type => 'CAPTURE',grant_select_privileges => TRUE,do_grants => TRUE); END; /
- 配置数据库stream pool
OGG对oracle数据库的抽取模式有2种:classic模式和Integrated模式。从OGG 18c开始classic模式不再有新的发展,从支持层面Integrated模式比classic模式支持的对象类型更广,限制更少,同时可以支持部署远程抽取模式,所以我们后面用配置的是Integrated模式。
而Integrated模式是直接对接logmining server来获取数据的变化,是通过XStream接口接入的:
所以要配置数据库的stream pool size,如果不指定stream_pool_size的大小,默认是Oracle自动在SGA中分配的:
这里只有32M,在后续配置Integrated模式中在OGG抽取参数需要配置max_sga_size参数(如果不配置,默认是1GB)的值一个不注意就会有冲突,这里可以先调整streams_pool_size=512M,而可以设置max_sga_size为200MB,具体如何调整,这个我们后续的文章会解释。
2.源端OGG安装
可以支持GUI和静默安装,我们这里使用静默安装。
- 解压
- 配置oggcore.rsp文件
修改其中几个参数:
INSTALL_OPTION=ORA11g SOFTWARE_LOCATION=/home/oracle/ogghome INVENTORY_LOCATION=/home/oracle/ogghome/inventory UNIX_GROUP_NAME=oinstall
- 开始静默安装
注意:ogg的安装目录必须为空,所以创建一个新的目录:/home/oracle/ogghome
运行安装:
./runInstaller -silent -responseFile /home/oracle/oggsoftware/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp
- 配置环境变量
Linux下设置:
- 创建ogg相关目录
3.配置源端MGR进程
PORT 7809 DYNAMICPORTLIST 7810-7849 PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3 LAGREPORTHOURS 1 LAGINFOMINUTES 30 LAGCRITICALMINUTES 45
启动MGR进程:
4.配置credentialstore,使得用户的密码不是明文
add credentialstore alter credentialstore add user oggadmin password oracle alias oggadmin info credentialstore
5.配置源端抽取和传输进程(Integrated模式)
- 查询源端数据库字符集(该步骤可选)
查询一下oracle字符集:
- 增加要复制对象的附件日志
检查一下表的trandata是否enable:
- 编辑源端抽取进程参数文件
extract exta useridalias oggadmin setenv (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1) setenv (ORACLE_SID = testdb1) setenv (NLS_LANG = AMERICAN_AMERICA.AL32UTF8) exttrail ./dirdat/st discardfile ./dirrpt/exta.dsc,APPEND,MEGABYTES 100 tranlogoptions integratedparams (max_sga_size 200, parallelism 1) reportcount every 1 minutes, rate logallsupcols ddl include mapped #这里启用ddl抽取,范围是mapped TABLE scott.*;
- 编辑源端传输进程参数文件
extract dpa rmthost allinone.thomasgu.com mgrport 7809 rmttrail ./dirdat/rt passthru reportcount every 1 minutes, rate table scott.*
Note:提前在/etc/hosts中配置好目标主机名的解析,或者直接用目标主机的ip也可以。
- 创建抽取进程和传输进程
dblogin useridalias oggadmin register extract exta database add extract exta, integrated tranlog, begin now add exttrail ./dirdat/st, extract exta, megabytes 100 add extract dpa, exttrailsource ./dirdat/st add rmttrial ./dirdat/rt, extract dpa, megabytes 100
- 启动源端抽取进程exta
检查状态,发现exta进程启动后,会stop掉
检查一下为什么会stop:
执行一下
GGSCI>view report exta
因为源库是11204版,没有打过任何的patch,所以这里需要apply一下p17030189_112040_Generic的patch
unzip p17030189_112040_Generic.zip /u01/app/oracle/product/11.2.0/dbhome_1/OPatch/opatch lsinventory cd 17030189 /u01/app/oracle/product/11.2.0/dbhome_1/OPatch/opatch apply /u01/app/oracle/product/11.2.0/dbhome_1/OPatch/opatch lsinventory
数据库中还需要运行:
$ sqlplus /nolog SQL> CONNECT / AS SYSDBA SQL> @?/sqlpatch/17030189/postinstall.sql
此时再启动抽取进程:
- 启动源端传输进程
直接在GGSCI中执行: GGSCI>start DPA Note:要先保证目标OGG的MGR进程启动好之后,源端的传输进程才能运行正常,否则状态会stop,看report记录会提示连接不上目标的collector进程。
2.3目标端配置
运行OGG For Bigdata需要JDK1.8的环境。
因为CDH 5.14安装默认使用了JDK1.7的包,所以我们部署采用了remote delivery的方式向Kafka进行投递,将OGG for Bigdata也安装在了Oracle所在的这台机器上,这样对CDH集群也是无侵入的,在生产环境这样的方式应该是更加合适的。
也就说现在OGG For Bigdata和OGG for Oracle安装在了同一台机器上。
所以这里需要注意:
(1)前面配置传输进程dpa就不用启动了,因为用不到了,目标OGG for bigdata进程直接读取OGG for oracle的抽取进程落地下来的队列文件(st作为前缀的文件);
(2)OGG for bigdata的MGR进程就不能使用和OGG for Oracle相同的端口号了,因为一台主机上是不能启动两个同样port的MGR的。
(3)正常情况,如果OGG for oracle和OGG for Bigdata不在同一台主机上,就按照前面配置的方式,目标MGR进程和源端MGR进程配置相同的port,dpa进程rmthost参数连接目标同样的MGR端口即可。
1.目标端安装JDK 1.8
vi /etc/profile export JAVA_HOME=/usr/java/jdk1.8.0_162 export JRE_HOME=/usr/java/jdk1.8.0_162/jre export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
2.配置OGG For Bigdata
- 解压OGG for bigdata到一个新的目录oggbigdatahome
unzip OGG_BigData_Linux_x64_12.3.2.1.1.zip -d oggbigdatahome cd oggbigdatahome tar xvf OGG_BigData_Linux_x64_12.3.2.1.1.tar
- 指定环境变量
执行for bigdata的ggsci的时候,会提示libjvm.so加载错误。
所以需要把libjvm.so文件也加入到环境变量LD_LIBRARY_PATH中,libjvm.so是在:
/usr/java/jdk1.8.0_162/jre/lib/amd64/server/目录下
然后再次执行ggsci:
- 创建OGG for bigdata相关目录
- 创建OGG for bigdata的MGR进程(注意前面的注意说明,因为把OGG for Bigdata和OGG for Oracle安装在同一台主机上,这里用了和源端MGR不一样的port)
PORT 8809 DYNAMICPORTLIST 8810-8849 PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3 LAGREPORTHOURS 1 LAGINFOMINUTES 30 LAGCRITICALMINUTES 45
启动MGR进程
- 准备目标投递到Kafka的进程的相关文件
从OGG for Bigdata目录可以看出有两种Kafka的投递方法:
我们使用kafka这种方式,kafka_connect下一篇文章介绍:
在/home/oracle/oggbidatahome/dirprm下编辑上面的3个文件:
具体参数的含义可以查询OGG for Bigdata官方手册,这里只修改了几个必要的参数。
(1) rkafka.prm
(2) kafka.props
(3)custome_kafka_producer.properties
- 复制cdh中的kafka jar文件到OGG for bigdata中定义的目录下
只需要一个jar包即可:kafka-clients-0.10.2-kafka-2.2.0.jar
- 创建CDH kafka中的topic
/opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic oggtopic1
这里设置2个partition是为了后面一些参数校验。
- 创建目标端投递进程
add replicat rkafka, exttrail /home/oracle/ogghome/dirdat/st 注意:这里是读取的ogg for oracle的抽取进程落地的队列文件st,原因已经解释多次了。
到这里就完成源和目标的OGG配置,下面我们简单测试一下复制链路是否正常。
2.4验证复制情况
源端提交一些sql语句,看是否能够复制到kafka topic中:
conn scott/oracle insert into dept values(1,'A','SH'); insert into dept values(2,'B','SH'); insert into dept values(3,'C','SH'); insert into dept values(4,'D','SH'); insert into dept values(5,'E','SH'); insert into dept values(6,'F','SH'); insert into dept values(7,'G','SH'); insert into dept values(8,'H','SH'); insert into dept values(9,'I','SH'); insert into dept values(11,'J','SH'); commit;
- 检查Kafka中消费端:
往后面拉一点:
上面是一个小的JAVA文件,用于监控消费端的信息,可以看到,已经消费到了10条消息,且按照partition基本是均匀分配的。在OGG for bigdata中有很多参数可以控制kafka分发消息的规则,后续文章我们也会简单介绍一下。
- 从cloudera manager中检查
测试集群只启动了zookeeper和kafka:
当前kafka的版本:
Kafka的oggtopic1是有消息投递过来的:
- 从OGG for Bigdata检查复制情况
明显有10条insert操作提交到kafka
3
总结
通过配置OGG for Oracle和OGG for bigdata,完成基于日志抽取方式将数据变更从Oracle复制到CDH Kafka,可以解决直接通过sqoop类似直接读取数据的手段对源库性能开销的问题,同时是准实时的抽取,延迟低,复制效率高。
后续我们会介绍如何使用OGG完成全量数据抽取到Kafka,以及相关参数配置,实现不同的partition分发策略,kerberos环境下的复制;以及到Hbase、Hive等的复制。
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)