基於OGG Datahub外掛將Oracle資料同步上雲

weixin_34050427發表於2018-05-08

一、背景介紹

隨著資料規模的不斷擴大,傳統的RDBMS難以滿足OLAP的需求,本文將介紹如何將Oracle的資料實時同步到阿里雲的大資料處理平臺當中,並利用大資料工具對資料進行分析。

OGG(Oracle GoldenGate)是一個基於日誌的結構化資料備份工具,一般用於Oracle資料庫之間的主從備份以及Oracle資料庫到其他資料庫(DB2, MySQL等)的同步。下面是Oracle官方提供的一個OGG的整體架構圖,從圖中可以看出OGG的部署分為源端和目標端兩部分組成,主要有Manager,Extract,Pump,Collector,Replicat這麼一些元件。

2509688-5bc1f0812017759a.png

Manager:在源端和目標端都會有且只有一個Manager程式存在,負責管理其他程式的啟停和監控等;

Extract:負責從源端資料庫表或者事務日誌中捕獲資料,有初始載入和增量同步兩種模式可以配置,初始載入模式是直接將源表資料同步到目標端,而增量同步就是分析源端資料庫的日誌,將變動的記錄傳到目標端,本文介紹的是增量同步的模式;

Pump:Extract從源端抽取的資料會先寫到本地磁碟的Trail檔案,Pump程式會負責將Trail檔案的資料投遞到目標端;

Collector:目標端負責接收來自源端的資料,生成Trail檔案

Replicat:負責讀取目標端的Trail檔案,轉化為相應的DDL和DML語句作用到目標資料庫,實現資料同步。

本文介紹的Oracle資料同步是通過OGG的Datahub外掛實現的,該Datahub外掛在架構圖中處於Replicat的位置,會分析Trail檔案,將資料的變化記錄寫入Datahub中,可以使用流計算對datahub中的資料進行實時分析,也可以將資料歸檔到MaxCompute中進行離線處理。

二、安裝步驟

0. 環境要求

源端已安裝好Oracle

源端已安裝好OGG(建議版本Oracle GoldenGate V12.1.2.1)

目標端已安裝好OGG Adapters(建議版本Oracle GoldenGate Application Adapters 12.1.2.1)

java 7

(下面將介紹Oracle/OGG相關安裝和配置過程,Oracle的安裝將不做介紹,另外需要注意的是:Oracle/OGG相關引數配置以熟悉Oracle/OGG的運維人員配置為準,本示例只是提供一個可執行的樣本,Oracle所使用的版本為ORA11g)

1. 源端OGG安裝

下載OGG安裝包解壓後有如下目錄:

2509688-68344fbb60ec9199.png

目前oracle一般採取response安裝的方式,在response/oggcore.rsp中配置安裝依賴,具體如下:

2509688-d7f7c479f030032e.png

執行命令:

2509688-856044e99506f5a9.png

本示例中,安裝後OGG的目錄在/home/oracle/u01/ggate,安裝日誌在/home/oracle/u01/ggate/cfgtoollogs/oui目錄下,當silentInstall{時間}.log檔案裡出現如下提示,表明安裝成功:

2509688-2d5625819b18a713.png

執行/home/oracle/u01/ggate/ggsci命令,並在提示符下鍵入命令:CREATE SUBDIRS,從而生成ogg需要的各種目錄(dir打頭的那些)。

至此,源端OGG安裝完成。

2. 源端Oracle配置

以dba分身進入sqlplus:sqlplus / as sysdba

2509688-9c5a0c1a78a8702a.png
2509688-805562ad2d5f36f7.png

3. OGG源端mgr配置

以下是通過ggsci對ogg進行配置

配置mgr

edit params mgr

2509688-998f578397ee7970.png

啟動mgr(執行日誌在ggate/dirrpt中)

start mgr

檢視mgr狀態

info mgr

檢視mgr配置

view params mgr

4. OGG源端extract配置

以下是通過ggsci對ogg進行配置

配置extract(名字可任取,extract是組名)

edit params extract

2509688-a4347381705ba55d.png

增加extract程式(ext後的名字要跟上面extract對應,本例中extract是組名)

add ext extract,tranlog, begin now

刪除某廢棄程式DP_TEST

delete ext DP_TEST

新增抽取程式,每個佇列檔案大小為200m

add exttrail ./dirdat/st,ext extract, megabytes 200

啟動抽取程式(執行日誌在ggate/dirrpt中)

start extract extract

至此,extract配置完成,資料庫的一條變更可以在ggate/dirdat目錄下的檔案中看到

5. 生成def檔案

源端ggsci起來後執行如下命令,生成defgen檔案,並且拷貝到目標端dirdef下

edit params defgen

2509688-2c727236863bdb2d.png

在shell中執行如下命令,生成ogg_test.def

./defgen paramfile ./dirprm/defgen.prm

6. 目標端OGG安裝和配置

解壓adapter包

將源端中dirdef/ogg_test.def檔案拷貝到adapter的dirdef下

執行ggsci起來後執行如下命令,建立必須目錄

create subdirs

編輯mgr配置

edit params mgr

2509688-621a4835983e0ad1.png

啟動mgr

start mgr

7. 源端ogg pump配置

啟動ggsci後執行如下操作:

編輯pump配置

edit params

2509688-2aa04d79583a36cf.png

新增投遞程式,從某一個佇列開始投

add ext pump,exttrailsource ./dirdat/st

備註:投遞程式,每個隊檔案大小為200m

add rmttrail ./dirdat/st,ext pump,megabytes 200

啟動pump

start pump

啟動後,結合上面adapter的配置,可以在目標端的dirdat目錄下看到過來的trailfile

8. Datahub外掛安裝和配置

依賴環境:jdk1.7。

配置好JAVA_HOME, LD_LIBRARY_PATH,可以將環境變數配置到~/.bash_profile中,例如

2509688-392e8d9e850f774c.png

修改環境變數後,請重啟adapter的mgr程式

下載datahub-ogg-plugin.tar.gz並解壓:

修改conf路徑下的javaue.properties檔案,將{YOUR_HOME}替換為解壓後的路徑

2509688-be70b69e24598313.png

修改conf路徑下的log4j.properties檔案,將{YOUR_HOME}替換為解壓後的路徑

修改conf路徑下的configure.xml檔案,修改方式見檔案中的註釋

2509688-4aa09db3243a7d6c.png
2509688-9f63e66849c3975e.png
2509688-c22106bd24b728df.png
2509688-52cb84e9e326c0b1.png

在ggsci下啟動datahub writer

edit params dhwriter

2509688-2e72e94c44867bdc.png

新增dhwriter

add extract dhwriter, exttrailsource ./dirdat/st

啟動dhwriter

start dhwriter

三、使用場景

這裡會用一個簡單的示例來說明資料的使用方法,例如我們在Oracle資料庫有一張商品訂單表orders(oid int, pid int, num int),該表有三列,分別為訂單ID, 商品ID和商品數量。

將這個表通過OGG Datahub進行增量資料同步之前,我們需要先將源表已有的資料通過DataX同步到MaxCompute中。增量同步的關鍵步驟如下:

(1)在Datahub上建立相應的Topic,Topic的schema為(string record_id, string optype, string readtime, bigint oid_before, bigint oid_after, bigint pid_before, bigint pid_after, bigint num_before, bigint num_after);

(2)OGG Datahub的外掛按照上述的安裝流程部署配置,其中列的Mapping配置如下:

2509688-a92fa4f454b2c7cc.png

其中optype和readtime欄位是記錄資料庫的資料變更型別和時間,optype有"I", "D", "U"三種取值,分別對應為“增”,“刪”,“改”三種資料變更操作。

(3)OGG Datahub外掛部署好成功執行後,外掛會源源不斷的將源表的資料變更記錄輸送至datahub中,例如我們在源訂單表中新增一條記錄(1,2,1),datahub裡收到的記錄如下:

2509688-b53be48135d22fe8.png

修改這條資料,比如把num改為20,datahub則會收到的一條變更資料記錄,如下:

2509688-9115ecc5631f93e3.png

實時計算

在前一天的離線計算的基礎資料上,我們可以寫一個StreamCompute流計算的分析程式,很容易地對資料進行實時彙總,例如實時統計當前總的訂單數,每種商品的銷售量等。處理思路就是對於每一條到來的變更資料,可以拿到變化的數值,實時更新統計變數即可。

離線處理

為了便於後續的離線分析,我們也可以將Datahub裡的資料歸檔到MaxCompute中,在MaxCompute中建立相應Schema的表:

createtableorders_log(record_idstring, optypestring, readtimestring, oid_beforebigint, oid_afterbigint, pid_beforebigint, pid_afterbigint, num_beforebigint, num_afterbigint);

在Datahub上建立MaxCompute的資料歸檔,上述流入Datahub裡的資料將自動同步到MaxCompute當中。建議將同步到MaxCompute中的資料按照時間段進行劃分,比如每一天的增量資料都對應一個獨立分割槽。這樣當天的資料同步完成後,我們可以處理對應的分割槽,拿到當天所有的資料變更,而與和前一天的全量資料進行合併後,即可得到當天的全量資料。為了簡單起見,先不考慮分割槽表的情況,以2016-12-06這天的增量資料為例,假設前一天的全量資料在表orders_base裡面,datahub同步過來的增量資料在orders_log表中,將orders_base與orders_log做合併操作,可以得到2016-12-06這天的最終全量資料寫入表orders_result中。這個過程可以在MaxCompute上用如下這樣一條SQL完成。

2509688-4298342039f3af20.png
2509688-3a40be828fd8f979.png

四、常見問題

Q:目標端報錯 OGG-06551 Oracle GoldenGate Collector: Could not translate host name localhost into an Internet address.

A:目標端機器hostname在/etc/hosts裡面重新設定localhost對應的ip

Q:找不到jvm相關的so包

A:將jvm的so路徑新增到LD_LIBRARY_PATH後,重啟mgr

例如:exportLD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$JAVA_HOME/lib/amd64:$JAVA_HOME/lib/amd64/server

Q:有了DDL語句,比如增加一列,源端ogg沒有問題,但是adapter端的ffwriter和jmswriter程式退出,且報錯: 2015-06-11 14:01:10 ERROR OGG-01161 Bad column index (5) specified for table OGG_TEST.T_PERSON, max columns = 5.

A:由於表結構改變,需要重做def檔案,將重做的def檔案放入dirdef後重啟即可。

本文作者:冶善

原文連結

本文為雲棲社群原創內容,未經允許不得轉載。

相關文章