閱讀657 返回首頁    go 阿裏雲 go 技術社區[雲棲]


利用OTTER實現準實時ETL

一:背景
目前公司已有的IT係統中,各係統中的數據往往都各自存儲,各自定義。每個係統的數據同公司內部的其他數據進行連接互動時,難度很大,無形中加大了跨係統數據合作的溝通成本。為解決這一問題,需要引入一個基礎中間件,可以靈活提取源數據庫增量信息,按業務需求靈活整合目標表信息,從而使業務係統在本地庫實時、準確地訪問到其需要的全麵業務數據。
二:簡介
OTTER是阿裏巴巴公司為了解決杭州/美國機房數據間同步研發的一個開源軟件。OTTER基於數據庫增量日誌解析,準實時同步到本機房或異地機房的mysql/oracle數據庫,是一個分布式數據庫同步係統。
工作原理圖:
concept_jpeg

原理描述:
1. 基於Canal開源產品,獲取數據庫增量日誌數據。
2. 典型管理係統架構,manager(web管理)+node(工作節點)
a. manager運行時推送同步配置到node節點
b. node節點將同步狀態反饋到manager上
3. 基於zookeeper,解決分布式狀態調度的,允許多node節點之間協同工作.具體請參考:https://github.com/alibaba/otter/wiki

三:安裝
3.1 需要軟件
需要MYSQL5.x,manager,node,ZOOKEEPER
3.2 安裝步驟
otter的manager、node和ZOOKEEPER均部署在192.168.155.57,otter自身的配置庫放在57的MYSQL上
1,安裝配置庫
用MYSQL命令連接上57後,在提示符下鍵入 source otter-manager-schema.sql,成功後會建立名為otter的數據庫和對應表。
2,安裝zookeeper(略)
3,依次安裝manager,node(略,詳情可參考:https://github.com/alibaba/otter/wiki/QuickStart),
4,驗證,輸入 https://192.168.155.57:8080/login.htm,輸入用戶名/密碼(admin/admin)登陸後,錄入ZK集群信息:
NEW_ZK

四:實戰
4.1 表級映射
源表:192.168.155.57上的sbtest1
目標表:192.168.155.60上的sbtest1_1
表差異:無
1)添加數據庫
添加源庫(57),如圖:
NewDataSource

完後後點擊 ‘驗證連接數據源’,提示‘恭喜,數據庫通過驗證’,標誌源數據庫添加成功
添加目標庫(60),如圖:
NewDestDataSource
同上
2)添加CANAL(監聽57DB BINLOG變化)
57Canal

3)添加表
源表:
57_sbtest1

SCHEMA NAME表示對應DB名稱,點擊’查找數據源‘選擇對應的數據庫後,再點擊’驗證連接表‘、’查詢Schema&Test'驗證表是否配置成功
L(注意:源表上必須要有PRIMARY KEY!否則OTTER無法正確同步,)
目標表:
60_sbtest1_1

4)添加CHANNEL
57_60CHN

同步一致性選擇‘基於當前日誌查詢’效率較高,‘基於數據庫反查’會按PK去源表查詢效率較低;
同步模式建議選擇列記錄模式;
列模式修改哪些字段就映射更新那些字段,如果目標庫不存在該記錄且本次操作類型為‘修改’,OTTER會忽略本次更新;
行記錄模式會更新所有映射字段,如果目標庫不存在該記錄且本次操作類型為‘修改’,OTTER會在目標庫執行新增;
是否開啟數據一致性:選‘否’,公司數據架構設計不考慮數據多主模式。
5)添加PIPE
57_60PIPE

需要選擇SELECT/LOAD機器節點;然後選擇一個CANAL(注意:一個CANAL隻能和一個CHANNEL關聯!)
6)添加映射規則
1to1_1

選擇好源表,目標表後,點解‘保存’即可,至此,整個配置過程完成。
7)在CHANNEL管理頁麵啟動
StartChn57

8)測試
在57上執行修改語句:
57_sbtest1_mod

然後在60上執行SELECT語句驗證結果
60_sbtest1_1_res

測試通過;

4.2 源表覆蓋目標表
源表:192.168.155.57上的sbtest2
目標表:192.168.155.60上的sbtest1_small
表差異:源表筆比目標表多字段
1)添加表
2)在對應的CHANNEL->PIPE上添加映射規則
先配置源表、目標表,然後點擊‘下一步’,頁麵上會顯示源表,目標表的字段列表信息
origin_2_small

然後按映射規則拖動對應字段,完後後點’保存‘
2_small

至此,整個配置過程完成。
3)在CHANNEL管理頁麵啟動(略)
4)測試(略)
4.3 源表是目標表一部分
源表:192.168.155.57上的sbtest3
目標表:192.168.155.60上的sbtest3_3
表差異:源表筆比目標表少字段
1)添加表
2)在對應的CHANNEL->PIPE上添加映射規則
3)啟動,測試
4.4 多張源表(同實例)覆蓋一張目標表
源表:192.168.155.57上的sbtest4/sbtest5
目標表:192.168.155.60上的sbtest45_3
表差異:2源表合並成一張目標表
1)添加表
2)在對應的CHANNEL->PIPE上添加映射規則
3)啟動,測試
4.5 多張源表(不同實例)覆蓋一張目標表
源表1:192.168.155.57上的sbtest6
源表2:192.168.155.59上的sbtest7
目標表:192.168.155.60上的sbtest67_3
表差異:2源表合並成一張目標表
1)添加新數據源(192.168.155.59)
2)添加表
3)添加CANALE,監聽192.168.155.59的BINLOG變化
4)添加新的CHANEL,對應59->60的數據映射
5)在4)生成的CHANNLE中配置新的PIPE
6)在新PIPE中定義映射規則(sbtest7->sbtest67_3)
7)啟動,測試
4.6 一張源表覆蓋多張目標表(同實例)
源表1:192.168.155.57上的sbtest8
目標表1:192.168.155.60上的sbtest1_from8
目標表2:192.168.155.60上的sbtest2_from8
表差異:1源表拆分成2張目標表
1)添加CANAL,監聽192.168.155.57的BINLOG變化
2)添加新的CHANEL,對應sbtest8->sbtest2_from8的數據映射
3)在2)生成的CHANNLE中配置新的PIPE
4)在新PIPE中定義映射規則(sbtest8->sbtest2_from8)
5)啟動,測試
4.7 一張源表覆蓋多張目標表(不同實例)
源表1:192.168.155.57上的sbtest9
目標表1:192.168.155.59上的sbtest1_from9
目標表2:192.168.155.60上的sbtest2_from9
表差異:1源表拆分成2張目標表
1)添加新的CHANEL,對應57->59的數據映射
3)在2)生成的CHANNLE中配置新的PIPE
4)在新PIPE中定義映射規則(sbtest9->sbtest2_from9)
5)啟動,測試
4.8 自定義同步
源表1:192.168.155.57上的sbtest10
目標表:192.168.155.60上的sbtest_misc
目標表2:192.168.155.60上的sbtest2_from8
表差異:目標表比源表多一個CHAR(60)字段,名稱叫misc,每次數據發生變化時,固定填入默認值
1)編碼,擴展EventProcessor(可參考otter WIKI上例子:https://github.com/alibaba/otter/wiki/Otter%E6%89%A9%E5%B1%95%E6%80%A7)
核心代碼如下:
EventColumn misc = new EventColumn();
misc.setColumnValue("CJN");
misc.setColumnType(Types.CHAR);
misc.setColumnName("misc");
List cols = eventData.getColumns();
cols.add(misc);
eventData.setColumns(cols);
2)配置映射規則
UDF_mapping

選擇’clazz'後,在‘EventProcessor文本’填入對應類名,然後將JAR包上傳到node/lib下,即可;至此,整個OTTER的功能介紹完畢

最後更新:2017-10-11 14:03:16

  上一篇:go  專訪趨勢科技:全麵解析APT攻擊過程
  下一篇:go  馬雲:阿裏巴巴必須成為國家和世界創新的發動機