oracle 資料透過goldengate 實時同步到kafka訊息佇列中

abin1703發表於2020-03-28

背景

在大資料時代,存在大量基於資料的業務。資料需要在不同的系統之間流動、整合。通常,核心業務系統的資料存在OLTP資料庫系統中,其它業務系統需要獲取OLTP系統中的資料。傳統的數倉透過批次資料同步的方式,定期從OLTP系統中抽取資料。但是隨著業務需求的升級,批次同步無論從實時性,還是對線上OLTP系統的抽取壓力,都無法滿足要求。需要實時從OLTP系統中獲取資料變更,實時同步到下游業務系統。

              本次是基於Oracle OGG,介紹一種將Oracle資料庫的資料實時同步到Kafka訊息佇列的方法。

              Kafka 是一種高效的訊息佇列實現,透過訂閱kafka的訊息佇列,下游系統可以實時獲取線上Oracle系統的資料變更情況,實現業務系統。

 

環境介紹

元件版本

元件

版本

描述

源端oracle

oracle 11.2.0.4 for linux x64

源端oracle

源端ogg

oracle ogg 11.2.0.1.20 for oracle   linux x64

源端ogg,用於抽取源端oracle的資料變更,並將變更日誌傳送目標端

目標端kafka

kafka_2.11-0.11.0.2 for linux x64

訊息佇列,接收目標端ogg推送過來的資料

目標端ogg


目標端ogg,接收源端傳送的oracle事物變更日誌,並將變更推送到kafka訊息佇列中

 

整體架構圖

 

 

名詞解釋

1.OGG Manager

              OGG Manager 用於配置和管理其它 OGG 元件,配置資料抽取、資料推送、資料複製,啟動和停止相關元件,檢視相關元件的執行情況。

2. 資料抽取( Extract

抽取源端資料庫的變更( DML, DDL )。資料抽取主要分如下幾種型別:本地抽取從本地資料庫捕獲增量變更資料,寫入到本地 Trail 檔案資料推送( Data Pump )從本地 Trail 檔案讀取資料,推送到目標端。初始資料抽取從資料庫表中匯出全量資料,用於初次資料載入

3. 資料推送( Data Pump

              Data Pump 是一種特殊的資料抽取( Extract )型別,從本地 Trail 檔案中讀取資料,並透過網路將資料傳送到目標端 OGG

4.Trail 檔案

              資料抽取從源端資料庫抓取到的事物變更資訊會寫入到 Trail 檔案。

5. 資料接收( Collector

資料接收程式執行在目標端機器,用於接收 Data Pump 傳送過來的 Trail 日誌,並將資料寫入到本地 Trail 檔案。

6. 資料複製( Replicat

              資料複製執行在目標端機器,從 Trail 檔案讀取資料變更,並將變更資料應用到目標端資料儲存系統。本案例中,資料複製將資料推送到 kafka 訊息佇列。

7. 檢查點( Checkpoint

              檢查點用於記錄資料庫事物變更。

 

操作步驟

源端Oracle資料庫配置

開啟源端歸檔

SQL> archive log list

Database log mode             Archive Mode

Automatic archival        Enabled

Archive destination              /u01/app/oracle/product/11.2.3/db_1/dbs/arch

Oldest online log sequence     12

Next log sequence to archive   17

Current log sequence          17

 

若為開啟歸檔解決如下:

conn / as sysdba (以DBA身份連線資料庫)

shutdown immediate (立即關閉資料庫)

startup mount (啟動例項並載入資料庫,但不開啟)

alter database archivelog; (更改資料庫為歸檔模式)

alter database open; (開啟資料庫)

alter system archive log start; (啟用自動歸檔)

 

 

2) OGG 基於輔助日誌等進行實時傳輸,故需要開啟相關日誌確保可獲取事務內容,透過下面的命令檢視該狀態

 

SQL> select force_logging, supplemental_log_data_min, supplemental_log_data_all from v$database;

 

FORCE_LOGG SUPPLEMENTAL_LOG_DATA_MI

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

YES        YES

 

如果沒有開啟輔助日誌,需要開啟

SQL> alter database force logging;

SQL> alter database add supplemental log data;

SQL>alter database add supplemental log data(all) columns;

 

 

3. 開啟 goldengate 複製引數

SQL> alter system set enable_goldengate_replication = true;

 

4. 建立源端 Oracle 賬號

 SQL> create tablespace tbs_ogg datafile '/oradata/dtstack/tbs_ogg.dbf' size 1024M autoextend on;

    SQL> create user ggsadmin identified by oracle default tablespace tbs_ogg;

    SQL> grant dba to ggsadmin;

 

5. 建立測試表   ( 生產略

SQL> create table baiyang.ora_to_kfk as select OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_id < 500;

SQL> alter table baiyang.ora_to_kfk add constraint pk_kfk_obj primary key(object_id);

SQL> select count(*) from baiyang.ora_to_kfk;
    COUNT(*)

    ----------

        436

 

 

 

部署ogg

 

源端 (oracle源端)

 

1、解壓

先建立ogg目錄

 

mkdir -p /ogg

tar xf fbo_ggs_Linux_x64_ora11g_64bit.tar -C /ogg

chown -R oracle:oinstall /ogg (使oracle使用者有ogg的許可權,後面有些需要在oracle使用者下執行才能成功)

 

 

2配置ogg環境變數

為了簡單方便起見,建議在生產中配置 oracle 的環境變數檔案 /home/oracle/.bash_profile 裡配置

export JAVA_HOME=/usr/local/java1.8

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar

export JAVA=$JAVA_HOME/bin/java

export OGG_HOME=/ogg

export PATH=$PATH:$OGG_HOME

export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server:$JAVA_HOME/jre/lib/amd64/libjsig.so:$JAVA_HOME/jre/lib/amd64/server/libjvm.so

 

生效環境變數

source /home/oracle/.bash_profile

 

3、OGG初始化

ggsci

create subdirs

 

ggsci

 

Oracle GoldenGate Command Interpreter for Oracle

Version 11.2.1.0.3 14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258_FBO

Linux, x64, 64bit (optimized), Oracle 11g on Aug 23 2012 20:20:21

Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.

GGSCI (ambari.master.com) 1> create subdirs

 

Creating subdirectories under current directory /root

 

Parameter files                /root/dirprm: created

Report files                   /root/dirrpt: created

Checkpoint files               /root/dirchk: created

Process status files           /root/dirpcs: created

SQL script files               /root/dirsql: created

Database definitions files     /root/dirdef: created

Extract data files             /root/dirdat: created

Temporary files                /root/dirtmp: created

Stdout files                   /root/dirout: created

 

4、 配置源端 Manager

GGSCI (dtproxy) 4> dblogin userid ggsadmin password oracle

GGSCI (dtproxy as ggsadmin@dtstack) 5> edit param ./globals

-- 新增

oggschema ggsadmin

GGSCI (dtproxy as ggsadmin@dtstack) 6> edit param mgr

 ---- 新增

     PORT 7810 --預設監聽埠

        DYNAMICPORTLIST  7811-7820 --動態埠列表

        AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3 --程式有問題,每3分鐘重啟一次,一共重啟五次

        PURGEOLDEXTRACTS ./dirdat/ , USECHECKPOINTS, MINKEEPDAYS 7  --/

        LAGREPORTHOURS 1 --每隔一小時檢查一次傳輸延遲情況

        LAGINFOMINUTES 30 --傳輸延時超過30分鐘將寫入錯誤日誌

        LAGCRITICALMINUTES 45 --傳輸延時超過45分鐘將寫入警告日誌

        PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7 --定期清理trail檔案

        --ACCESSRULE, PROG  , IPADDR 172.. ., ALLOW --設定172網段可連線

 

 

5 、新增同步表級別日誌

 

GGSCI (dtproxy as ggsadmin@dtstack) 9> add trandata baiyang.ora_to_kfk

GGSCI (dtproxy as ggsadmin@dtstack) 10> info trandata baiyang.ora_to_kfk

 

 

 

目標端 (kafka目標端)

 

1、 解壓

mkdir -p /ogg

unzip V839824-01.zip

tar xf ggs_Adapters_Linux_x64.tar  -C /ogg/

 

 

2配置ogg環境變數

為了簡單方便起見,建議在生產中配置 oracle 的環境變數檔案 /home/oracle/.bash_profile 裡配置

export JAVA_HOME=/usr/local/java1.8/jre

export PATH=$JAVA_HOME/bin:$PATH

export LD_LIBRARY_PATH=$JAVA_HOME/lib/amd64/server:$JAVA_HOME/lib/amd64:$LD_LIBRARY_PATH

export OGG_HOME=/ogg

export PATH=$PATH:$OGG_HOME

export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server:$JAVA_HOME/jre/lib/amd64/libjsig.so:$JAVA_HOME/jre/lib/amd64/server/libjvm.so

 

生效環境變數

source /home/oracle/.bash_profile

 

OGG初始化

ggsci

create subdirs

 

ggsci

 

Oracle GoldenGate Command Interpreter for Oracle

Version 11.2.1.0.3 14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258_FBO

Linux, x64, 64bit (optimized), Oracle 11g on Aug 23 2012 20:20:21

Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.

GGSCI (ambari.master.com) 1> create subdirs

 

Creating subdirectories under current directory /root

 

Parameter files                /root/dirprm: created

Report files                   /root/dirrpt: created

Checkpoint files               /root/dirchk: created

Process status files           /root/dirpcs: created

SQL script files               /root/dirsql: created

Database definitions files     /root/dirdef: created

Extract data files             /root/dirdat: created

Temporary files                /root/dirtmp: created

Stdout files                   /root/dirout: created

 

配置源端 Manager

 

GGSCI (dtproxy as ggsadmin@dtstack) 6> edit param mgr

 ---- 新增

     PORT 7810 --預設監聽埠

        DYNAMICPORTLIST  7811-7820 --動態埠列表

        AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3 --程式有問題,每3分鐘重啟一次,一共重啟五次

        PURGEOLDEXTRACTS ./dirdat/ , USECHECKPOINTS, MINKEEPDAYS 7  

        PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7 --定期清理trail檔案

        --ACCESSRULE, PROG  , IPADDR 172.. ., ALLOW --設定172網段可連線

 

GGSCI (172-16-101-242) 4> edit  param  ./GLOBALS

-- 新增

CHECKPOINTTABLE ggsadmin.checkpoint

 

 

全量資料同步(oracle to kafka)

 

1.     配置源端資料初始化

 

1)   配置源端初始化程式

 

 

GGSCI (dtproxy as ggsadmin@dtstack) 15> add extract initkfk,sourceistable

 

 

2)   配置源端初始化引數

 

  GGSCI (dtproxy as ggsadmin@dtstack) 16> edit params initkfk

     EXTRACT initkfk
 SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
 USERID ggsadmin,PASSWORD oracle
 RMTHOST
172.16.101.242 , MGRPORT 7810
 RMTFILE ./dirdat/ek,maxfiles 999, megabytes 500
  table baiyang.ora_to_kfk;

 

 

3 )源端生成表結構 define 檔案

 

GGSCI (dtproxy as ggsadmin@dtstack) 17> edit param define_kfk

        -- 新增

    defsfile  /ogg/dirdef/define_kfk.txt

    userid ggsadmin,password oracle

    table baiyang.ora_to_kfk;

 

 

 4 )獲取 oracle 全量資料

$cd /ogg    

$./defgen paramfile dirprm/define_kfk.prm

    -- Definitions generated for 1 table in /oradata/oggorcl/ogg/dirdef/define_kfk.txt

    

5) 將獲取全量資料記錄傳送到目標端

- 將此檔案傳輸到目標段dirdef資料夾

    scp /ogg/dirdef/define_kfk.txt 172.16.101.242:/ogg/dirdef/define_kfk.txt

 

 

2、 配置目標端資料初始化程式

 

1) 配置目標端初始化程式

 

GGSCI (172-16-101-242) 3> ADD replicat initkfk,specialrun                         

 

2) 配置目標端初始化引數

 

 GGSCI (172-16-101-242) 6> edit params initkfk

     -- 新增

    SPECIALRUN

    end runtime

    setenv(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

    targetdb libfile libggjava.so set property=./dirprm/kafka.props

SOURCEDEFS ./dirdef/define_kfk.txt

REPLACEBADCHAR SKIP

SOURCECHARSET OVERRIDE ISO-8859-1

    EXTFILE ./dirdat/ek

    reportcount every 1 minutes, rate

    grouptransops 10000

map baiyang.ora_to_kfk,target baiyang.ora_to_kfk;

 

 

 

 

3) 配置 ogg 針對 kafka 相關引數

 

 

 

vi ./dirprm/kafka.props

-- 新增

    gg.handlerlist=kafkahandler

gg.handler.kafkahandler.type=kafka

gg.handler.kafkahandler.format.includePrimaryKeys=true

gg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties

gg.handler.kafkahandler.topicName=test_ogg  --舊版引數,本次使用舊版引數

    #gg.handler.kafkahandler.topicMappingTemplate=test_ogg –-新版本引數

    gg.handler.kafkahandler.format=json

    gg.handler.kafkahandler.mode=op

gg.classpath=dirprm/:/kafka/libs/* :/ogg/:/ogg/lib/*

                     kafka 安裝的位置     ogg安裝的位置

./dirprm/kafka.props 檔案複製到 /ogg/AdapterExamples/big-data/kafka 目錄下

 

 

vi ./dirprm/custom_kafka_producer.properties

 

bootstrap.servers= 172.16.101.242:9092  ---kafka地址

    acks=-1

    compression.type=gzip

    reconnect.backoff.ms=1000

    value.serializer=org.apache.kafka.common.serialization.ByteArraySerializer

    key.serializer=org.apache.kafka.common.serialization.ByteArraySerializer

    batch.size=102400  --資料有堆積

    linger.ms=10000    --資料傳輸kafka有延時

 

./dirprm/custom_kafka_producer.properties 檔案複製到 /ogg/AdapterExamples/big-data/kafka

 

 

3、 開啟抽取全量任務

 

源端:

GGSCI (dtproxy) 20>  start mgr

GGSCI (dtproxy) 21>  start initkfk

 

目標端全量資料應用

GGSCI (172-16-101-242) 13> start mgr

cd /ogg

./replicat paramfile ./dirprm/initkfk.prm reportfile ./dirrpt/init01.rpt -p INITIALDATALOAD

 

--檢視應用日誌是否有錯誤

cd /opt/ogg/dirrpt
more init01.rpt

 

 

 

 

4、 驗證 kafka 全量資料

cd /kafka

bin/kafka-console-consumer.sh --bootstrap-server 172.16.101.242:9092 --topic test_ogg --from-beginning

 

 

 

 

{"table":"BAIYANG.ORA_TO_KFK","op_type":"I","op_ts":"2019-11-11 20:23:19.703779","current_ts":"2019-11-11T20:48:55.946000","pos":"-0000000000000000001","after":{"OWNER":"SYS","OBJECT_NAME":"C_OBJ#","SUBOBJECT_NAME":null,"OBJECT_ID":2,"DATA_OBJECT_ID":2,"OBJECT_TYPE":"CLUSTER"}}

{"table":"BAIYANG.ORA_TO_KFK","op_type":"I","op_ts":"2019-11-11 20:23:19.703779","current_ts":"2019-11-11T20:48:56.289000","pos":"-0000000000000000001","after":{"OWNER":"SYS","OBJECT_NAME":"I_OBJ#","SUBOBJECT_NAME":null,"OBJECT_ID":3,"DATA_OBJECT_ID":3,"OBJECT_TYPE":"INDEX"}}

 

全量資料已經同步到目標 kafka topic test_ogg

 

 

增量資料同步(oracle to kafka)

源端配置

 

1.      源端抽取程式配置

 

GGSCI (dtproxy) 9> edit param extkfk

-- 新增

extract extkfk

dynamicresolution

SETENV (ORACLE_SID = " orcl")

SETENV (NLS_LANG = "american_america.AL32UTF8")

userid ggsadmin,password oracle

FETCHOPTIONS NOUSESNAPSHOT

GETUPDATEBEFORES

NOCOMPRESSDELETES

NOCOMPRESSUPDATES

exttrail ./dirdat/to

table baiyang.ora_to_kfk;

 

 

2、 新增 extract 程式

 

GGSCI (dtproxy) 10> add extract extkfk,tranlog,begin now

GGSCI (dtproxy) 11> add exttrail ./dirdat/to,extract extkfk

 

3、 配置源端推送程式

 

 

 

GGSCI (dtproxy) 12> edit param pupkfk

-- 新增

extract pupkfk

passthru

dynamicresolution

userid ggsadmin,password oracle

rmthost 172.16.101.242 mgrport 7810

rmttrail ./dirdat/to

table baiyang.ora_to_kfk;

 

 

4 、新增投遞程式

 

GGSCI (dtproxy) 13>  add extract pupkfk,exttrailsource ./dirdat/to

GGSCI (dtproxy) 14>  add rmttrail ./dirdat/to,extract pupkfk

 

 

目標端配置

 

1、 配置目標端恢復程式

 

edit param repkfk

-- 新增

REPLICAT repkfk

SOURCEDEFS ./dirdef/define_kfk.txt

targetdb libfile libggjava.so set property=./dirprm/kafka.props

REPORTCOUNT EVERY 1 MINUTES, RATE

GROUPTRANSOPS 10000

MAP baiyang.ora_to_kfk, TARGET baiyang.ora_to_kfk;

 

2、 新增 trail 檔案到 replicate 程式

 

add replicat repkfk exttrail ./dirdat/to,checkpointtable ggsadmin.checkpoint

 

 

開啟增量實時資料抓取

 

源端:

./ggsci

GGSCI (dtproxy) 5> start extkfk

Sending START request to MANAGER ...

EXTRACT EXTKFK starting

GGSCI (dtproxy) 6> start pupkfk

Sending START request to MANAGER ...

EXTRACT PUPKFK starting

GGSCI (dtproxy) 7> status all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING

EXTRACT     RUNNING     EXTKFK      00:00:00      00:00:10

EXTRACT     RUNNING     PUPKFK      00:00:00      00:00:00

 

目標端:

 

/ggsci

GGSCI (172-16-101-242) 7> start replicat repkfk

Sending START request to MANAGER ...

REPLICAT REPKFK starting

GGSCI (172-16-101-242) 8> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING

REPLICAT    RUNNING     REPKFK      00:00:00      00:00:00

 

 

測試增量資料抓取

 

源端:

Oracle插入增量資料


SQL> insert into baiyang.ora_to_kfk  select OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_id >500 and  object_id < 1000;

SQL> commit;

SQL> select count(*) from baiyang.ora_to_kfk;
COUNT(*)


    905

 

目標端:

檢視 Kafka 訊息佇列消費資料

cd /kafka

bin/kafka-console-consumer.sh --bootstrap-server 172.16.101.242:9092 --topic test_ogg

 

{"table":"BAIYANG.ORA_TO_KFK","op_type":"I","op_ts":"2019-11-11 21:04:11.158786","current_ts":"2019-11-11T21:10:54.042000","pos":"00000000000000075298","after":{"OWNER":"SYS","OBJECT_NAME":"APPLY$_READER_STATS","SUBOBJECT_NAME":null,"OBJECT_ID":998,"DATA_OBJECT_ID":998,"OBJECT_TYPE":"TABLE"}}

{"table":"BAIYANG.ORA_TO_KFK","op_type":"I","op_ts":"2019-11-11 21:04:11.158786","current_ts":"2019-11-11T21:10:54.042001","pos":"00000000000000075459","after":{"OWNER":"SYS","OBJECT_NAME":"APPLY$_READER_STATS_I","SUBOBJECT_NAME":null,"OBJECT_ID":999,"DATA_OBJECT_ID":999,"OBJECT_TYPE":"INDEX"}}

 

 

 

DDL 操作

 

              如果 ogg 源端,也就是 oracle 端的表增加欄位或者刪除欄位,或者修改欄位等等,只要是修改表結構定義的,就算是 DDL 操作,在 ogg for bigdata 12.2 穩定版本中,目前是不支援同步 ddl 語句的,在 12,3 版本以後會進行 ddl 支援。

 

12.2 ogg for bigdata 中,源端如果做 ddl ,需要在源端的定義表結構檔案中重新生成 define_kfk.txt 檔案的定義,並將 define_kfk.txt 檔案傳輸到目標端中。

 

 

舉例說明:

 

源端:(oracle端)

 

1) 源表新增id欄位

alter table ORA_TO_KFK add id number;

 

2) ogg 源端需要重新生成表定義檔案

 

mv /ogg/dirdef/define_kfk.txt /ogg/dirdef/define_kfk.txt.bak1

cd /ogg

/defgen paramfile dirprm/define_kfk.prm

 

3) 將生成的表定義檔案scp 到目標端

 

cd /ogg

scp ./dirdef/define_kfk.txt root@192.168.56.57:/ogg/dirdef/

 

4) 源端抽取程式需要重啟

 

  GGSCI (edsir1p9) 2> stop EXTKFK

 

Sending STOP request to EXTRACT EXTKFK ...

Request processed.

 

GGSCI (edsir1p9) 3> start EXTKFK

 

Sending START request to MANAGER ...

EXTRACT EXTKFK starting

 

GGSCI (edsir1p9) 4> info all

 

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

 

MANAGER     RUNNING                                          

EXTRACT     RUNNING     EXTKFK      00:00:00      00:00:08   

EXTRACT     RUNNING     PUPKFK      00:00:00      00:00:07 

 

目標端:(kafka端)

 

1)檢視目標端的應用程式發生了abend

GGSCI (node) 38> info all

 

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

 

MANAGER     RUNNING                                          

REPLICAT    ABENDED     REPKFK      00:10:27      00:05:29

 

2)啟動複製程式

GGSCI (node) 40> start REPKFK

 

Sending START request to MANAGER ...

REPLICAT REPKFK starting

 

GGSCI (node) 9> info all

 

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

 

MANAGER     RUNNING                                          

REPLICAT    RUNNING     REPKFK      00:00:00      00:00:04 

 

測試:

源端插入一條資料

 

SQL> insert into ORA_TO_KFK(OWNER,OBJECT_NAME,OBJECT_ID,ID) values ('gg','gg',876,9);

 

1 row created.

 

SQL> commit;

 

目標端:

cd /kafka

 

bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.57:9092 --topic ogg_test

 

資料已經從源端oracle同步到目標端kafka中。至此oracle新新增一列,可以正常同步到kafka中。


   


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30345407/viewspace-2683027/,如需轉載,請註明出處,否則將追究法律責任。

相關文章