随着資料規模的不斷擴大,傳統的rdbms難以滿足olap的需求,本文将介紹如何将oracle的資料實時同步到阿裡雲的大資料處理平台當中,并利用大資料工具對資料進行分析。
ogg(oracle goldengate)是一個基于日志的結構化資料備份工具,一般用于oracle資料庫之間的主從備份以及oracle資料庫到其他資料庫(db2, mysql等)的同步。下面是oracle官方提供的一個ogg的整體架構圖,從圖中可以看出ogg的部署分為源端和目标端兩部分組成,主要有manager,extract,pump,collector,replicat這麼一些元件。
manager:在源端和目标端都會有且隻有一個manager程序存在,負責管理其他程序的啟停和監控等;
extract:負責從源端資料庫表或者事務日志中捕獲資料,有初始加載和增量同步兩種模式可以配置,初始加載模式是直接将源表資料同步到目标端,而增量同步就是分析源端資料庫的日志,将變動的記錄傳到目标端,本文介紹的是增量同步的模式;
pump:extract從源端抽取的資料會先寫到本地磁盤的trail檔案,pump程序會負責将trail檔案的資料投遞到目标端;
collector:目标端負責接收來自源端的資料,生成trail檔案
replicat:負責讀取目标端的trail檔案,轉化為相應的ddl和dml語句作用到目标資料庫,實作資料同步。
源端已安裝好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)
下載下傳ogg安裝包解壓後有如下目錄:
目前oracle一般采取response安裝的方式,在response/oggcore.rsp中配置安裝依賴,具體如下:
執行指令:
本示例中,安裝後ogg的目錄在/home/oracle/u01/ggate,安裝日志在/home/oracle/u01/ggate/cfgtoollogs/oui目錄下,當silentinstall{時間}.log檔案裡出現如下提示,表明安裝成功:
執行/home/oracle/u01/ggate/ggsci指令,并在提示符下鍵入指令:create subdirs,進而生成ogg需要的各種目錄(dir打頭的那些)。
至此,源端ogg安裝完成。
以dba分身進入sqlplus:sqlplus / as sysdba
以下是通過ggsci對ogg進行配置
配置mgr
edit params mgr
啟動mgr(運作日志在ggate/dirrpt中)
start mgr
檢視mgr狀态
info mgr
檢視mgr配置
view params mgr
配置extract(名字可任取,extract是組名)
edit params extract
增加extract程序(ext後的名字要跟上面<code>extract</code>對應,本例中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目錄下的檔案中看到
源端ggsci起來後執行如下指令,生成defgen檔案,并且拷貝到目标端dirdef下
edit params defgen
在shell中執行如下指令,生成ogg_test.def
./defgen paramfile ./dirprm/defgen.prm
解壓adapter包
将源端中dirdef/ogg_test.def檔案拷貝到adapter的dirdef下
執行ggsci起來後執行如下指令,建立必須目錄
create subdirs
編輯mgr配置
啟動mgr
啟動ggsci後執行如下操作:
編輯pump配置
edit params pump
添加投遞程序,從某一個隊列開始投
add ext pump,exttrailsource ./dirdat/st
備注:投遞程序,每個隊檔案大小為200m
add rmttrail ./dirdat/st,ext pump,megabytes 200
啟動pump
start pump
啟動後,結合上面adapter的配置,可以在目标端的dirdat目錄下看到過來的trailfile
依賴環境:jdk1.7。
配置好java_home, ld_library_path,可以将環境變量配置到~/.bash_profile中,例如
修改環境變量後,請重新開機adapter的mgr程序
修改conf路徑下的javaue.properties檔案,将{your_home}替換為解壓後的路徑
修改conf路徑下的log4j.properties檔案,将{your_home}替換為解壓後的路徑
修改conf路徑下的configure.xml檔案,修改方式見檔案中的注釋
在ggsci下啟動datahub writer
edit params dhwriter
添加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配置如下:
其中optype和readtime字段是記錄資料庫的資料變更類型和時間,optype有"i", "d", "u"三種取值,分别對應為“增”,“删”,“改”三種資料變更操作。
(3)ogg datahub插件部署好成功運作後,插件會源源不斷的将源表的資料變更記錄輸送至datahub中,例如我們在源訂單表中新增一條記錄(1,2,1),datahub裡收到的記錄如下:
修改這條資料,比如把num改為20,datahub則會收到的一條變更資料記錄,如下:
在前一天的離線計算的基礎資料上,我們可以寫一個streamcompute流計算的分析程式,很容易地對資料進行實時彙總,例如實時統計目前總的訂單數,每種商品的銷售量等。處理思路就是對于每一條到來的變更資料,可以拿到變化的數值,實時更新統計變量即可。
為了便于後續的離線分析,我們也可以将datahub裡的資料歸檔到maxcompute中,在maxcompute中建立相應schema的表:
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
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後重新開機即可