肖杰 数据和云

墨墨导读:本文来自墨天轮用户 肖杰 的投稿,介绍用OGG实现Oracle到Kafka到Greenplum的增量数据同步的全过程。

墨天轮主页:https://www.modb.pro/u/6722


背景


在大数据库时代,数据经常需要在不同的数据库之间流动、整合,并要求具有一定的实时性,传统的通过脚本定时,批量同步的方式根本无法满足需求。


本文基于Oracle OGG,Kafka消息队列实现Oracle到Greenplum之间的准实时同步(实测延时在ms级别)。


一、环境准备

版本OGG版本IP
源端oracle 12.2.0.1123012_fbo_ggs_Linux_x64_shiphome.zip192.168.11.151




目标端kafka 2.12OGG_BigData_Linux_x64_12.3.2.1.1.zip192.168.11.165/4/3


二、ORACLE,GREENPLUM,OGG安装


此过程所用方法比较通用,此处不再赘述。


三、源库配置


源库需要开启归档,配置ogg用户,表空间及相关参数等,此处不再详细赘述


四、源端OGG配置


1. 进程配置
mgr.prm

PORT 7809


extn.prm

extract extnuserid C##GGADMIN@ora12c,password GGadmin_123DISCARDFILE ./dirrpt/extn.dsc, APPEND, MEGABYTES 1024EXTTRAIL  ./dirdat/naGETUPDATEBEFORESNOCOMPRESSUPDATESNOCOMPRESSDELETESDYNAMICRESOLUTION--源库是一个CDB,本次测试抽取pdb_test下面的两张表table pdb_test.test.ccps_traderecord;table pdb_test.test.ccps_unnormal_traderecord;


dpen.prm

extract dpenRMTHOST 192.168.11.165, MGRPORT 7809RMTTRAIL ./dirdat/naDYNAMICRESOLUTIONTABLE pdb_test.test.*;


2. 创建进程

add extract extn, TRANLOG, BEGIN NOWadd exttrail ./dirdat/na, EXTRACT extn, MEGABYTES 200
ADD EXTRACT dpen, EXTTRAILSOURCE ./dirdat/naADD RMTTRAIL ./dirdat/na, EXTRACT dpen, MEGABYTES 200


五、目标端OGG配置


1. 配置JDBC Hander参数


示例目录下面有配置模板,复制过来即可
cp /home/oracle/ogg/AdapterExamples/big-data/kafka/* /home/oracle/ogg/dirprm

custom_kafka_producer.properties:


bootstrap.servers=localhost:9092acks=1reconnect.backoff.ms=1000
value.serializer=org.apache.kafka.common.serialization.ByteArraySerializerkey.serializer=org.apache.kafka.common.serialization.ByteArraySerializer# 100KB per partitionbatch.size=16384linger.ms=0max.request.size = 5024000send.buffer.bytes = 5024000


kafka.props

gg.handlerlist = kafkahandlergg.handler.kafkahandler.type=kafkagg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties#The following resolves the topic name using the short table namegg.handler.kafkahandler.topicMappingTemplate=oggtopic#The following selects the message key using the concatenated primary keys#gg.handler.kafkahandler.keyMappingTemplate=${primaryKeys}gg.handler.kafkahandler.format=jsongg.handler.kafkahandler.SchemaTopicName=mySchemaTopicgg.handler.kafkahandler.BlockingSend =falsegg.handler.kafkahandler.includeTokens=falsegg.handler.kafkahandler.mode=tx
goldengate.userexit.writers=javawriterjavawriter.stats.display=TRUEjavawriter.stats.full=TRUE
gg.log=log4jgg.log.level=INFO
gg.report.time=30sec
#Sample gg.classpath for Apache Kafkagg.classpath=dirprm/:/home/oracle/kafka/libs/*#Sample gg.classpath for HDP#gg.classpath=/etc/kafka/conf:/usr/hdp/current/kafka-broker/libs/*
javawriter.bootoptions=-Xmx512m -Xms512m -Djava.class.path=ggjava/ggjava.jar


2. 进程配置


mgr.prm

port 7809


repn.prm

replicat repngetenv(JAVA_HOME)getenv(CLASSPATH)getenv(PATH)getenv(LD_LIBRARY_PATH)SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")TARGETDB LIBFILE libggjava.so SET property=./dirprm/kafka.propsSOURCEDEFS /home/oracle/ogg/dirdef/source.defREPORTCOUNT EVERY 1 MINUTES, RATE--GROUPTRANSOPS 10000MAP pdb_test.test.ccps_traderecord, TARGET ccps.ccps_traderecord;MAP pdb_test.test.ccps_unnormal_traderecord, TARGET ccps.ccps_unnormal_traderecord;


3. 创建进程


add replicat repn, exttrail ./dirdat/na


六、目标端kafka安装配置


1. 安装


解压即可(此版本kafka本身已经集成zookeeper,不需要单独安装。)


2. 配置


因为是测试环境,此处列出的都是一些关键性参数,至于其他性能相关参数根据自己需要调整即可。


consumer.properties

bootstrap.servers=localhost:9092


server.properties

listeners=PLAINTEXT://localhost:9092zookeeper.connect=localhost:2181


zookeeper.properties

clientPort=2181


3. 启动zookeeper

[oracle@gpmaster kafka]$ bin/zookeeper-server-start.sh -daemon config/zookeeper.properties[oracle@gpmaster kafka]$ jps18001 Jps2505 QuorumPeerMain


4. 启动kafka

[oracle@gpmaster kafka]$ bin/kafka-server-start.sh config/server.properties [oracle@gpmaster kafka]$ jps18016 Kafka2505 QuorumPeerMain18458 Jps


5. kafka常用命令


显示所有topic(其中oggtopic就是用于此次测试的topic,kafka.props中配置的名字):

[oracle@gpmaster bin]$ kafka-topics.sh --list --zookeeper localhost:2181__consumer_offsetsmySchemaTopicoggtestoggtopictest


生产消息:

[oracle@gpmaster bin]$ kafka-console-producer.sh --broker-list localhost:9092 --topic test>test kafka!!!!>


消费消息:

[oracle@gpmaster bin]$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test     test kafka!!!!


七、编写代码将数据从kafka加载到GP


from kafka import KafkaConsumerimport jsonimport psycopg2import timeimport re
dbconn = psycopg2.connect(dbname = "devin",user = "ccps",password = "xjlove1224",host = "192.168.11.165",port = "5432")
consumer = KafkaConsumer('oggtopic',group_id = "oggtopic",auto_offset_reset='earliest',bootstrap_servers=['localhost:9092'])for msg in consumer:    message = msg.value    mesg = message.decode('utf-8')    msglist = re.findall(r'(.*?}})',mesg)  --切分


代码细节略,需要注意NULL,各种特殊字符以及异常的处理。


八、测试


测试环境,目标端没有做初始化,运行结果如下:


抽取到kafka的数据,json格式:

利用OGG实现Oracle到Kafka到Greenplum的增量数据同步_Jav


python解析后的SQL:


利用OGG实现Oracle到Kafka到Greenplum的增量数据同步_Jav_02

在GP数据库验证结果(测试数据及DML较多,随机抽了一条验证):

利用OGG实现Oracle到Kafka到Greenplum的增量数据同步_Jav_03

至此,数据同步成功。


作者


肖杰:云和恩墨Oracle技术顾问,长期服务于银行,金融,能源等行业的数据中心,8年数据库运维经验,擅长Oracle,PostgreSQL等数据库高可用设计和运维故障处理,异常恢复,升级迁移,性能优化。


墨天轮原文链接:https://www.modb.pro/db/29348(复制到浏览器中打开或者点击“阅读原文”立即查看)。