摘要:數(shù)據(jù)遷移,主要利用阿里云數(shù)據(jù)傳輸服務(wù)的數(shù)據(jù)遷移能力,涉及到全量遷移增量遷移一致性校驗(yàn)及反向任務(wù)。小結(jié)通過(guò)周密的遷移方案設(shè)計(jì),以及強(qiáng)大的數(shù)據(jù)遷移工具的能力,閑魚商品庫(kù)順利完成億在線數(shù)據(jù)庫(kù)服務(wù)遷移,獨(dú)立的物理部署顯著提升商品庫(kù)在線服務(wù)的穩(wěn)定性。
背景
在系統(tǒng)的快速迭代過(guò)程中,業(yè)務(wù)系統(tǒng)往往部署在同一個(gè)物理庫(kù),沒(méi)有做核心數(shù)據(jù)和非核心數(shù)據(jù)的物理隔離。隨著數(shù)據(jù)量的擴(kuò)大這種情況會(huì)帶來(lái)穩(wěn)定性的風(fēng)險(xiǎn),如庫(kù)的慢sql,磁盤,IO等等都會(huì)相互整體影響,從而影響核心系統(tǒng)的業(yè)務(wù)穩(wěn)定性,因此需要將核心業(yè)務(wù)的業(yè)務(wù)表從原有庫(kù)里抽取出來(lái),多帶帶到新庫(kù)里。而核心數(shù)據(jù)的遷移,涉及到的一個(gè)關(guān)鍵難點(diǎn):如何平穩(wěn)及用戶無(wú)感知的遷移數(shù)據(jù),本文將結(jié)合閑魚商品庫(kù)遷移實(shí)踐,向大家展示如何解決這個(gè)難題的.
閑魚商品數(shù)據(jù)現(xiàn)狀閑魚商品數(shù)據(jù)量XX億級(jí)別以上,采用分表分庫(kù)和讀寫分離的MYSQL數(shù)據(jù)庫(kù)集群來(lái)支撐線上查詢服務(wù),如下圖,通過(guò)TDDL[1]數(shù)據(jù)庫(kù)中間件進(jìn)行高效統(tǒng)一管理。可能有些同學(xué)會(huì)對(duì)分表分庫(kù)相關(guān)概念不了解,這里先簡(jiǎn)單做些介紹。
01分表分庫(kù)原理
本質(zhì)是數(shù)據(jù)庫(kù)的水平拆分問(wèn)題,把一個(gè)數(shù)據(jù)庫(kù)切分成多個(gè)部分放到不同的數(shù)據(jù)庫(kù)(server)上,從而緩解單一數(shù)據(jù)庫(kù)的性能問(wèn)題,下圖描述分表分庫(kù)的核心原理:
當(dāng)然分表分庫(kù)也有負(fù)面影響,就是表結(jié)構(gòu)變更及相關(guān)管理相比單表麻煩,有一定風(fēng)險(xiǎn),具體如何決擇,還是要根據(jù)實(shí)際情況來(lái)分析。
02分表分庫(kù)下全局Sequence生成
分表分庫(kù)解決在線服務(wù)容量和性能問(wèn)題,但是也帶來(lái)使用上的復(fù)雜度提升。靈活的配置路由規(guī)則和路由數(shù)據(jù)并提供簡(jiǎn)單易用的封裝都是要考慮的,以便業(yè)務(wù)對(duì)此無(wú)感知。阿里開(kāi)源中間件產(chǎn)品TDDL提供了解決方案,對(duì)應(yīng)阿里云上產(chǎn)品為:DRDS[2]。
TDDL關(guān)鍵原理不多做介紹,但是在數(shù)據(jù)庫(kù)遷移過(guò)程中主鍵沖突風(fēng)險(xiǎn)是故障重要風(fēng)險(xiǎn)點(diǎn),這里簡(jiǎn)要介紹下TDDL的全局唯一主鍵生成原理。
如上圖,TDDL Sequence是基于數(shù)據(jù)庫(kù)更新+內(nèi)存分配:每次操作批量分配id,分配id的數(shù)量就是sequence的內(nèi)步長(zhǎng),而原有id值就加上外部長(zhǎng)值,后續(xù)的分配直接就在內(nèi)存里拿,這樣的優(yōu)勢(shì):簡(jiǎn)單高效 缺點(diǎn):無(wú)法保證自增順序。
另外數(shù)據(jù)遷移過(guò)程中,在新庫(kù)中,為了保證跟原數(shù)據(jù)庫(kù)主鍵非沖突,需要設(shè)置一個(gè)躍遷比較大的主鍵,防止出現(xiàn)兩個(gè)庫(kù)中的主鍵沖突,這是后續(xù)遷移中要注意的關(guān)鍵點(diǎn)之一。
數(shù)據(jù)遷移方案通過(guò)前文的簡(jiǎn)單介紹,大家對(duì)閑魚商品庫(kù)現(xiàn)狀有了初步了解,下面將給大家介紹一下閑魚是如何做到穩(wěn)定遷移商品庫(kù)的。
01核心思路
數(shù)據(jù)遷移核心思路抽象起來(lái)其實(shí)很簡(jiǎn)單,即如何穩(wěn)定平滑遷移數(shù)據(jù),如下圖所示:
但圍繞這個(gè)過(guò)程細(xì)化下去,我們會(huì)遇到不少問(wèn)題,如:
1、數(shù)據(jù)我們?cè)撊绾芜w移,是一次性?還是分階段?
2、如何校驗(yàn)數(shù)據(jù)遷移過(guò)程的正確性?
3、我們業(yè)務(wù)改造有問(wèn)題怎么辦?如何盡早發(fā)現(xiàn)?如何回滾?
4、我們的新庫(kù)性能如何?
帶著這些問(wèn)題,我們進(jìn)一下細(xì)化梳理遷移方案。
02實(shí)現(xiàn)方案
如上圖所示,整個(gè)方案分為幾個(gè)部份:
1、系統(tǒng)改造,包括SQL改造,雙寫開(kāi)關(guān),新庫(kù)sequence創(chuàng)建。
SQL改造:加載兩套TDDL數(shù)據(jù)源,一套是給老庫(kù)的,一套是給新庫(kù)的,并且生成兩套mybatis sql 模板。
雙寫開(kāi)關(guān):設(shè)置好寫新庫(kù),寫老庫(kù)的開(kāi)關(guān),用于線上遷移過(guò)程中雙寫過(guò)程及遇到問(wèn)題及時(shí)回滾。
sequence創(chuàng)建:遷移sequence表時(shí),需要抬升新庫(kù)的sequence表中的值,用于防止主鍵沖突,并且需要按照主鍵消耗量評(píng)估一個(gè)安全值,這是非常重要的一個(gè)細(xì)節(jié),再次強(qiáng)調(diào)一下。
2、穩(wěn)定性保障,遷庫(kù)是大事,改造過(guò)程中,穩(wěn)定性重中之重,主要有系統(tǒng)壓測(cè),線上流量回放,故障演練。
系統(tǒng)壓測(cè):主要針對(duì)新庫(kù)進(jìn)行性能測(cè),防止新庫(kù)有意外情況。
線上流量回放:Edsger W. Dijkstra說(shuō)過(guò)如果調(diào)試程序是一種標(biāo)準(zhǔn)的可以鏟除BUG的流程,那么,編程就是把他們放進(jìn)來(lái)的流程。通過(guò)引入線上數(shù)據(jù)在測(cè)試環(huán)境回放,可以盡可能的發(fā)現(xiàn)問(wèn)題,保證改造后的穩(wěn)定性。
故障演練:通過(guò)注入一些人為故障,如寫新庫(kù)失敗,新庫(kù)邏輯有問(wèn)題,及時(shí)的演練回滾策略。
3、數(shù)據(jù)遷移,主要利用阿里云數(shù)據(jù)傳輸服務(wù)DTS[3]的數(shù)據(jù)遷移能力,涉及到全量遷移、增量遷移、一致性校驗(yàn)及反向任務(wù)。
全量遷移:數(shù)據(jù)遷移首要目標(biāo)如何將歷史全量數(shù)據(jù)遷移到新庫(kù)中,我們的做法是指定一個(gè)時(shí)間點(diǎn),再根據(jù)這個(gè)時(shí)間點(diǎn)查找每張?jiān)幢淼淖畲蠹白钚d,然后分別批量導(dǎo)到目標(biāo)庫(kù)中,如圖:
整個(gè)過(guò)程都是查詢?cè)诰€庫(kù)的備庫(kù),因此不影響在線業(yè)務(wù)的數(shù)據(jù)庫(kù)服務(wù)。
增量遷移:由于遷移過(guò)程中業(yè)務(wù)服務(wù)一直運(yùn)行,因此全量遷移完全成,并且要將全量時(shí)間點(diǎn)后的數(shù)據(jù)追回來(lái),這里核心原理是同步全量時(shí)間位點(diǎn)后binlog日志數(shù)據(jù)來(lái)保證數(shù)據(jù)一致性,需要注意的是增量時(shí)間需要前移一小斷時(shí)間(如5分鐘),其主要原因是全量遷移啟動(dòng)的那刻會(huì)有時(shí)間差,需要增量前移來(lái)保證數(shù)據(jù)最終一致性,如下圖:
一致性校驗(yàn):通過(guò)全量及增量的遷移后,此時(shí)源庫(kù)跟目標(biāo)的數(shù)據(jù)理論上是一致的,但實(shí)際上應(yīng)用在經(jīng)過(guò)功能測(cè)試,線上流量回放等階段,數(shù)據(jù)在這個(gè)過(guò)程中有可能會(huì)現(xiàn)不一致的情況,因此正式上線前,需要做數(shù)據(jù)一致性校驗(yàn),其原理是分批查詢?cè)幢?跟全量遷移的查詢方式類似),再跟目標(biāo)庫(kù)進(jìn)行比對(duì),如圖所示:
反向任務(wù):遷移到新庫(kù)后,會(huì)有一線離線業(yè)務(wù)對(duì)老庫(kù)還有依賴,需要建立從新庫(kù)到老庫(kù)的回流任務(wù),原理跟增量遷移一樣,只是變更一下原庫(kù)及目標(biāo)庫(kù)。
03遷庫(kù)流程
到這里大家應(yīng)該對(duì)遷庫(kù)所涉及到點(diǎn)比較清楚了,但還有一個(gè)非常重要的事,即梳理整個(gè)遷庫(kù)步驟非常關(guān)鍵,通常會(huì)有兩種方案。
方案一:
1、DTS數(shù)據(jù)追平,即全量同步完成,開(kāi)啟增量同步,并且延遲在秒級(jí)以內(nèi)。
2、上線前校驗(yàn),主要有線上流量回放、壓測(cè)、一致性校驗(yàn),故障演練。
3、線上開(kāi)雙寫,線上同時(shí)寫新庫(kù)及老庫(kù),這時(shí)需要關(guān)閉增量同步任務(wù),防止無(wú)效覆蓋。
4、線上校驗(yàn),執(zhí)行預(yù)先準(zhǔn)備的測(cè)試腳本并結(jié)合一致性校驗(yàn)工具,同時(shí)將讀流量慢慢切到新庫(kù),驗(yàn)證雙寫邏輯。
5、切換數(shù)據(jù)源,關(guān)閉雙寫并正式寫入新庫(kù)。
6、創(chuàng)建反向任務(wù),數(shù)據(jù)回流老庫(kù)。
方案二:
1、DTS數(shù)據(jù)追平,即全量同步完成,開(kāi)啟增量同步,并且延遲在秒級(jí)以內(nèi)。
2、上線前校驗(yàn),主要有線上流量回放、壓測(cè)、一致性校驗(yàn),故障演練。
3、線上切開(kāi)關(guān),寫新庫(kù), 同時(shí)需要關(guān)閉增量同步任務(wù),防止無(wú)效覆蓋。
4、創(chuàng)建反向任務(wù),數(shù)據(jù)回流老庫(kù)。
方案優(yōu)缺點(diǎn)對(duì)比:
總結(jié)起來(lái)方案1遷移流程相對(duì)復(fù)雜,對(duì)遷移的控制力度更細(xì),適合業(yè)務(wù)復(fù)雜,底層改造比較多,想精細(xì)化控制遷移步驟的場(chǎng)景,方案2遷移相對(duì)簡(jiǎn)單,過(guò)程快速,適合業(yè)務(wù)流程相對(duì)簡(jiǎn)單,可控,想快速切換的場(chǎng)景,具體選選擇哪個(gè)方案,同學(xué)們可以根據(jù)自身的業(yè)務(wù)情況做選擇。
這里考慮到閑魚商品業(yè)務(wù)復(fù)雜,底層改造較多,從穩(wěn)定性的角度考慮,最終選擇方案1。
方案1,最關(guān)鍵的是3、4、5步驟,因此需要預(yù)先做好回滾計(jì)劃。
04回滾方案
回滾方案總原則是不丟數(shù)據(jù)。最有可能的發(fā)生點(diǎn)是雙寫期間新庫(kù)出問(wèn)題,導(dǎo)致線上服務(wù)異常,這時(shí)只要立即關(guān)閉寫新庫(kù)即可,另外就是切到新庫(kù)后,新庫(kù)出問(wèn)題了(如性能問(wèn)題),可以立即切回到老庫(kù),并通過(guò)反向任務(wù),保持?jǐn)?shù)據(jù)一致性,最后若沒(méi)啟用分布式事務(wù),雙寫的時(shí)間越短越好,有可能會(huì)有數(shù)據(jù)不一致情況。
小結(jié)通過(guò)周密的遷移方案設(shè)計(jì),以及DTS強(qiáng)大的數(shù)據(jù)遷移工具的能力,閑魚商品庫(kù)順利完成XX億在線數(shù)據(jù)庫(kù)服務(wù)遷移,獨(dú)立的物理部署顯著提升商品庫(kù)在線服務(wù)的穩(wěn)定性。然而不同業(yè)務(wù)系統(tǒng)的數(shù)據(jù)庫(kù)情況可能會(huì)有差異,如單庫(kù)向多庫(kù)遷移,單表向多表遷移等,不過(guò)整體方案大致類似,希望本文遷庫(kù)實(shí)踐方案能給大家提供一個(gè)可行的參考。
閱讀原文
本文來(lái)自云棲社區(qū)合作伙伴“閑魚技術(shù)”,如需轉(zhuǎn)載請(qǐng)聯(lián)系原作者。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/17940.html
摘要:從能力上分,一個(gè)是搬運(yùn)工,一個(gè)是設(shè)計(jì)者能寫代碼是愚公移山為什么說(shuō)能寫代碼是愚公移山呢我們中國(guó)大部分程序員都應(yīng)該處于一個(gè)初級(jí)程序員的水平,怎么講只有少數(shù)的程序員處于中高級(jí)水平。 導(dǎo)語(yǔ):你知道普通程序員和優(yōu)秀程序員之間的差距嗎?其實(shí)答案很簡(jiǎn)單,那就是「愚公移山」和「女媧補(bǔ)天」之間的區(qū)別。 之所以提這個(gè)話題,跟前兩天在微信群里的討論有關(guān),年后本該是跳槽、找工作的高峰月份,各公司面試邀約應(yīng)該很...
摘要:它是第一個(gè)把數(shù)據(jù)分布在全球范圍內(nèi)的系統(tǒng),并且支持外部一致性的分布式事務(wù)。目的是使得開(kāi)發(fā)者閱讀之后,能對(duì)項(xiàng)目有一個(gè)初步了解,更好的參與進(jìn)入的開(kāi)發(fā)中。深度探索數(shù)據(jù)庫(kù)并發(fā)控制技術(shù)并發(fā)控制技術(shù)是數(shù)據(jù)庫(kù)事務(wù)處理的核心技術(shù)。 存儲(chǔ)過(guò)程高級(jí)篇 講解了一些存儲(chǔ)過(guò)程的高級(jí)特性,包括 cursor、schema、控制語(yǔ)句、事務(wù)等。 數(shù)據(jù)庫(kù)索引與事務(wù)管理 本篇文章為對(duì)數(shù)據(jù)庫(kù)知識(shí)的查缺補(bǔ)漏,從索引,事務(wù)管理,...
摘要:若函數(shù)不能執(zhí)行有效的轉(zhuǎn)換,返回。如果數(shù)值超過(guò)可表示的范圍,則返回或。示例輸入輸出解釋轉(zhuǎn)換截止于數(shù)字,因?yàn)樗南乱粋€(gè)字符不為數(shù)字。 這是我參與11月更文挑戰(zhàn)的第12天。一、寫在前面LeetCode 第一題兩數(shù)之和傳輸門:聽(tīng)說(shuō)你還在寫雙層for循環(huán)解兩數(shù)之和?LeetCode 第二題兩數(shù)之和傳輸門:兩個(gè)排序數(shù)組的中...
摘要:年系統(tǒng)第一次被一篇文章預(yù)測(cè)即將死亡,后來(lái)也撰寫報(bào)告稱,在全球企業(yè)中部署的高度定制化的企業(yè)資源規(guī)劃系統(tǒng)正在逐漸老化。到年,這些系統(tǒng)將成為遺留軟件。隨后又好幾次被傳死掉毫無(wú)疑問(wèn),云的廠商還會(huì)繼續(xù)這么做,但的成功也證明他存在的價(jià)值。本地ERP被SaaS ERP取代未來(lái)已來(lái),在商業(yè)應(yīng)用里,云的應(yīng)用似乎無(wú)處不在,簡(jiǎn)單的將其看作是應(yīng)用部署的一個(gè)選項(xiàng)肯定是不對(duì)的。那么云到底是什么呢?好處又有哪些?2000...
閱讀 2817·2023-04-25 22:51
閱讀 2057·2021-10-11 10:58
閱讀 3316·2019-08-30 10:49
閱讀 1877·2019-08-29 17:09
閱讀 3141·2019-08-29 10:55
閱讀 846·2019-08-26 10:34
閱讀 3492·2019-08-23 17:54
閱讀 985·2019-08-23 16:06