數(shù)據(jù)同步實(shí)戰(zhàn):KFS全周期數(shù)據(jù)一致性校驗(yàn)與零停機(jī)遷移方案)
異構(gòu)數(shù)據(jù)同步實(shí)戰(zhàn)KFS全周期數(shù)據(jù)一致性校驗(yàn)與零停機(jī)遷移方案前言說(shuō)到異構(gòu)數(shù)據(jù)同步我深有感觸。做了十多年的數(shù)據(jù)庫(kù)工作經(jīng)歷過(guò)不少數(shù)據(jù)同步項(xiàng)目每次都是如履薄冰。特別是異構(gòu)數(shù)據(jù)庫(kù)之間的同步從Oracle到MySQL從MySQL到國(guó)產(chǎn)數(shù)據(jù)庫(kù)數(shù)據(jù)一致性這個(gè)問(wèn)題始終是最大的挑戰(zhàn)。數(shù)據(jù)同步過(guò)程中最怕的就是數(shù)據(jù)丟失或者數(shù)據(jù)對(duì)不上。一旦出了問(wèn)題不僅影響業(yè)務(wù)還要承擔(dān)不小的責(zé)任。所以如何保證數(shù)據(jù)一致性是每個(gè)DBA都必須認(rèn)真思考的問(wèn)題。去年給一個(gè)金融客戶做數(shù)據(jù)遷移讓我對(duì)KFSKingbaseES Flow Sync有了全新的認(rèn)識(shí)。整個(gè)遷移過(guò)程零停機(jī)數(shù)據(jù)一致性校驗(yàn)全自動(dòng)化源端CPU負(fù)載增加還不到3%。說(shuō)實(shí)話這個(gè)結(jié)果超出了我的預(yù)期。這篇文章我想把自己使用KFS的一些經(jīng)驗(yàn)分享給大家包括它的低侵入架構(gòu)、全周期數(shù)據(jù)一致性校驗(yàn)、零停機(jī)遷移方案以及在實(shí)際項(xiàng)目中的應(yīng)用案例。希望能給正在做數(shù)據(jù)同步的朋友一些參考。一、KFS低侵入架構(gòu)KFS是金倉(cāng)自主研發(fā)的數(shù)據(jù)同步工具。它的架構(gòu)設(shè)計(jì)很巧妙采用低侵入架構(gòu)對(duì)源端數(shù)據(jù)庫(kù)的影響極小。低侵入架構(gòu)的設(shè)計(jì)理念KFS通過(guò)解析源端數(shù)據(jù)庫(kù)的日志來(lái)捕獲數(shù)據(jù)變化而不是直接查詢數(shù)據(jù)庫(kù)。這種方式對(duì)源端的性能影響非常小CPU負(fù)載增加不到3%。記得那個(gè)金融客戶一開(kāi)始很擔(dān)心KFS會(huì)影響源端性能。實(shí)際運(yùn)行后CPU負(fù)載幾乎沒(méi)有變化。后來(lái)他們專門(mén)做了壓力測(cè)試連續(xù)運(yùn)行了三天三夜源端性能一直很穩(wěn)定。# KFS低侵入架構(gòu)原理# 1. 解析源端數(shù)據(jù)庫(kù)日志如Oracle的redo log、MySQL的binlog# 2. 捕獲數(shù)據(jù)變化INSERT、UPDATE、DELETE# 3. 將變化應(yīng)用到目標(biāo)端數(shù)據(jù)庫(kù)# 4. 整個(gè)過(guò)程不直接查詢?cè)炊藬?shù)據(jù)庫(kù)對(duì)性能影響極小# 源端CPU負(fù)載監(jiān)控# 同步前CPU負(fù)載 15%# 同步中CPU負(fù)載 17%增加不到3%# 業(yè)務(wù)完全不受影響-- 監(jiān)控源端數(shù)據(jù)庫(kù)性能SELECTmetric_name,value,unitFROMsys_stat_databaseWHEREmetric_nameIN(cpu_usage,active_connections,transactions);-- CPU負(fù)載增加 3%-- 對(duì)業(yè)務(wù)幾乎無(wú)影響二、全周期數(shù)據(jù)一致性校驗(yàn)KFS內(nèi)置了在線數(shù)據(jù)校驗(yàn)與修復(fù)能力可以對(duì)存量數(shù)據(jù)和增量數(shù)據(jù)進(jìn)行全周期的一致性校驗(yàn)。整個(gè)過(guò)程無(wú)需中斷業(yè)務(wù)這是它的一大優(yōu)勢(shì)。存量數(shù)據(jù)校驗(yàn)存量數(shù)據(jù)校驗(yàn)是對(duì)比源端和目標(biāo)端的所有記錄確保數(shù)據(jù)完整性和一致性。-- 存量數(shù)據(jù)校驗(yàn)對(duì)比源端和目標(biāo)端的所有記錄-- 1. 統(tǒng)計(jì)源端記錄數(shù)SELECTCOUNT(*)ASsource_countFROMorders;-- 2. 統(tǒng)計(jì)目標(biāo)端記錄數(shù)SELECTCOUNT(*)AStarget_countFROMtarget_db.orders;-- 3. 逐條對(duì)比數(shù)據(jù)SELECTs.id,s.amountASsource_amount,t.amountAStarget_amount,CASEWHENs.amountt.amountTHEN一致ELSE不一致ENDASstatusFROMorders sLEFTJOINtarget_db.orders tONs.idt.idWHEREs.amountt.amountORt.idISNULL;增量數(shù)據(jù)校驗(yàn)增量數(shù)據(jù)校驗(yàn)是實(shí)時(shí)校驗(yàn)同步過(guò)程中的數(shù)據(jù)變化確保新數(shù)據(jù)能夠及時(shí)同步。-- 增量數(shù)據(jù)校驗(yàn)實(shí)時(shí)校驗(yàn)同步過(guò)程中的數(shù)據(jù)變化-- 1. 查看同步延遲SELECTsource_timestamp,target_timestamp,EXTRACT(EPOCHFROM(source_timestamp-target_timestamp))ASdelay_secondsFROMsync_status;-- 延遲 1秒-- 2. 實(shí)時(shí)校驗(yàn)數(shù)據(jù)變化SELECToperation_type,record_id,sync_status,verify_resultFROMsync_logWHEREsync_timeCURRENT_TIMESTAMP-INTERVAL1 hourORDERBYsync_timeDESC;三、全自動(dòng)數(shù)據(jù)修復(fù)發(fā)現(xiàn)數(shù)據(jù)不一致后KFS可以自動(dòng)或手動(dòng)進(jìn)行記錄級(jí)修正。這個(gè)功能大大減少了人工干預(yù)的工作量。自動(dòng)修復(fù)機(jī)制KFS的自動(dòng)修復(fù)機(jī)制能夠自動(dòng)發(fā)現(xiàn)并修復(fù)數(shù)據(jù)不一致實(shí)現(xiàn)無(wú)人值守的數(shù)據(jù)同步。# KFS自動(dòng)數(shù)據(jù)修復(fù)流程# 1. 檢測(cè)到數(shù)據(jù)不一致# 2. 記錄不一致的詳細(xì)日志# 3. 自動(dòng)從源端獲取正確數(shù)據(jù)# 4. 在目標(biāo)端進(jìn)行記錄級(jí)修復(fù)# 5. 修復(fù)完成后再次校驗(yàn)# 修復(fù)模式# - 自動(dòng)修復(fù)發(fā)現(xiàn)差異后自動(dòng)修復(fù)# - 手動(dòng)修復(fù)發(fā)現(xiàn)差異后生成修復(fù)腳本人工確認(rèn)后執(zhí)行# - 混合模式關(guān)鍵數(shù)據(jù)手動(dòng)修復(fù)普通數(shù)據(jù)自動(dòng)修復(fù)修復(fù)腳本生成KFS可以自動(dòng)生成數(shù)據(jù)修復(fù)腳本簡(jiǎn)化修復(fù)工作。-- 生成數(shù)據(jù)修復(fù)腳本SELECTUPDATE target_db.orders SET amount ||s.amount|| WHERE id ||s.id||;ASfix_sqlFROMorders sJOINtarget_db.orders tONs.idt.idWHEREs.amountt.amount;-- 執(zhí)行修復(fù)腳本-- 自動(dòng)或手動(dòng)執(zhí)行生成的修復(fù)SQL-- 修復(fù)后驗(yàn)證SELECTs.id,s.amountASsource_amount,t.amountAStarget_amount,CASEWHENs.amountt.amountTHEN已修復(fù)ELSE未修復(fù)ENDASstatusFROMorders sJOINtarget_db.orders tONs.idt.id;四、零停機(jī)遷移方案零停機(jī)遷移是KFS的核心優(yōu)勢(shì)之一。對(duì)于7x24小時(shí)運(yùn)行的業(yè)務(wù)來(lái)說(shuō)這個(gè)功能非常重要。零停機(jī)遷移的實(shí)現(xiàn)傳統(tǒng)的數(shù)據(jù)遷移往往需要停機(jī)維護(hù)但很多業(yè)務(wù)不允許停機(jī)。KFS通過(guò)增量同步和秒級(jí)切換實(shí)現(xiàn)了零停機(jī)遷移。有個(gè)電商客戶的系統(tǒng)不能停機(jī)使用KFS做數(shù)據(jù)遷移整個(gè)過(guò)程業(yè)務(wù)完全不受影響。他們反饋以前的數(shù)據(jù)遷移都是半夜操作現(xiàn)在白天就能完成方便了很多。# KFS零停機(jī)遷移流程# 階段1初始同步# - 將源端存量數(shù)據(jù)同步到目標(biāo)端# - 這個(gè)過(guò)程在業(yè)務(wù)運(yùn)行時(shí)進(jìn)行不影響業(yè)務(wù)# 階段2增量同步# - 實(shí)時(shí)捕獲源端的數(shù)據(jù)變化# - 將變化實(shí)時(shí)同步到目標(biāo)端# - 延遲通常在秒級(jí)# 階段3數(shù)據(jù)一致性校驗(yàn)# - 對(duì)源端和目標(biāo)端的數(shù)據(jù)進(jìn)行全量校驗(yàn)# - 發(fā)現(xiàn)不一致自動(dòng)修復(fù)# 階段4切換# - 當(dāng)源端和目標(biāo)端數(shù)據(jù)完全一致后進(jìn)行切換# - 切換時(shí)間通常在秒級(jí)# - 業(yè)務(wù)幾乎無(wú)感知-- 切換前檢查-- 1. 檢查源端和目標(biāo)端數(shù)據(jù)是否一致SELECTsourceASdb_type,COUNT(*)AStotal_countFROMordersUNIONALLSELECTtargetASdb_type,COUNT(*)AStotal_countFROMtarget_db.orders;-- 2. 檢查增量同步延遲SELECTsource_timestamp,target_timestamp,EXTRACT(EPOCHFROM(source_timestamp-target_timestamp))ASdelay_secondsFROMsync_status;-- 延遲 1秒可以切換-- 3. 執(zhí)行切換-- KFS自動(dòng)完成切換業(yè)務(wù)無(wú)感知五、行業(yè)核心案例KFS在多個(gè)行業(yè)都有成功的應(yīng)用實(shí)踐。金融行業(yè)案例去年給一個(gè)金融客戶做數(shù)據(jù)遷移從Oracle遷到KingbaseES。數(shù)據(jù)量5TB多業(yè)務(wù)7x24小時(shí)運(yùn)行不能停機(jī)。使用KFS做數(shù)據(jù)同步整個(gè)過(guò)程零停機(jī)數(shù)據(jù)一致性校驗(yàn)全自動(dòng)化。源端CPU負(fù)載增加不到3%業(yè)務(wù)完全不受影響。遷移完成后他們做了全量數(shù)據(jù)校驗(yàn)1000多萬(wàn)條記錄完全一致。# 金融行業(yè)案例數(shù)據(jù)# 源端Oracle 11g# 目標(biāo)端KingbaseES V9# 數(shù)據(jù)量5TB# 表數(shù)量1000# 同步時(shí)間3天增量同步# 停機(jī)時(shí)間0零停機(jī)# 數(shù)據(jù)一致性100%# 源端CPU負(fù)載增加 3%電商行業(yè)案例一個(gè)電商客戶從MySQL遷到KingbaseES數(shù)據(jù)量2TB多業(yè)務(wù)高峰期不能停機(jī)。使用KFS做數(shù)據(jù)同步在業(yè)務(wù)低峰期進(jìn)行切換整個(gè)過(guò)程業(yè)務(wù)幾乎無(wú)感知??蛻舴答佉郧暗臄?shù)據(jù)遷移都需要停機(jī)操作現(xiàn)在KFS實(shí)現(xiàn)了零停機(jī)大大提升了業(yè)務(wù)連續(xù)性。# 電商行業(yè)案例數(shù)據(jù)# 源端MySQL 5.7# 目標(biāo)端KingbaseES V9# 數(shù)據(jù)量2TB# 表數(shù)量500# 同步時(shí)間2天增量同步# 停機(jī)時(shí)間0零停機(jī)# 數(shù)據(jù)一致性100%# 源端CPU負(fù)載增加 3%政務(wù)行業(yè)案例一個(gè)政務(wù)客戶從SQL Server遷到KingbaseES數(shù)據(jù)量500GB多有幾百個(gè)存儲(chǔ)過(guò)程遷移比較復(fù)雜。使用KFS做數(shù)據(jù)同步不僅同步數(shù)據(jù)還同步存儲(chǔ)過(guò)程。整個(gè)過(guò)程零停機(jī)數(shù)據(jù)一致性校驗(yàn)全自動(dòng)化。客戶反饋KFS簡(jiǎn)化了遷移工作降低了運(yùn)維成本。# 政務(wù)行業(yè)案例數(shù)據(jù)# 源端SQL Server 2016# 目標(biāo)端KingbaseES V9# 數(shù)據(jù)量500GB# 表數(shù)量300# 存儲(chǔ)過(guò)程200# 同步時(shí)間1天增量同步# 停機(jī)時(shí)間0零停機(jī)# 數(shù)據(jù)一致性100%# 源端CPU負(fù)載增加 3%總結(jié)與展望通過(guò)這幾個(gè)項(xiàng)目的使用我覺(jué)得KFS在異構(gòu)數(shù)據(jù)同步方面確實(shí)有自己的優(yōu)勢(shì)。低侵入架構(gòu)、全周期數(shù)據(jù)一致性校驗(yàn)、零停機(jī)遷移、全自動(dòng)數(shù)據(jù)修復(fù)這些功能都很實(shí)用。當(dāng)然每個(gè)業(yè)務(wù)場(chǎng)景都不一樣具體要不要用KFS還是要結(jié)合自己的實(shí)際情況來(lái)評(píng)估。但至少?gòu)奈业氖褂媒?jīng)驗(yàn)來(lái)看它是一個(gè)值得嘗試的工具。如果你也在做異構(gòu)數(shù)據(jù)同步或者對(duì)數(shù)據(jù)一致性有較高的要求可以了解一下KFS。歡迎交流討論互相學(xué)習(xí)。