摘要
數(shù)據(jù)庫同步有3大難題:
1是如何保障目標(biāo)和源數(shù)據(jù)一致性;
2是異構(gòu)數(shù)據(jù)庫如何做數(shù)據(jù)類型轉(zhuǎn)換,導(dǎo)致數(shù)據(jù)同步失敗的原因常常是因?yàn)閿?shù)據(jù)類型不一樣;
3是在數(shù)據(jù)越實(shí)時(shí)越有價(jià)值的背景下,同步過程中能否做到實(shí)時(shí)同步。
一、幾種主流的數(shù)據(jù)庫同步方式
方式一:基于無侵入的日志模式(如Oracle redo、Mysql binlog)
基于日志的采集方式無需在源庫端部署任務(wù)代理程序(Agent)及建任何表,對(duì)源數(shù)據(jù)庫無侵入和影響壓力;
方式二:基于時(shí)間戳
同步過程通過特定屬性(如時(shí)間戳、自增序列)來識(shí)別新插入的數(shù)據(jù),該方式實(shí)現(xiàn)最簡(jiǎn)單,但無法記錄刪除和更新,也不具備實(shí)時(shí)的能力;
方式三:基于觸發(fā)器
基于數(shù)據(jù)庫的觸發(fā)器機(jī)制,當(dāng)執(zhí)行DML相關(guān)語句時(shí),執(zhí)行動(dòng)作來捕獲數(shù)據(jù),該方式會(huì)降低系統(tǒng)能,因此大多數(shù)場(chǎng)景下,生產(chǎn)系統(tǒng)不允許添加觸發(fā)器。
方式四:基于快照
基于快照的方式,可以通過比較源表和快照表來獲得數(shù)據(jù)變化,但需要消耗大量存儲(chǔ)空間和計(jì)算資源。
方式五:基于離線批處理
通過jdbc查詢來批量獲取數(shù)據(jù),會(huì)進(jìn)行數(shù)據(jù)表的大范圍掃描和數(shù)據(jù)提取,會(huì)對(duì)數(shù)據(jù)庫產(chǎn)生大量開銷。
本文主要探討無侵入的CDC模式,并以運(yùn)用這種模式的數(shù)據(jù)庫同步云工具 Tapdata Cloud 舉例,你要問我為啥用它舉例,原因只有一個(gè):永久免費(fèi)。
二、架構(gòu)及工作原理
Tapdata Cloud包含兩部分:
- Tapdata Cloud Manager,TCM是Tapdata Cloud的管理端,負(fù)責(zé)agent實(shí)例的安裝,同步任務(wù)的配置、分發(fā)、任務(wù)狀態(tài)監(jiān)測(cè)。
- Tapdata agent,是Tapdata Cloud數(shù)據(jù)同步服務(wù)的執(zhí)行實(shí)例,負(fù)責(zé)從TCM獲取任務(wù)信息,通過流式技術(shù)從源系統(tǒng)獲取數(shù)據(jù)、處理轉(zhuǎn)換數(shù)據(jù)并發(fā)送到目標(biāo)系統(tǒng),并在任務(wù)執(zhí)行過程中監(jiān)測(cè)并上報(bào)任務(wù)狀態(tài)至TCM。
(Tapdata Cloud 工作原理圖)
有朋友可能會(huì)擔(dān)心這個(gè)云平臺(tái)會(huì)不會(huì)把我要同步的數(shù)據(jù)泄露出去?
從Tapdata Cloud 工作原理上可以看出:
- 同步實(shí)例節(jié)點(diǎn)單向連接管控端運(yùn)行服務(wù)。 Tapdata agent實(shí)例節(jié)點(diǎn)對(duì)外不主動(dòng)暴露網(wǎng)絡(luò)信息,只會(huì)連接 TCM管理端服務(wù),獲取任務(wù)信息、上報(bào)狀態(tài)信息。
- 用戶部署的Tapdata agent實(shí)例節(jié)點(diǎn)和 TCM 通信鏈路采用 HTTPS 協(xié)議。
- 自建模式下,所有數(shù)據(jù)流轉(zhuǎn)均發(fā)生在受用戶管理的服務(wù)器和網(wǎng)絡(luò)環(huán)境。
可見,數(shù)據(jù)同步過程中數(shù)據(jù)泄露的問題大可不必?fù)?dān)憂。
三、全量同步和實(shí)時(shí)增量同步機(jī)制
Tapdata Cloud 這款云同步工具支持全量同步和實(shí)時(shí)增量同步,實(shí)現(xiàn)的過程如下圖所示:
四、源和目標(biāo)
據(jù) Tapdata Cloud 最新版本,目前支持了:
數(shù)據(jù)庫 | 版本 | 作為源 | 作為目標(biāo) | 是否可用 |
---|
mysql | 5.x,8.x | 支持 | 支持 | 是 |
oracle | 9i, 10g, 11g, 12c | 支持 | 支持 | 是 |
sqlsever | 2005, 2008, 2012, 2014, 2016, 2017 | 支持 | 支持 | 是 |
mongodb | 3.2, 3.4, 3.6, 4.0, 4.2 | 支持 | 支持 | 是 |
PostgreSQL | 9.x, 10.x,11.x,12.x,13.x | 支持 | 支持 | 是 |
Elastic | 5.x, 6.x, 7.x | 暫不支持 | 支持 | 是 |
達(dá)夢(mèng)數(shù)據(jù)庫 | 7,8 | 支持 | 支持 | 是 |
Kafka | 2.3.x及以上 | 暫不支持 | 支持 | 是 |
Redis | 2.x, 3.x, 4.x | 暫不支持 | 支持 | 即將上線 |
DB2 | 9.7 LUW版本 | 支持 | 支持 | 即將上線 |
Sybase | Sybase ASE 15.7 及以上 | 支持 | 支持 | 即將上線 |
Gbase | | 支持 | 支持 | 即將上線 |
五、舉例:Oracle 數(shù)據(jù)實(shí)時(shí)同步到 Elasticsearch
一般需要做全文檢索的時(shí)候,會(huì)將 Oracle 數(shù)據(jù)實(shí)時(shí)同步到 Elasticsearch。
第一步:配置 Oracle 連接
- 點(diǎn)擊 Tapdata Cloud 操作后臺(tái)左側(cè)菜單欄的【連接管理】,然后點(diǎn)擊右側(cè)區(qū)域【連接列表】右上角的【創(chuàng)建連接】按鈕,打開連接類型選擇頁面,然后選擇Oracle
- 在打開的連接信息配置頁面依次輸入需要的配置信息
【連 接 名 稱】:設(shè)置連接的名稱,多個(gè)連接的名稱不能重復(fù)
【數(shù)據(jù)庫地址】:數(shù)據(jù)庫 IP / Host
【端 口】:數(shù)據(jù)庫端口
【數(shù)據(jù)庫名稱】:tapdata 數(shù)據(jù)庫連接是以一個(gè) db 為一個(gè)數(shù)據(jù)源。這里的 db 是指一個(gè)數(shù)據(jù)庫實(shí)例中的 database,而不是一個(gè) schema。
【賬 號(hào)】:可以訪問數(shù)據(jù)庫的賬號(hào)
【密 碼】:數(shù)據(jù)庫賬號(hào)對(duì)應(yīng)的密碼
【時(shí) 間 時(shí) 區(qū)】:默認(rèn)使用該數(shù)據(jù)庫的時(shí)區(qū);若指定時(shí)區(qū),則使用指定后的時(shí)區(qū)設(shè)置
第二步:配置 Elasticsearch 連接
- 同第一步操作,點(diǎn)擊左側(cè)菜單欄的【連接管理】,然后點(diǎn)擊右側(cè)區(qū)域【連接列表】右上角的【創(chuàng)建連接】按鈕,打開連接類型選擇頁面,然后選擇Elasticsearch
- 在打開的連接信息配置頁面依次輸入需要的配置信息,配置完成后測(cè)試連接保存即可。
第三步:建立同步任務(wù),以全量+增量同步舉例
進(jìn)入Tapdata Cloud 操作后臺(tái)任務(wù)管理頁面,點(diǎn)擊添加任務(wù)按鈕進(jìn)入任務(wù)設(shè)置流程
根據(jù)剛才建好的連接,選定源端與目標(biāo)端。
根據(jù)數(shù)據(jù)需求,選擇需要同步的庫、表,如果你對(duì)表名有修改需要,可以通過頁面中的表名批量修改功能對(duì)目標(biāo)端的表名進(jìn)行批量設(shè)置.
在以上選項(xiàng)設(shè)置完畢后,點(diǎn)擊下方的全量+增量選項(xiàng)并點(diǎn)擊確定按鈕即可完成本次全量同步任務(wù)的配置,在點(diǎn)擊確定后將自動(dòng)返回任務(wù)管理頁面,在任務(wù)管理頁面中,點(diǎn)擊右側(cè)的啟動(dòng)按鈕即可使Tapdata Agent 開始執(zhí)行本次任務(wù)。在全量任務(wù)執(zhí)行完畢后,Tapdata Agent 會(huì)自動(dòng)進(jìn)入增量同步狀態(tài)。在該狀態(tài)中,Tapdata Agent 會(huì)持續(xù)監(jiān)聽源端的數(shù)據(jù)變化(包括:寫入、更新、刪除),并實(shí)時(shí)的將這些數(shù)據(jù)變化寫入目標(biāo)端。
點(diǎn)擊任務(wù)監(jiān)控可以打開任務(wù)執(zhí)行詳情頁面,可以查看任務(wù)執(zhí)行的具體信息。
同理,其他數(shù)據(jù)庫的同步操作也跟上面步驟一致,比如幾個(gè)常用的場(chǎng)景是:
· 從業(yè)務(wù)數(shù)據(jù)庫到緩存數(shù)據(jù)庫的實(shí)時(shí)同步
· 不停機(jī)遷移數(shù)據(jù)庫
· 將主業(yè)務(wù)中心的數(shù)據(jù)實(shí)時(shí)同步至次業(yè)務(wù)中心
· 構(gòu)建只讀實(shí)例
· 構(gòu)建異地災(zāi)備中心
· 構(gòu)建異地多活
六、目標(biāo)和源數(shù)據(jù)一致性
很多人都擔(dān)心同步的數(shù)據(jù)可能沒法和源數(shù)據(jù)一致,Tapdata Cloud 提供了數(shù)據(jù)校驗(yàn)功能,包括快速count校驗(yàn)、表全字段值校驗(yàn)和關(guān)聯(lián)字段值校驗(yàn)三種校驗(yàn)方式。
· 快速count:僅對(duì)源表和目標(biāo)表的行數(shù)進(jìn)行count校驗(yàn),速度極快,但是不會(huì)展示差異的具體字段內(nèi)容。
· 全表字段值校驗(yàn):會(huì)對(duì)源表和目標(biāo)表的全部字段進(jìn)行逐行校驗(yàn),能查出所有字段的差異,但是速度慢。
· 關(guān)聯(lián)字段值校驗(yàn):只對(duì)源表和目標(biāo)表的關(guān)聯(lián)字段的值進(jìn)行比對(duì)校驗(yàn),速度快于全表字段值校驗(yàn)?zāi)J健?br> 校驗(yàn)操作步驟
進(jìn)入數(shù)據(jù)校驗(yàn)菜單,點(diǎn)擊新建校驗(yàn)任務(wù)創(chuàng)建數(shù)據(jù)校驗(yàn)。
【選擇任務(wù)】:選擇一個(gè)歷史同步任務(wù)
【校驗(yàn)類型】:可選 快速count校驗(yàn)、表全字段值校驗(yàn)和關(guān)聯(lián)字段值校驗(yàn)
【校驗(yàn)任務(wù)名】:默認(rèn)與選擇的同步任務(wù)名字一樣
【校驗(yàn)頻次】:設(shè)置您的校驗(yàn)的執(zhí)行頻次
【單次校驗(yàn)】:只執(zhí)行一次校驗(yàn)
【重復(fù)校驗(yàn)】:設(shè)置校驗(yàn)任務(wù)重復(fù)執(zhí)行,支持設(shè)置校驗(yàn)執(zhí)行的起止時(shí)間和校驗(yàn)間隔
【錯(cuò)誤數(shù)據(jù)保存條數(shù)】:當(dāng)出現(xiàn)校驗(yàn)不一致的數(shù)據(jù)時(shí),不一致數(shù)據(jù)保存的最大條數(shù)。該數(shù)值會(huì)影響到差異校驗(yàn),當(dāng)錯(cuò)誤數(shù)據(jù)條數(shù)超出設(shè)置的保存條數(shù)時(shí),將無法進(jìn)行差異校驗(yàn)。
【校驗(yàn)條件】:添加需要進(jìn)行校驗(yàn)的表。點(diǎn)擊自動(dòng)添加會(huì)自動(dòng)將任務(wù)下的所有表全部添加進(jìn)來。
快速count校驗(yàn)
創(chuàng)建快速count校驗(yàn)時(shí)只需要選擇到要校驗(yàn)的表,無需設(shè)置關(guān)聯(lián)條件。
表全字段值校驗(yàn)
除了要選擇待校驗(yàn)表外,還需要針對(duì)每一個(gè)表設(shè)置索引字段。
在進(jìn)行表全字段值校驗(yàn)時(shí),還支持進(jìn)行高級(jí)校驗(yàn)。通過高級(jí)校驗(yàn)可以添加JS校驗(yàn)邏輯,對(duì)源和目標(biāo)的數(shù)據(jù)進(jìn)行校驗(yàn)。
完整示例:以MongoDB查詢示例
JavaScript
function validate(sourceRow){
// 第1步
var targetRow = target.executeQuery({database: "target",collection: "USER",filter: {USER_ID: sourceRow.USER_ID}});
// 第2步
if(sourceRow.USER_ID === targetRow[0].USER_ID){
// 第3步
return {result: 'passed',message: "",data: ""}
}else{
return {result: 'failed',message: "記錄不一致",data: targetRow}
}
}
關(guān)聯(lián)字段值校驗(yàn)
創(chuàng)建關(guān)聯(lián)字段值校驗(yàn)時(shí),除了要選擇待校驗(yàn)表外,還需要針對(duì)每一個(gè)表設(shè)置索引字段。
七、異構(gòu)數(shù)據(jù)類型轉(zhuǎn)換
在異構(gòu)數(shù)據(jù)庫之間做同步,類型轉(zhuǎn)換是一大難題,也是導(dǎo)致數(shù)據(jù)同步失敗的重要原因,Tapdata Cloud 類型映射功能,在系統(tǒng)推演的基礎(chǔ)上,提供了人工調(diào)整的能力,這一點(diǎn)比其他數(shù)據(jù)同步工具都更方便使用。
八、總結(jié)
為了達(dá)到數(shù)據(jù)實(shí)時(shí)要求,并且不對(duì)源庫造成干擾,首選 CDC 模式。
現(xiàn)在市面上已經(jīng)陸續(xù)出現(xiàn)了一些數(shù)據(jù)同步工具,完全沒有必要自己擼代碼了,免費(fèi)的用起來不香嗎?
希望上文的實(shí)操圖文,對(duì)你的數(shù)據(jù)庫同步有幫助,有數(shù)據(jù)庫相關(guān)的問題可以隨時(shí)跟我交流!