天天看點

基于 OGG 的 Oracle 與 Hadoop 叢集準實時同步介紹

Oracle 裡存儲的結構化資料導出到 Hadoop 體系做離線計算是一種常見資料處置手段。近期有場景需要做 Oracle 到 Hadoop 體系的實時導入,這裡以此案例做以介紹。

Oracle 作為商業化的資料庫解決方案,自發性的擷取資料庫事務日志等比較困難,故選擇官方提供的同步工具 OGG ( Oracle GoldenGate )來解決。

軟體配置

角色

資料存儲服務及版本

OGG版本

IP

源伺服器

OracleRelease11.2.0.1

Oracle GoldenGate 11.2.1.0 for Oracle on Linux x86-64

10.0.0.25

目标伺服器

Hadoop 2.7.2

Oracle GoldenGate for Big Data 12.2.0.1 on Linux x86-64

10.0.0.2

以上源伺服器上OGG安裝在Oracle使用者下,目标伺服器上OGG安裝在root使用者下。

Oracle導出到異構的存儲系統,如MySQL,DB2,PG等以及對應的不同平台,如AIX,Windows,Linux等官方都有提供對應的Oracle GoldenGate版本,可在這裡或者在舊版本查詢下載下傳安裝。

将下載下傳到的對應OGG版本放在友善的位置并解壓,本示例Oracle源端最終的解壓目錄為/u01/gg。

配置環境變量

這裡的環境變量主要是對執行OGG的使用者添加OGG相關的環境變量,本示例為Oracle使用者添加的環境變量如下:(<code>/home/oracle/.bash_profile</code>檔案)

<code>export OGG_HOME=/u01/gg/ export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$OGG_HOME:/lib:/usr/lib export CLASSPATH=$ORACLE_HOME/jdk/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib</code>

Oracle打開歸檔模式

使用如下指令檢視目前是否為歸檔模式(archive)

<code>SQL&gt; archive log</code> <code>list Database log mode Archive Mode Automatic archival Enabled Archive destination /u01/arch_log Oldest online log sequence 6 Next log sequence to archive 8 Current log sequence 8</code>

如非以上狀态,手動調整即可

<code>SQL&gt; conn / as sysdba(以DBA身份連接配接資料庫) SQL&gt; shutdown immediate(立即關閉資料庫) SQL&gt; startup mount(啟動執行個體并加載資料庫,但不打開) SQL&gt; alter database archivelog(更改資料庫為歸檔模式) SQL&gt; alter database open(打開資料庫) SQL&gt; alter system archive log start(啟用自動歸檔)</code>

Oracle打開日志相關

OGG基于輔助日志等進行實時傳輸,故需要打開相關日志確定可擷取事務内容。通過一下指令檢視目前狀态:

<code>SQL&gt; select force_logging, supplemental_log_data_min from v$database; FOR SUPPLEME--- -------- YES YES</code>

如果以上查詢結果非YES,可通過以下指令修改狀态:

<code>SQL&gt; alter database force logging; SQL&gt; alter database add supplemental log data;</code>

Oracle建立複制使用者

為了使Oracle裡使用者的複制權限更加單純,故專門建立複制使用者,并賦予dba權限

<code>SQL&gt; create tablespaceoggtbsdatafile '/u01/app/oracle/oradata/orcl/oggtbs01.dbf' size 1000M autoextend on; SQL&gt; create user ggs identified by ggs default tablespaceoggtbs; User created. SQL&gt; grant dba to ggs; Grant succeeded.</code>

最終這個ggs帳号的權限如下所示:

<code>SQL&gt; select * from dba_sys_privs where GRANTEE='GGS'; GRANTEE PRIVILEGE ADM GGS DROP ANY DIRECTORY NO GGS ALTER ANY TABLE NO GGS ALTER SESSION NO GGS SELECT ANY DICTIONARY NO GGS CREATE ANY DIRECTORY NO GGS RESTRICTED SESSION NO GGS FLASHBACK ANY TABLE NO GGS UPDATE ANY TABLE NO GGS DELETE ANY TABLE NO GGS CREATE TABLE NO GGS INSERT ANY TABLE NO GRANTEE PRIVILEGE ADM GGS UNLIMITED TABLESPACE NO GGS CREATE SESSION NO GGS SELECT ANY TABLE NO</code>

OGG初始化

進入OGG的主目錄執行./ggsci,進入OGG指令行

<code>[oracle@VM_0_25_centos gg]$ ./ggsci Oracle GoldenGate Command Interpreter for Oracle Version 11.2.1.0.3</code> <code>14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258_FBO Linux, x64, 64bit (optimized), Oracle 11g on Aug 23</code> <code>2012</code> <code>20:20:21 Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved. GGSCI (VM_0_25_centos) 1&gt; 執行create subdirs進行目錄建立 GGSCI (VM_0_25_centos) 4&gt; create subdirs Creating subdirectories under current directory /u01/gg Parameter files /u01/gg/dirprm: already exists Report files /u01/gg/dirrpt: already exists Checkpoint files /u01/gg/dirchk: already exists Process status files /u01/gg/dirpcs: already exists SQL script files /u01/gg/dirsql: already exists Database definitions files /u01/gg/dirdef: already exists Extract data files /u01/gg/dirdat: already exists Temporary files /u01/gg/dirtmp: already exists Stdout files /u01/gg/dirout: already exists</code>

Oracle建立模拟複制庫表

模拟建一個使用者叫tcloud,密碼tcloud,同時基于這個使用者建一張表,叫<code>t_ogg</code>。

<code>SQL&gt; create user tcloud identified by tcloud default tablespace users; User created. SQL&gt; grant dba to tcloud; Grant succeeded. SQL&gt; conn tcloud/tcloud; Connected. SQL&gt; create table t_ogg(id int ,text_name varchar(20),primary key(id)); Table created.</code>

将下載下傳到的對應OGG版本放在友善的位置并解壓,本示例Oracle目标端最終的解壓目錄為<code>/data/gg</code>。

這裡需要用到HDFS相關的庫,故需要配置java環境變量以及OGG相關,并引入HDFS的相關庫檔案,參考配置如下:

<code>export JAVA_HOME=/usr/java/jdk1.7.0_75/ export LD_LIBRARY_PATH=/usr/java/jdk1.7.0_75/jre/lib/amd64:/usr/java/jdk1.7.0_75/jre/lib/amd64/server:/usr/java/jdk1.7.0_75/jre/lib/amd64/libjsig.so:/usr/java/jdk1.7.0_75/jre/lib/amd64/server/libjvm.so:$OGG_HOME:/lib export OGG_HOME=/data/gg</code>

目标端的OGG初始化和源端類似進入OGG的主目錄執行<code>./ggsci</code>,進入OGG指令行

<code>GGSCI (10.0.0.2) 2&gt; create subdirs Creating subdirectories under current directory /data/gg Parameter files /data/gg/dirprm: already exists Report files /data/gg/dirrpt: already exists Checkpoint files /data/gg/dirchk: already exists Process status files /data/gg/dirpcs: already exists SQL script files /data/gg/dirsql: already exists Database definitions files /data/gg/dirdef: already exists Extract data files /data/gg/dirdat: already exists Temporary files /data/gg/dirtmp: already exists Credential store files /data/gg/dircrd: already exists Masterkey wallet files /data/gg/dirwlt: already exists Dump files /data/gg/dirdmp: already exists</code>

Oracle實時傳輸到Hadoop叢集(HDFS,Hive,Kafka等)的基本原理如圖:

基于 OGG 的 Oracle 與 Hadoop 叢集準實時同步介紹

根據如上原理,配置大概分為如下步驟:源端目标端配置ogg管理器(mgr);源端配置extract程序進行Oracle日志抓取;源端配置pump程序傳輸抓取内容到目标端;目标端配置replicate程序複制日志到Hadoop叢集或者複制到使用者自定義的解析器将最終結果落入到Hadoop叢集。

在源端伺服器OGG主目錄下,執行<code>./ggsci</code>到OGG指令行下,執行如下指令:

其中<code>./globals</code>變量沒有的話可以用<code>edit params ./globals</code>來編輯添加即可(編輯器預設使用的vim)

在OGG指令行下執行如下指令:

說明:PORT即mgr的預設監聽端口;DYNAMICPORTLIST動态端口清單,當指定的mgr端口不可用時,會在這個端口清單中選擇一個,最大指定範圍為256個;AUTORESTART重新開機參數設定表示重新開機所有EXTRACT程序,最多5次,每次間隔3分鐘;PURGEOLDEXTRACTS即TRAIL檔案的定期清理

在指令行下執行start mgr即可啟動管理程序,通過info mgr可檢視mgr狀态

在OGG指令行下執行添加需要複制的表的操作,如下:

配置extract程序OGG指令行下執行如下指令:

說明:第一行指定extract程序名稱;dynamicresolution動态解析;SETENV設定環境變量,這裡分别設定了Oracle資料庫以及字元集;userid ggs,password ggs即OGG連接配接Oracle資料庫的帳号密碼,這裡使用2.3.4中特意建立的複制帳号;exttrail定義trail檔案的儲存位置以及檔案名,注意這裡檔案名隻能是2個字母,其餘部分OGG會補齊;table即複制表的表明,支援<code>*</code>通配,必須以;結尾

接下來在OGG指令行執行如下指令添加extract程序:

最後添加trail檔案的定義與extract程序綁定:

可在OGG指令行下通過info指令檢視狀态:

pump程序本質上來說也是一個extract,隻不過他的作用僅僅是把trail檔案傳遞到目标端,配置過程和extract程序類似,隻是邏輯上稱之為pump程序

在OGG指令行下執行:

說明:第一行指定extract程序名稱;passthru即禁止OGG與Oracle互動,我們這裡使用pump邏輯傳輸,故禁止即可;dynamicresolution動态解析;userid ggs,password ggs即OGG連接配接Oracle資料庫的帳号密碼,這裡使用2.3.4中特意建立的複制帳号;rmthost和mgrhost即目标端OGG的mgr服務的位址以及監聽端口;rmttrail即目标端trail檔案存儲位置以及名稱

分别将本地trail檔案和目标端的trail檔案綁定到extract程序:

同樣可以在OGG指令行下使用info檢視程序狀态:

Oracle與MySQL,Hadoop叢集(HDFS,Hive,kafka等)等之間資料傳輸可以定義為異構資料類型的傳輸,故需要定義表之間的關系映射,在OGG指令行執行:

在OGG主目錄下執行:

<code>./defgen paramfile dirprm/tcloud.prm</code>

完成之後會生成這樣的檔案/u01/gg/dirdef/tcloud.t_ogg,将這個檔案拷貝到目标端的OGG主目錄下的dirdef目錄即可。

這裡主要是當目标端為HDFS目錄或者Hive表或者MySQL資料庫時需要手動先在目标端建立好目錄或者表,建立方法都類似,這裡我們模拟實時傳入到HDFS目錄,故手動建立一個接收目錄即可

<code>hadoop –fs mkdir /gg/replication/hive/</code>

目标端的OGG管理器(mgr)和源端的配置類似,在OGG指令行下執行:

checkpoint即複制可追溯的一個偏移量記錄,在全局配置裡添加checkpoint表即可

儲存即可

在OGG的指令行下執行:

說明:REPLICATE r2hdfs定義rep程序名稱;sourcedefs即在3.6中在源伺服器上做的表映射檔案;TARGETDB LIBFILE即定義HDFS一些适配性的庫檔案以及配置檔案,配置檔案位于OGG主目錄下的<code>dirprm/hdfs.props</code>;REPORTCOUNT即複制任務的報告生成頻率;GROUPTRANSOPS為以事務傳輸時,事務合并的機關,減少IO操作;MAP即源端與目标端的映射關系

其中<code>property=dirprm/hdfs.props</code>的配置中,最主要的幾項配置及注釋如下:

具體的OGG for Big Data支援參數以及定義可參考位址

最後在OGG的指令行下執行:

将檔案與複制程序綁定即可

在源端和目标端的OGG指令行下使用start [程序名]的形式啟動所有程序。

啟動順序按照源mgr——目标mgr——源extract——源pump——目标replicate來完成。

以上啟動完成之後,可在源端與目标端的OGG指令行下使用info [程序名]來檢視所有程序狀态,如下:

源端:

目标端:

所有的狀态均是RUNNING即可。(當然也可以使用info all來檢視所有程序狀态)

測試方法比較簡單,直接在源端的資料表中insert,update,delete操作即可。由于Oracle到Hadoop叢集的同步是異構形式,目前尚不支援truncate操作。

源端進行insert操作

檢視源端trail檔案狀态

檢視目标端trail檔案狀态

檢視HDFS中是否有寫入

注意:從寫入到HDFS的檔案内容看,檔案的格式如下:

很明顯Oracle的資料已準實時導入到HDFS了。導入的内容實際是一條條的類似流水日志(具體日志格式不同的傳輸格式,内容略有差異,本例使用的delimitedtext。格式為操作符 資料庫.表名 操作時間戳(GMT+0) 目前時間戳(GMT+8) 偏移量 字段1名稱 字段1内容 字段2名稱 字段2内容),如果要和Oracle的表内容完全一緻,需要客戶手動實作解析日志并寫入到Hive的功能,這裡官方并沒有提供擴充卡。目前騰訊側已實作該功能的開發。

當然你可以直接把這個HDFS的路徑通過LOCATION的方式在Hive上建外表(external table)達到實時導入Hive的目的。

OGG for Big Data實作了Oracle實時同步到Hadoop體系的接口,但得到的日志目前仍需應用層來解析(關系型資料庫如MySQL時OGG對應版本已實作應用層的解析,無需人工解析)。

OGG的幾個主要程序mgr,extract,pump,replicate配置友善,可快速配置OGG與異構關系存儲結構的實時同步。後續如果有新增表,修改對應的extract,pump和replicate程序即可,當然如果是一整個庫,在配置上述2個程序時,使用通配的方式即可。

OGG到Hadoop體系的實時同步時,可在源端extract和pump程序配置不變的情況下,直接在目标端增加replicate程序的方式,增加同步目标,以下簡單介紹本示例中增加同步到Kafka的配置方法。

本示例中extract,pump程序都是現成的,無需再添加。隻需要在目标端增加同步到Kafka的replicate程序即可。

replicate程序和導入到HDFS的配置類似,差異是調用不同的配置dirprm/r2kafka.props。這個配置的主要配置如下:

<code>r2kafka.props</code>引用的<code>custom_kafka_producer.properties</code>定義了Kafka的相關配置如下:

以上配置以及其他可配置項可參考位址:

以上配置完成後,在OGG指令行下添加trail檔案到replicate程序并啟動導入到Kafka的replicate程序

檢查實時同步到kafka的效果,在Oracle源端更新表的同時,使用kafka用戶端自帶的腳本去檢視這裡配置的ggtopic這個kafkatopic下的消息:

目标端Kafka的同步情況:

顯然,Oracle的資料已準實時同步到Kafka。從頭開始消費這個topic發現之前的同步資訊也存在。架構上可以直接接Storm,SparkStreaming等直接消費kafka消息進行業務邏輯的處理。

從Oracle實時同步到其他的Hadoop叢集中,官方最新版本提供了HDFS,HBase,Flume和Kafka,相關配置可參考官網給出的例子配置即可。

參考文檔:http://docs.oracle.com/goldengate/bd1221/gg-bd/GADBD/toc.htm 更多資料庫文章,請關注騰訊雲資料庫公衆号: QcloudCDB