GoldenGate for Java Adapter介紹一(原理篇)

margiex發表於2018-03-25

前言

    Oracle Goldengate在很早前就推出了一個for java的版本,主要目的是方便把關係型資料實時寫入到不支援的目標端,如JMS或Redis等key value資料庫。在Hadoop剛出來的時候,也可以使用ogg for java adapter將資料實時投遞到HDFS等平臺,只是後來專門推出了一個ogg for bigdata版本,可以不用二次開發,即可將資料實時投遞到hbase ,hive, kafka, mongodb等。所以,針對不支援的目標端,還是需要使用ogg for java adapter進行二次開發和投遞。

官網上的OGG for java adapter介質:

image

官網上ogg for bigdata介質:

image

架構

針對ogg for java adapter,常用的架構如下:

image

OGG for java adapter可用於將增量資料實時寫入到flatfile,通過ETL的Load,載入到DW中,實現實時資料倉儲的載入和分析。如下架構:

image

配置

    針對ogg for java adapter,還是需要配置傳統的source extract,目標端也需要配置replicat,但此時,是呼叫自己開發的java投遞程式。而OGG提供有一套框架介面,開發人員只需要實現對應的介面和過載部分函式,即可完成獲取增量資料,獲取表結構定義,資料變更型別(Insert/update/delete等),事務控制等操作,從而實現自定義的資料投遞。

源端抽取配置

1、oracle goldengate要求資料庫日誌為存檔模式

CMD> set ORACLE_SID=jxk

CMD> sqlplus / as sysdba

SQL> archive log list;(檢視資料庫日誌模式)

(1)如資料庫模式為禁用存檔模式,且資料庫正在執行,需要先將資料庫先關閉,再啟動,並修改配置

SQL> shutdown immediate;

注:shutdown immediate可以強行結束或回滾正在執行的事務、程式就可以close DB

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

SQL> alter database force logging;

SQL> alter database add supplemental log data(primary key,unique) columns;

SQL> alter system archive log current;

2、oracle推薦新建專用同步使用者,執行ogg操作,與業務使用者做區分。

SQL> create user ogg identified by ogg;

SQL>grant dba to ogg;

3、對需要同步的表生成對應的表結構資訊(針對OGG12.2以下的版本)

編輯 $OGG_HOME/def.prm

defsfile busiuser.def --檔名

USERID ogg, PASSWORD ogg --ogg資料庫同步使用者

table busiuser.iy01; --需要同步的表

table newuser.*;


cd E:/ogg

Cmd > defgen paramfile def.prm

將生成的busiuser.def檔案拷貝至目標端的$OGG_HOME/dirdef目錄下

注意:如果busiuser.def檔案已存在,則需要手動刪除,再執行生成命令,否則報錯。原因是oracle此處不會自動刪除已存在的檔案。另外 table busiuser.iy01後面必須跟分號”;”,否則執行defgen的時候會報 command ‘TABLE’ not terminate ……錯誤。

--抽取

add extract ex2, tranlog, begin now

add exttrail ./dirdat/e2, extract ex2, megabytes 100

--傳輸

add extract pu2, exttrailSource ./dirdat/e2

add rmttrail ./dirdat/e3, extract pu2, megabytes 200

--投遞

add replicat re2, exttrail ./dirdat/e3, nodbcheckpoint

4、配置ogg程式

cd E:/ogg

E:

ggsci

> create subdirs

> edit param mgr (建立管理程式)輸入埠

port 7809

> edit param ex1

extract ex1

oracle_home

setenv(oracle_sid="jxk") --設定oracle_sid

nls_lang

userid ogg, password ogg --設定操作ogg的使用者

rmthost 192.168.0.44, mgrport 7809 --目標端ogg的ip和埠

rmttrail ./dirdat/ea --目標端的佇列檔案儲存目錄,相對與安裝ogg目錄的路徑

table busiuser.*; --需要執行同步的表,可單表配置,也支援通配 使用者名稱.表名


注:ex1檔案發生改變,需要重啟mgr和ex1程式;ex1名稱自定義

預設只支援DML,如果要支援DDL需要執行一些單獨的配置。

> add extract ex1(此名稱需要與配置prm檔名一致), tranlog, begin now

--TRANLOG 表示使用事務日誌的方式

--BEGIN NOW 表示從現在開始,你也可以指定一個具體的開始時間

> add rmttrail ./dirdat/ea, extract ex1

> start mgr

> start ex1

> info 程式名(檢視程式狀態)

> info all(檢視所有程式狀態)

> view report ex1(檢視程式ex1執行日誌)

完成上述操作後,還需要對需要同步的表做trandata操作,否則沒有主鍵的表同步會報錯,異常資訊如下:

OGG-00730 No minimum supplemental logging is enabled. This may cause extract process to handle key update incorrectly if key column is not in first row piece.

Cmd > set oracle_sid=orcl

Cmd > ggsci

> dblogin userid ogg, password ogg

> add trandata business.iy01

> start ex1(重啟程式)

如遇到錯誤:ERROR OGG-00717 Found unsupported in-memory undo record in sequence 38978, at RBA 4562448, with SCN 0.2055451476 (2055451476) ... Minimum supplemental logging must be enabled to prevent data loss. 執行如下操作

> alter ex1, tranlog, begin now

> start ex1

> stats ex1(檢視當前正在佇列中的資料)

目標端JDBC連線方式配置

1、下載ogg application adapters for linux

2、解壓配置環境變數

export JAVA_HOME=/home/gbase/jdk1.8.0_45

export PATH=$JAVA_HOME/bin:$PATH

export LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/amd64/server:/home/oracle/ogg:${LD_LIBRARY_PATH}

注意:LD_LIBRARY_PATH這個配置是因為ogg中的庫檔案需要依賴

3、進入安裝目錄執行命令

$>./ggsci

> create subdirs

> edit param mgr

Port 7809

> start mgr

>info all

4、目標端啟動mgr後,源端啟動抽取程式才會成功,下面執行目標端程式配置

(以下使用傳統的extract模式進行投遞,在ogg12.2及以後版本,可使用replicat模式)

1)拷貝redis-jdbc驅動包和二次開發的jar包到 $OGG_HOME/ggjava目錄下

2)>edit param rejava

Extract rejava

-- Sample extract prm file for the Oracle GoldenGate for Java user-exit. A properties

-- file configures the user-exit; by default named "dirprm/{extract_name}.properties"

-- e.g., javaue.prm loads javaue.properties. The user-exit runs in a data pump extract:

-- ggsci> add extract javaue, extTrailSource dirdat/tc

-- ggsci> info javaue

-- the source-def's must match the trail data

SourceDefs ./dirdef/busiuser.def

getEnv (JAVA_HOME)

getEnv (PATH)

getEnv (LD_LIBRARY_PATH)

-- windows:

--CUserExit ggjava_ue.dll CUSEREXIT PassThru IncludeUpdateBefores

-- unix/linux:

CUserExit libggjava_ue.so CUSEREXIT PassThru IncludeUpdateBefores

GetUpdateBefores

-- tables to be processed; as of 11.2 data may be filtered, tables/operations skipped

Table busiuser.*;


> edit rejava.properties

gg.handlerlist=use_redis --隨意,但下面配置必須和此名稱一致

gg.classpath=./ggjava/ogg_gbase_1.0.jar,./ggjava/gbase-connector-java-8.3.81.53-build52.8-bin.jar --引入jar包到classpath

gg.handler.use_redis.type=sample.handler.jdbc.SimpleJDBCHandler --二次開發程式入口

gg.handler.use_redis.driver= redis jdbc driver資訊

gg.handler.use_redis.url=redis jdbc url

gg.handler.use_redis.user=

gg.handler.use_redis.password=

gg.handler.use_redis.mode=op

gg.handler.use_redis.maxBatchSize=100

gg.handler.use_redis.reportCount=10000

gg.handler.use_redis.dateFormat=yyyy-MM-dd:HH:mm:ss


配置完成後,需要關閉mgr,重啟mgr

5、增加extract程式

> ADD EXTRACT rejava, EXTTRAILSOURCE ./dirdat/ea, BEGIN now

> ADD RMTTRAIL ./dirdat/ea, EXTRACT rejava

> start rejava

> info all

6、測試:

在源端insert 資料,使用stats可以在源端和目標端看到資料增變數,和執行的標識語句,在目標資料庫中查詢資料

總結

1、源端和目標端部署完成後,需要兩端都將mgr程式啟動,然後再啟動extract程式。

2、遠端和目標端的配置檔案發生改變時,需要重啟mgr和extract程式。

3、如碰上目標端投遞資料有問題,可先使用單獨的java程式嘗試手工寫入資料,確保目標端是可用的,再進行ogg for java extract/replicat程式的除錯。

4、使用ogg for java adapter,可以很容易實現將關係型資料庫的增量資料(其實也可以抽取存量資料),實時寫入到任意目標儲存平臺,包括非官方直接配置支援的redis, 各種key-value db, memory db(如gemfire),mariadb, sqlite,JSON等,適合於各種場景應用。


下一期會基於程式碼介紹OGG for java adapter的部分介面和函式。

相關文章