本文轉(zhuǎn)載自 韓鋒頻道? 作者:韓鋒

數(shù)據(jù)庫遷移,是個老生常談的問題,之前也曾寫過一篇文章。近期,針對這一課題,自己有了些新的思考,下面將具體展開談?wù)?。在這之前,我先談?wù)剶?shù)據(jù)庫遷移的現(xiàn)實需求。這也算是目前行業(yè)發(fā)展的一個小總結(jié)。
1. 背景:遷移之源,多變之秋
? ? ?人生基本上就是兩件事,選題和解題。最好的人生是在每個關(guān)鍵點上,既選對題,又解好題。人生最大的痛苦在于解對了題,但選錯了題,而且還不知道自己選錯了題。正如人生最大的遺憾就是,不是你不行,而是你本可以。
? 數(shù)據(jù)規(guī)模大幅增加
近些年來,信息數(shù)據(jù)呈快速增長態(tài)勢。如下圖所示,全球數(shù)據(jù)量總和,預(yù)計將從 2018 年的 33ZB 增至 2025年的 175ZB。國內(nèi)數(shù)據(jù)體量在未來 7年將實現(xiàn)復(fù)合增速 30%以上的快速增長,并在 2025年成為與歐洲、中東、非洲、亞太和美國等地區(qū)相比體量最大的區(qū)域。數(shù)據(jù)的爆發(fā)式增長,導(dǎo)致對數(shù)據(jù)存儲容量、數(shù)據(jù)計算需求有個更好的要求,這也催生企業(yè)在基礎(chǔ)設(shè)施層面不斷革新,進(jìn)而不斷推動數(shù)據(jù)庫向前進(jìn)一步發(fā)展。

從數(shù)據(jù)庫市場來看,也驗證了這一趨勢。整體市場呈現(xiàn)穩(wěn)定的發(fā)展趨勢,最近的數(shù)據(jù)表明,國內(nèi)的數(shù)據(jù)庫市場已經(jīng)達(dá)到200億規(guī)模。

? 開源方案,大行其道
開源數(shù)據(jù)庫,其源代碼具備全球共享、免費等特點,開發(fā)者可在其源碼中修改或使用。在近一、二十年來,越來越多的企業(yè)將開源方案作為構(gòu)建底層支持的可選答案。特別是隨著互聯(lián)網(wǎng)的興起,大量互聯(lián)網(wǎng)企業(yè)選擇使用了開源數(shù)據(jù)庫產(chǎn)品,也加速這些產(chǎn)品的成熟與發(fā)展。這其中MySQL、PostgreSQL、MongoDB 和 Redis 是當(dāng)前開源數(shù)據(jù)庫最為重要的參與者。

? 數(shù)據(jù)上云,大勢所趨
從2017至 2018年,整個數(shù)據(jù)庫市場增長了 18.4%,其中云數(shù)據(jù)庫增長貢獻(xiàn) 68%。以AWS、Microsoft、Alibaba為代表的云廠商,取得了快速發(fā)展,極大地重塑了全球供應(yīng)商格局。國內(nèi)互聯(lián)網(wǎng)科技巨頭,紛紛布局?jǐn)?shù)據(jù)庫產(chǎn)業(yè),借力云計算實現(xiàn)數(shù)據(jù)庫等基礎(chǔ)軟件領(lǐng)域的迭代與超越。如下圖的數(shù)據(jù)庫規(guī)模排名,云數(shù)據(jù)庫廠商均取得不俗的增長,最新數(shù)據(jù)則更是如此。甚至有機(jī)構(gòu)預(yù)測,今明兩年從數(shù)據(jù)庫部署形態(tài)上看,云部署數(shù)據(jù)庫會超過傳統(tǒng)部署方式。

? 國產(chǎn)化趨勢明顯
正如下圖所示,國內(nèi)數(shù)據(jù)庫市場仍然為歐美壟斷,但國產(chǎn)化趨勢已非常明顯。以國產(chǎn)自研或開源定制路線的廠商層出不求,從最新的調(diào)查結(jié)果來看,已經(jīng)有130+的國產(chǎn)數(shù)據(jù)庫廠商初選。

從一葉扁舟到百舸爭流,傳統(tǒng)國產(chǎn)數(shù)據(jù)庫歷經(jīng)長時間艱難探索,已逐步嶄露頭角。國外大廠長期壟斷國內(nèi)數(shù)據(jù)庫市場。Oracle、IBM?和 Microsoft?等老牌廠商憑借先發(fā)優(yōu)勢在市場份額中占據(jù)了有利地位。國產(chǎn)數(shù)據(jù)庫起步較晚,但潛力巨大。正如下圖可見,國產(chǎn)數(shù)據(jù)庫占比正不斷增加。

? 總結(jié):多種變化,驅(qū)動遷移
綜上所述,從數(shù)據(jù)規(guī)模體量的增大,到開源商業(yè)的變化,再到云化趨勢明顯、國產(chǎn)化趨勢加??;而這些變化都帶來同一個訴求,那就是數(shù)據(jù)庫遷移。展開來說,是如何完成異構(gòu)數(shù)據(jù)庫遷移?完成體系架構(gòu)完全不同的數(shù)據(jù)庫之間的遷移(例如從單機(jī)到分布式)?完成從線下到云上的遷移?完成在線的、不終端業(yè)務(wù)的遷移?等等。諸多上述問題,對遷移提出了非常高的要求。本文下面嘗試從遷移的多個階段來闡述,需要哪些能力才能完成這一過程。

2. 數(shù)據(jù)庫遷移之路
? ? ?人生基本上就是兩件事,選題和解題。最好的人生是在每個關(guān)鍵點上,既選對題,又解好題。人生最大的痛苦在于解對了題,但選錯了題,而且還不知道自己選錯了題。正如人生最大的遺憾就是,不是你不行,而是你本可以。
在實際的遷移中,是一個比較復(fù)雜的過程,可根據(jù)階段做個拆解。

1).遷移評估階段
此階段是完成遷移前的評估,為后續(xù)遷移改造、遷移過程做好鋪墊工作
? 數(shù)據(jù)庫畫像
數(shù)據(jù)庫畫像結(jié)果,可為后續(xù)選型評估、架構(gòu)規(guī)劃提供依據(jù)。
-
系統(tǒng)級
收集系統(tǒng)級信息,包括但不限于硬件(CPU、MEM、NET、DISK)、操作系統(tǒng)(內(nèi)核、參數(shù)、安全策略等)、性能(系統(tǒng)高峰期24小時負(fù)載)等
-
實例級
收集實例級信息,包括但不限于架構(gòu)(單機(jī)/集群、版本等)、參數(shù)(數(shù)據(jù)庫參數(shù)等)、數(shù)據(jù)規(guī)模(表、索引等空間使用)、運行態(tài)信息(如QPS、TPS、會話、事務(wù)等)
-
對象級
收集對象級信息,包括但不限于結(jié)構(gòu)信息(表、分區(qū)、分片、索引、視圖、序列等)、統(tǒng)計信息、訪問特征(讀寫比、頻率等)、預(yù)警類(如大表、復(fù)雜結(jié)構(gòu)、DBLink等)
-
語句級
收集語句級信息,包括但不限于SQL文本(全量)、執(zhí)行特征(次數(shù)、響應(yīng)時間等)、執(zhí)行計劃。
-
應(yīng)用級
收集復(fù)雜應(yīng)用信息,包括但不限于計算文本(如存儲過程、觸發(fā)器、函數(shù)等)、 執(zhí)行特征(次數(shù)、響應(yīng)時間等)
? 應(yīng)用畫像
應(yīng)用畫像結(jié)果,為后面應(yīng)用改造做好鋪墊。
-
應(yīng)用拓?fù)?/p>
收集應(yīng)用架構(gòu)、應(yīng)用與DB關(guān)系、應(yīng)用訪問特征等。
? 風(fēng)險評估
針對上面收集的數(shù)據(jù)庫、應(yīng)用畫像信息,針對重點風(fēng)險點做出評估。
-
數(shù)據(jù)庫架構(gòu)
源庫使用集群、分庫分表等架構(gòu),做出提示。
-
數(shù)據(jù)庫結(jié)構(gòu)
源庫使用復(fù)雜結(jié)構(gòu)(如分區(qū)表)、不支持結(jié)構(gòu)(LOB、可更新視圖等),做出提示。
-
數(shù)據(jù)庫語句
源庫使用復(fù)雜SQL(如多表關(guān)聯(lián))、特殊語法或方言等給出提示。
-
數(shù)據(jù)庫應(yīng)用邏輯
源庫大量使用存儲過程、觸發(fā)器、函數(shù)等。
-
應(yīng)用架構(gòu)
應(yīng)用使用何種訪問方式(如java、c、go等),對于某些舊有的方式予以提示。
-
性能維度
源庫存在明顯的性能訪問高峰,明顯的熱點對象。
-
規(guī)模維度
源端數(shù)據(jù)庫總體或單體對象規(guī)模較大的情況。
? 選型建議
根據(jù)上面收集信息及風(fēng)險評估內(nèi)容,給出選型的建議。這里存在幾個難點,一個是多目標(biāo)數(shù)據(jù)庫的基礎(chǔ)能力抽象,一個是兩者的適配評估。功能上包括兩部分:
-
目標(biāo)端建模
目標(biāo)端在架構(gòu)、結(jié)構(gòu)、應(yīng)用、性能指標(biāo)等方面的基礎(chǔ)抽象。
-
評估適配建議
根據(jù)源端和目標(biāo)端情況,結(jié)合風(fēng)險及性能要求給出適配選型建議。
2).遷移改造階段
? 對象改造
這一階段主要是通過結(jié)構(gòu)映射及不兼容提示,來減少改造工作量。
-
映射規(guī)范
適配多目標(biāo)端給出結(jié)構(gòu)映射規(guī)范。
-
結(jié)構(gòu)改造
基于給定輸入,輸出改造后結(jié)構(gòu)??赡艽嬖诜且灰粚?yīng)的情況,可根據(jù)源與目標(biāo)的差異,異構(gòu)改造。
-
不兼容提示
對于不兼容的情況,給出文字提示,人工介入。
? 語句改造
這一階段主要通過語句改寫,減少改造工作量;同時提供增強(qiáng)功能,滿足語句改造后的測試等需求。
-
SQL改造
基于給定輸入,給出改造后的語法。
-
不兼容提示
對于不兼容的情況,給出文字提示,人工介入。
-
增強(qiáng)-執(zhí)行計劃對比? ??
可對比兩邊執(zhí)行計劃,方便研發(fā)優(yōu)化語句寫法。
-
增強(qiáng)-性能對比
可對比兩邊執(zhí)行效率,方便研發(fā)優(yōu)化。此處需保證同等測試環(huán)境。
-
增強(qiáng)-SQL自主優(yōu)化
提供優(yōu)化改寫能力,而非基于簡單規(guī)則。此處需注意,語義等價性問題。
? 應(yīng)用改造
此處應(yīng)用是指數(shù)據(jù)內(nèi)置的計算能力(如存儲過程等)。這一階段主要是通過邏輯改寫,減少人工工作量。在實現(xiàn)上,一般建議使用外部程序邏輯(如java)進(jìn)行處理,而不是改造為目標(biāo)端內(nèi)部計算應(yīng)用。原因是盡量減少數(shù)據(jù)庫耦合。此處,存在較多難點,且需要人工檢查改造后的語義是否正確。
-
應(yīng)用改造
基于給定輸入,給出改造后的實現(xiàn)(推薦java)。
-
不兼容提示? ?
對于不兼容的情況,給出文字提示,人工介入。
-
應(yīng)用校驗? ? ??
對比兩側(cè)的實現(xiàn),驗證處理邏輯是否一致。
3).遷移數(shù)據(jù)階段
? 全量/增量數(shù)據(jù)遷移
完成異構(gòu)數(shù)據(jù)庫間的數(shù)據(jù)遷移工作。主要難點是效率、準(zhǔn)確性。
全量遷移
-
增量數(shù)據(jù)遷移
基于指定時間戳后的增量遷移能力
-
增強(qiáng)-分拆、合并能力
支持一拆多,多合一遷移能力。
-
增強(qiáng)-遷移計算能力? ??
支持在遷移實時計算能力(如lookup)。
-
增強(qiáng)-通用異構(gòu)適配能力? ??
統(tǒng)一遷移能力,不依賴某種庫。
-
增強(qiáng)-提供可配置UI? ??
提供可配置同步界面,簡化操作。
-
增強(qiáng)-數(shù)據(jù)轉(zhuǎn)換能力? ??
提供字符集、時區(qū)等轉(zhuǎn)換能力。
? 數(shù)據(jù)對比
見后面說明
4).在線運行階段
? 數(shù)據(jù)同步
在線運行時,需提供數(shù)據(jù)庫端的異構(gòu)同步能力,滿足業(yè)務(wù)隨時回遷的需求。
-
實時同步
提供異構(gòu)數(shù)據(jù)庫間數(shù)據(jù)實時同步能力,難點在于大吞吐、實時性。
-
增強(qiáng)-細(xì)粒度同步
支持庫、用戶、表同步能力。
-
增強(qiáng)-同步計算能力
支持在同步的實時計算能力(如lookup) ,難點在于效率。
? 數(shù)據(jù)對比
數(shù)據(jù)對比,是用戶對比雙線運行的基本要求,需要滿足實時對比并兼顧效率。
-
異構(gòu)對比
提供異構(gòu)數(shù)據(jù)源之間全量、增量數(shù)據(jù)對比能力。
-
增強(qiáng)-細(xì)粒度對比
支持庫、用戶、表、記錄級別對比能力。
-
增強(qiáng)-數(shù)據(jù)補差
提供差異數(shù)據(jù)的雙向補齊能力。
? 數(shù)據(jù)路由
數(shù)據(jù)路由,為業(yè)務(wù)提供統(tǒng)一數(shù)據(jù)庫訪問入口,并基于此提供雙路控制能力,可做到按流量、按讀寫、按訪問類別(生產(chǎn)、測試)等做數(shù)據(jù)訪問路由。
? 基礎(chǔ)運維
此部分的能力比較多,本質(zhì)就是同時提供異構(gòu)數(shù)據(jù)庫在線同步運維能力。例如包括統(tǒng)一變更、統(tǒng)一導(dǎo)入導(dǎo)出、統(tǒng)一授權(quán)、統(tǒng)一審計等。盡量從運維側(cè)角度來看,后面是一套邏輯庫。