Windows Oracle11g OGG to kafka

本文主要參考文檔和博客如下:

https://dongkelun.com/2018/05/23/oggOracle2Kafka/

https://www.jianshu.com/p/b1e1fb623f15

 

原因是這樣的:當我使用debezium插件對oracle進行cdc日誌獲取的時候發現我的oracle版本過低爲11G,不支持

alter system set enable_goldengate_replication=true;

的屬性(雖然不知有何影響),然後看了看debezium對於oracle連接器的說法爲孵化階段,所以就滾去OGG將oracle數據庫ddl變更推到kafka了。

 

一、開發環境

 

源端:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Oracle GoldenGate Manager for Oracle

Version 12.2.0.2.3 OGGCORE_12.2.0.2.0_PLATFORMS_170727.1430

Windows x64 (optimized),

目標端:

OGG_BigData_Linux_x64_19.1.0.0.1.tar

kafka2.12-2.4.0

 

二、 源端配置

2.1 Oracle配置,OGG解壓安裝

  1. 解壓文件,安裝OGG
  2. 登錄Oracle,啓動oracle歸檔模式
sqlplus / as sysdba
archive log list   --- 該命令爲查看歸檔日誌情況

conn / as sysdba (以DBA身份連接數據庫) 
shutdown immediate (立即關閉數據庫)
startup mount (啓動實例並加載數據庫,但不打開)
alter database archivelog; (更改數據庫爲歸檔模式)
alter database open; (打開數據庫)
alter system archive log start; (啓用自動歸檔)

--查看輔助日誌情況
select force_logging, supplemental_log_data_min from v$database;

alter database force logging;
alter database add supplemental log data;

--這裏創建複製用戶,便於管理
SQL> create tablespace oggtbs datafile 'C:\app\Administrator\product\oggdata\oggtbs01.dbf' size 1000M autoextend on;

Tablespace created.

SQL>  create user ogg identified by ogg default tablespace oggtbs;

User created.

-- 根據實際給予相關權限,這裏便於操作給予dba權限,實際需求中請給予正確的權限
SQL> grant dba to ogg;

Grant succeeded.

    3. 啓動OGG,進入到OGG安裝目錄,啓動文件夾下的ggsci.exe程序

  4.在ggsci.exe界面中執行以下命令

dblogin userid ogg password ogg   --使用oracle複製用戶進行登錄

登錄成功顯示

Successfully logged into database.

下列該步驟可有可無。我試了下並沒有影響:

GGSCI > edit param ./globals

添加內容
oggschema ogg

2.2 配置mgr管理器

GGSCI > edit param mgr

PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
ACCESSRULE, PROG SERVER, ALLOW;             --記住以;結尾

上述說明:

PORT即mgr的默認監聽端口;

DYNAMICPORTLIST動態端口列表,當指定的mgr端口不可用時,會在這個端口列表中選擇一個,最大指定範圍爲256個;

AUTORESTART重啓參數設置表示重啓所有EXTRACT進程,最多5次,每次間隔3分鐘;

PURGEOLDEXTRACTS即TRAIL文件的定期清理

下一步,添加複製表

GGSCI > add trandata test_ogg.test_ogg    --此處爲 庫名.表名 的形式編寫

Logging of supplemental redo data enabled for table TEST_OGG.TEST_OGG.

GGSCI > info trandata test_ogg.test_ogg

Logging of supplemental redo log data is enabled for table TEST_OGG.TEST_OGG.

Columns supplementally logged for table TEST_OGG.TEST_OGG: ID

2.3 配置extract進程

GGSCI > edit param extkafka   --具體名稱自己取,便於管理
extract extkafka
dynamicresolution
SETENV (ORACLE_SID = "orcl")
SETENV (NLS_LANG = "american_america.AL32UTF8")    --此處的編碼問題也是個坑,可能會GBK問題
userid ogg,password ogg
exttrail /opt/ogg/dirdat/to       --此處爲linux環境的話就填linux下的OGG位置,爲windows即填windows位置
table test_ogg.test_ogg;

 說明:

第一行指定extract進程名稱;

dynamicresolution動態解析;

SETENV設置環境變量,這裏分別設置了Oracle數據庫以及字符集;

userid ggs,password ggs即OGG連接Oracle數據庫的帳號密碼,這裏使用創建的複製帳號;

exttrail定義trail文件的保存位置以及文件名,注意這裏文件名只能是2個字母(即會出現to0000000000這樣的文件),其餘部分OGG會補齊;

table即複製表的表名,支持*通配,必須以;結尾(這裏爲單表的形式進行測試)

       添加extract進程:

GGSCI > add extract extkafka,tranlog,begin now
EXTRACT added.

      添加trail文件的定義與extract進程綁定:

GGSCI (ambari.master.com) 17> add exttrail C:\app\Administrator\ogg122023\dirdat\to,extract extkafka
EXTTRAIL added.
--注意此處的位置依舊是linux環境和windows環境的位置不同,/和\也不同

2.4 配置pump進程

pump進程本質上來說也是一個extract,只不過他的作用僅僅是把trail文件傳遞到目標端,配置過程和extract進程類似,只是邏輯上稱之爲pump進程。

GGSCI (ambari.master.com) 18> edit param pukafka
extract pukafka
passthru
dynamicresolution
userid ogg,password ogg
rmthost 192.168.44.129 mgrport 7809  --目標端的地址和端口
rmttrail /opt/ogg/dirdat/to   --目標端的trail文件存儲位置名稱
table test_ogg.test_ogg;

說明:第一行指定extract進程名稱;

passthru即禁止OGG與Oracle交互,我們這裏使用pump邏輯傳輸,故禁止即可;

dynamicresolution動態解析;

userid ogg,password ogg即OGG連接Oracle數據庫的帳號密碼;

rmthost和mgrhost即目標端(kafka)OGG的mgr服務的地址以及監聽端口;

rmttrail即目標端trail文件存儲位置以及名稱。

將本地trail文件和目標端的trail文件綁定到extract進程:

--注意第一條是源端路徑,第二條命令是目標端路徑,注意linux和windows地址寫法
GGSCI > add extract pukafka,exttrailsource C:\app\Administrator\ogg122023\dirdat\to
EXTRACT added.
GGSCI > add rmttrail /opt/ogg/dirdat/to,extract pukafka
RMTTRAIL added.

2.5 配置define文件

Oracle與MySQL,Hadoop集羣(HDFS,Hive,kafka等)等之間數據傳輸可以定義爲異構數據類型的傳輸,故需要定義表之間的關係映射,在OGG命令行執行:

GGSCI > edit param test_ogg
defsfile C:\app\Administrator\ogg122023\dirdef\test_ogg.test_ogg
userid ogg,password ogg
table test_ogg.test_ogg;

在OGG主目錄下執行命令,生成映射文件:

注意:linux和windows下的地址問題。
如果是linux下,則在ogg目錄下執行該語句

./defgen paramfile dirprm/test_ogg.prm

如果是windows環境下,則進入OGG目錄下,按住shift加右鍵打開powershell,執行下面命令

.\defgen.exe paramfile C:\app\Administrator\ogg122023\dirprm\test_oggg.prm

如下

將生成的test_ogg.test_ogg(自己命名)的文件移動到目標端(好像目標端還沒配置。。)的dirdef文件夾下。

此時,源端的配置基本完成。

三、目標端部署

我們假設已經裝好了kafka環境。

與上述源端配置相同,此處是linux下的目標端,所以將壓縮包解壓完畢。

此處解壓到/usr/local/tools/app/ogg目錄下

tar -xvf ggs_Adapters_Linux_x64.tar

同理,進行ggsci命令行:

ggsci

此處關於mgr配置基本與源端相似了

3.1 配置mgr管理器

mgr文件配置

GGSCI >  edit param mgr
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
ACCESSRULE, PROG SERVER, ALLOW;

3.2 配置checkpoint

edit  param  ./GLOBALS
CHECKPOINTTABLE test_ogg.checkpoint

3.3 配置replicate進程

GGSCI > edit param rekafka
REPLICAT rekafka
sourcedefs /opt/ogg/dirdef/test_ogg.test_ogg
TARGETDB LIBFILE libggjava.so SET property=dirprm/kafka.props
REPORTCOUNT EVERY 1 MINUTES, RATE 
GROUPTRANSOPS 10000
MAP test_ogg.test_ogg, TARGET test_ogg.test_ogg;

說明:REPLICATE rekafka定義rep進程名稱;

sourcedefs即在4.6中在源服務器上做的表映射文件;

TARGETDB LIBFILE即定義kafka一些適配性的庫文件以及配置文件,配置文件位於OGG主目錄下的dirprm/kafka.props;

REPORTCOUNT即複製任務的報告生成頻率;

GROUPTRANSOPS爲以事務傳輸時,事務合併的單位,減少IO操作;

MAP即源端與目標端的映射關係。

注意:該版本下的dirprm目錄下只有剛剛生成的mgr.mgr文件,並沒有kafka.props等配置文件,所以需要去

下面的

拿到配置文件並複製到到dirprm文件夾下。

此處拉取kafka.props和custom_kafka_producer.properties文件。

3.4 配置kafka.props和custom_kafka_producer.properties

1. kafka.props

gg.handlerlist=kafkahandler //handler類型
gg.handler.kafkahandler.type=kafka
gg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties //kafka相關配置
gg.handler.kafkahandler.topicMappingTemplate=test_ogg //kafka的topic名稱,無需手動創建
gg.handler.kafkahandler.format=json //傳輸文件的格式,支持json,xml等
gg.handler.kafkahandler.mode=op  //OGG for Big Data中傳輸模式,即op爲一次SQL傳輸一次,tx爲一次事務傳輸一次
gg.classpath=dirprm/:/opt/kafka_2.11-2.4.0/libs/*:/opt/ogg/:/opt/ogg/lib/*

注意:gg.classpath配置kafka和ogg的libs位置,不然啓動的時候讀取不到相關jar包,會報錯

2. custom_kafka_producer.properties

bootstrap.servers=192.168.44.129:9092  //kafkabroker的地址
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

3.5 添加trail文件到replicate進程

GGSCI > add replicat rekafka exttrail /usr/local/tools/app/ogg/dirdat/to,checkpointtable test_ogg.checkpoint
REPLICAT added.

四、進程啓動

如果上述操作都完成並沒有報錯ERROR情況,則接下來進行最終測試。

源端目標端都在ggsci命令行下輸入命令啓動進程。

4.1 源端啓動

他們說按照順序啓動

start mgr
start extkafka
start pukafka

啓動成功,則會看到三個窗口彈出,並無明顯錯誤信息、無窗口閃退情況:

4.2 目標端啓動

start mgr
start rekafka

在ggsci命令行中使用

GGSCI > info all

可以查看啓動信息

例如:

看到自己啓動的進程爲RUNNING狀態則爲啓動成功。

 

若有問題(窗口閃退,報錯啓動失敗),可以查看系統日誌:

1. windows下

ogg目錄下的ggserr.log日誌文件

也可以在ggsci下使用下列命令查看

view report extkafka --這個取決於你的名稱是什麼,比如是extkafka

2. linux下

與windows相同,但是對於kafka報錯可以去

五、 數據測試

連接oracle,使用剛剛創建的測試表進行插入等語句測試:

conn test_ogg/test_ogg
insert into test_ogg values(1,'test');
commit;
update test_ogg set name='zhangsan' where id=1;
commit;
delete test_ogg where id=1;
commit;

注意:這裏一定要commit,纔可以提交併監測到數據變化。

此時,發現源端和目標端的dirdat文件夾下生成了to0000的文件。

查看kafka的主題情況:

bin/kafka-topics.sh --list --zookeeper localhost:2181

主題創建成功。

消費該test_ogg主題,即監控的表:

能讀取到其變化,此時全部步驟完成。

六、 注意問題

6.1 源端和目標端的編碼問題

參考:https://blog.csdn.net/u010457406/article/details/75646547

SHUTDOWN IMMEDIATE; --同樣需要關閉數據庫
STARTUP MOUNT EXCLUSIVE; 
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USEAL32UTF8; --此處加上了INTENAL_USER
SHUTDOWN immediate;
startup;

6.2 kafka序列化配置問題

custom_kafka_producer.properties配置文件中,序列化與反序列化中選擇ByteArray。若是選擇String則會報錯,待解決。

ByteArraySerializer不影響消費(即亂碼問題沒有出現)

6.3 多表配置

如果想通配整個庫的話,只需要把上面的配置所有表名的改爲,如test_ogg.test_ogg改爲 test_ogg.,但是kafka的topic不能通配,所以需要把所有的表的數據放在一個topic即可,後面再用程序解析表名即可。

 

七、 總結

可以說查找了挺多的文章博客和官網文檔說明,一開始根本找不到之前版本的OGG插件包,然後梯子出去官網下載的根本沒有12版本的包,最後還是百度搜索進去才下載好的。

當我很開心看到了有大佬配置的文章,雖然是linux下的配置,但是還是挺舒服解決了這個配置問題。

所以這裏是windows下源端的配置,總結到這裏。

另外Oracle我想罵娘了,配置這麼複雜真的有人用嗎(哦,我用啊,那沒事了),何況我一開始想好好寫這個配置文章的,當我寫到後面發現這麼長,這麼繁瑣。當真不想寫下去了。前面老哥完整記錄下來真的辛苦了。

另外,關於這個配置,我沒有進行多表、全庫、正則匹配表的嘗試。或許之後工作需要會進行填坑。

配置是真的繁瑣!!!

 

文章或許有表名不同的情況,請自行修改。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章