成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

58沈劍:100億數(shù)據(jù)平滑數(shù)據(jù)遷移,不影響服務(wù)

開發(fā) 開發(fā)工具
針對(duì)互聯(lián)網(wǎng)很多“數(shù)據(jù)量較大,并發(fā)量較大,業(yè)務(wù)復(fù)雜度較高”的業(yè)務(wù)場(chǎng)景,在眾多需求下,需要進(jìn)行數(shù)據(jù)遷移,完成“平滑遷移數(shù)據(jù),遷移過程不停機(jī),保證系統(tǒng)持續(xù)服務(wù)”有兩種常見的解決方案。

數(shù)據(jù)

一、問題的提出

互聯(lián)網(wǎng)有很多“數(shù)據(jù)量較大,并發(fā)量較大,業(yè)務(wù)復(fù)雜度較高”的業(yè)務(wù)場(chǎng)景,其典型系統(tǒng)分層架構(gòu)如下:

[[186551]]

  • 上游是業(yè)務(wù)層biz,實(shí)現(xiàn)個(gè)性化的業(yè)務(wù)邏輯
  • 中游是服務(wù)層service,封裝數(shù)據(jù)訪問
  • 下游是數(shù)據(jù)層db,存儲(chǔ)固化的業(yè)務(wù)數(shù)據(jù)

服務(wù)化分層架構(gòu)的好處是,服務(wù)層屏蔽下游數(shù)據(jù)層的復(fù)雜性,例如緩存、分庫(kù)分表、存儲(chǔ)引擎等存儲(chǔ)細(xì)節(jié)不需要向調(diào)用方暴露,而只向上游提供方便的RPC訪問接口,當(dāng)有一些數(shù)據(jù)層變化的時(shí)候,所有的調(diào)用方也不需要升級(jí),只需要服務(wù)層升級(jí)即可。

互聯(lián)網(wǎng)架構(gòu),很多時(shí)候面臨著這樣一些需求:

互聯(lián)網(wǎng)架構(gòu)面臨的需求

需求1->底層表結(jié)構(gòu)變更:數(shù)據(jù)量非常大的情況下,數(shù)據(jù)表增加了一些屬性,刪除了一些屬性,修改了一些屬性。

分庫(kù)個(gè)數(shù)變換

需求2->分庫(kù)個(gè)數(shù)變換:由于數(shù)據(jù)量的持續(xù)增加,底層分庫(kù)個(gè)數(shù)非成倍增加。

底層存儲(chǔ)介質(zhì)變換

需求3->底層存儲(chǔ)介質(zhì)變換:底層存儲(chǔ)引擎由一個(gè)數(shù)據(jù)庫(kù)換為另一個(gè)數(shù)據(jù)庫(kù)。

種種需求,都需要進(jìn)行數(shù)據(jù)遷移,如何平滑遷移數(shù)據(jù),遷移過程不停機(jī),保證系統(tǒng)持續(xù)服務(wù),是文本將要討論的問題。

二、停機(jī)方案

在討論平滑遷移數(shù)據(jù)方案之前,先看下不平滑的停機(jī)數(shù)據(jù)遷移方案,主要分三個(gè)步驟。

下不平滑的停機(jī)數(shù)據(jù)遷移方案步驟

步驟一:掛一個(gè)類似“為了給廣大用戶提供更好的服務(wù),服務(wù)器會(huì)在凌晨0:00-0:400進(jìn)行停機(jī)維護(hù)”的公告,并在對(duì)應(yīng)時(shí)段進(jìn)行停機(jī),這個(gè)時(shí)段系統(tǒng)沒有流量進(jìn)入。

下不平滑的停機(jī)數(shù)據(jù)遷移方案步驟

步驟二:停機(jī)后,研發(fā)一個(gè)離線的數(shù)據(jù)遷移工具,進(jìn)行數(shù)據(jù)遷移。針對(duì)***節(jié)的三類需求,會(huì)分別開發(fā)不同的數(shù)據(jù)遷移工具。

  • 底層表結(jié)構(gòu)變更需求:開發(fā)舊表導(dǎo)新表的工具
  • 分庫(kù)個(gè)數(shù)變換需求:開發(fā)2庫(kù)導(dǎo)3庫(kù)的工具
  • 底層存儲(chǔ)介質(zhì)變換需求:開發(fā)Mongo導(dǎo)Mysql工具

下不平滑的停機(jī)數(shù)據(jù)遷移方案步驟

步驟三:恢復(fù)服務(wù),并將流量切到新庫(kù),不同的需求,可能會(huì)涉及不同服務(wù)升級(jí)。

  • 底層表結(jié)構(gòu)變更需求:服務(wù)要升級(jí)到訪問新表
  • 分庫(kù)個(gè)數(shù)變換需求:服務(wù)不需要升級(jí),只需要改尋庫(kù)路由配置
  • 底層存儲(chǔ)介質(zhì)變換需求:服務(wù)升級(jí)到訪問新的存儲(chǔ)介質(zhì)

總的來說,停機(jī)方案是相對(duì)直觀和簡(jiǎn)單的,但對(duì)服務(wù)的可用性有影響,許多游戲公司的服務(wù)器升級(jí),游戲分區(qū)與合區(qū),可能會(huì)采用類似的方案。

除了影響服務(wù)的可用性,這個(gè)方案還有一個(gè)缺點(diǎn),就是必須在指定時(shí)間完成升級(jí),這個(gè)對(duì)研發(fā)、測(cè)試、運(yùn)維同學(xué)來說,壓力會(huì)非常大,一旦出現(xiàn)問題例如數(shù)據(jù)不一致,必須在規(guī)定時(shí)間內(nèi)解決,否則只能回滾。根據(jù)經(jīng)驗(yàn),人壓力越大越容易出錯(cuò),這個(gè)缺點(diǎn)一定程度上是致命的。

無(wú)論如何,停機(jī)方案并不是今天要討論的重點(diǎn),接下來看一下常見的平滑數(shù)據(jù)遷移方案。

三、平滑遷移-追日志法

平滑遷移方案一,追日志法,這個(gè)方案主要分為五個(gè)步驟。

平滑遷移-追日志法

數(shù)據(jù)遷移前,上游業(yè)務(wù)應(yīng)用通過舊的服務(wù)訪問舊的數(shù)據(jù)。

平滑遷移前

步驟一:服務(wù)進(jìn)行升級(jí),記錄“對(duì)舊庫(kù)上的數(shù)據(jù)修改”的日志(這里的修改,為數(shù)據(jù)的insert, delete, update),這個(gè)日志不需要記錄詳細(xì)數(shù)據(jù),主要記錄:

  • 被修改的庫(kù)
  • 被修改的表
  • 被修改的***主鍵

具體新增了什么行,修改后的數(shù)據(jù)格式是什么,不需要詳細(xì)記錄。這樣的好處是,不管業(yè)務(wù)細(xì)節(jié)如何變化,日志的格式是固定的,這樣能保證方案的通用性。

這個(gè)服務(wù)升級(jí)風(fēng)險(xiǎn)較?。?/p>

  • 寫接口是少數(shù)接口,改動(dòng)點(diǎn)較少
  • 升級(jí)只是增加了一些日志,對(duì)業(yè)務(wù)功能沒有任何影響

平滑遷移-追日志法步驟

步驟二:研發(fā)一個(gè)數(shù)據(jù)遷移工具,進(jìn)行數(shù)據(jù)遷移。這個(gè)數(shù)據(jù)遷移工具和離線遷移工具一樣,把舊庫(kù)中的數(shù)據(jù)轉(zhuǎn)移到新庫(kù)中來。

這個(gè)小工具的風(fēng)險(xiǎn)較?。?/p>

  • 整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)
  • 小工具的復(fù)雜度較低
  • 任何時(shí)間發(fā)現(xiàn)問題,都可以把新庫(kù)中的數(shù)據(jù)干掉重來
  • 可以限速慢慢遷移,技術(shù)同學(xué)沒有時(shí)間壓力

1. 數(shù)據(jù)遷移完成之后,就能夠切到新庫(kù)提供服務(wù)了么?

答案是否定的,在數(shù)據(jù)遷移的過程中,舊庫(kù)依然對(duì)線上提供著服務(wù),庫(kù)中的數(shù)據(jù)隨時(shí)可能變化,這個(gè)變化并沒有反映到新庫(kù)中來,于是舊庫(kù)和新庫(kù)的數(shù)據(jù)并不一致,所以不能直接切庫(kù),需要將數(shù)據(jù)追平。

哪些數(shù)據(jù)發(fā)生了變化呢?

步驟一中日志里記錄的不就是么?

平滑遷移-追日志法步驟

步驟三:研發(fā)一個(gè)讀取日志并遷移數(shù)據(jù)的小工具,要把步驟二遷移數(shù)據(jù)過程中產(chǎn)生的差異數(shù)據(jù)追平。這個(gè)小工具需要做的是:

  • 讀取日志,得到哪個(gè)庫(kù)、哪個(gè)表、哪個(gè)主鍵發(fā)生了變化
  • 把舊庫(kù)中對(duì)應(yīng)主鍵的記錄讀取出來
  • 把新庫(kù)中對(duì)應(yīng)主鍵的記錄替換掉

無(wú)論如何,原則是數(shù)據(jù)以舊庫(kù)為準(zhǔn)。

這個(gè)小工具的風(fēng)險(xiǎn)也很小:

  • 整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)
  • 小工具的復(fù)雜度較低
  • 任何時(shí)間發(fā)現(xiàn)問題,大不了從步驟二開始重來
  • 可以限速慢慢重放日志,技術(shù)同學(xué)沒有時(shí)間壓力

2. 日志重放之后,就能夠切到新庫(kù)提供服務(wù)了么?

答案依然是否定的,在日志重放的過程中,舊庫(kù)中又可能有數(shù)據(jù)發(fā)生了變化,導(dǎo)致數(shù)據(jù)不一致,所以還是不能切庫(kù),需要進(jìn)一步讀取日志,追平記錄。可以看到,重放日志追平數(shù)據(jù)的程序是一個(gè)while(1)的程序,新庫(kù)與舊庫(kù)中的數(shù)據(jù)追平也會(huì)是一個(gè)“***逼近”的過程。

3. 什么時(shí)候數(shù)據(jù)會(huì)完全一致呢?

平滑遷移-追日志法步驟

步驟四:在持續(xù)重放日志,追平數(shù)據(jù)的過程中,研發(fā)一個(gè)數(shù)據(jù)校驗(yàn)的小工具,將舊庫(kù)和新庫(kù)中的數(shù)據(jù)進(jìn)行比對(duì),直到數(shù)據(jù)完全一致。

這個(gè)小工具的風(fēng)險(xiǎn)依舊很小:

  • 整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)
  • 小工具的復(fù)雜度較低
  • 任何時(shí)間發(fā)現(xiàn)問題,大不了從步驟二開始重來
  • 可以限速慢慢比對(duì)數(shù)據(jù),技術(shù)同學(xué)沒有時(shí)間壓力

平滑遷移-追日志法步驟

步驟五:在數(shù)據(jù)比對(duì)完全一致之后,將流量遷移到新庫(kù),新庫(kù)提供服務(wù),完成遷移。

如果步驟四數(shù)據(jù)一直是99.9%的一致,不能完全一致,也是正常的,可以做一個(gè)秒級(jí)的舊庫(kù)readonly,等日志重放程序完全追上數(shù)據(jù)后,再進(jìn)行切庫(kù)切流量。

至此,升級(jí)完畢,整個(gè)過程能夠持續(xù)對(duì)線上提供服務(wù),不影響服務(wù)的可用性。

四、平滑遷移-雙寫法

平滑遷移方案二,雙寫法,這個(gè)方案主要分為四個(gè)步驟。

平滑遷移-雙寫法

數(shù)據(jù)遷移前,上游業(yè)務(wù)應(yīng)用通過舊的服務(wù)訪問舊的數(shù)據(jù)。

平滑遷移-雙寫法前

步驟一:服務(wù)進(jìn)行升級(jí),對(duì)“對(duì)舊庫(kù)上的數(shù)據(jù)修改”(這里的修改,為數(shù)據(jù)的insert, delete, update),在新庫(kù)上進(jìn)行相同的修改操作,這就是所謂的“雙寫”,主要修改操作包括:

  • 舊庫(kù)與新庫(kù)的同時(shí)insert
  • 舊庫(kù)與新庫(kù)的同時(shí)delete
  • 舊庫(kù)與新庫(kù)的同時(shí)update

由于新庫(kù)中此時(shí)是沒有數(shù)據(jù)的,所以雙寫舊庫(kù)與新庫(kù)中的affect rows可能不一樣,不過這完全不影響業(yè)務(wù)功能,只要不切庫(kù),依然是舊庫(kù)提供業(yè)務(wù)服務(wù)。

這個(gè)服務(wù)升級(jí)風(fēng)險(xiǎn)較?。?/p>

  • 寫接口是少數(shù)接口,改動(dòng)點(diǎn)較少
  • 新庫(kù)的寫操作執(zhí)行成功與否,對(duì)業(yè)務(wù)功能沒有任何影響

平滑遷移-雙寫法步驟

步驟二:研發(fā)一個(gè)數(shù)據(jù)遷移工具,進(jìn)行數(shù)據(jù)遷移。這個(gè)數(shù)據(jù)遷移工具在本文中已經(jīng)出現(xiàn)第三次了,把舊庫(kù)中的數(shù)據(jù)轉(zhuǎn)移到新庫(kù)中來。

這個(gè)小工具的風(fēng)險(xiǎn)較小:

  • 整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)
  • 小工具的復(fù)雜度較低
  • 任何時(shí)間發(fā)現(xiàn)問題,都可以把新庫(kù)中的數(shù)據(jù)干掉重來
  • 可以限速慢慢遷移,技術(shù)同學(xué)沒有時(shí)間壓力

1. 數(shù)據(jù)遷移完成之后,就能夠切到新庫(kù)提供服務(wù)了么?

答案是肯定的,因?yàn)榍爸貌襟E進(jìn)行了雙寫,所以理論上數(shù)據(jù)遷移完之后,新庫(kù)與舊庫(kù)的數(shù)據(jù)應(yīng)該完全一致。

由于遷移數(shù)據(jù)的過程中,舊庫(kù)新庫(kù)雙寫操作在同時(shí)進(jìn)行,怎么證明數(shù)據(jù)遷移完成之后數(shù)據(jù)就完全一致了呢?

平滑遷移-雙寫法步驟

如上圖所示:

  • 左側(cè)是舊庫(kù)中的數(shù)據(jù),右側(cè)是新庫(kù)中的數(shù)據(jù)
  • 按照primary key從min到max的順序,分段,限速進(jìn)行數(shù)據(jù)的遷移,假設(shè)已經(jīng)遷移到now這個(gè)數(shù)據(jù)段

數(shù)據(jù)遷移過程中的修改操作分別討論:

(1)假設(shè)遷移過程中進(jìn)行了一個(gè)雙insert操作,舊庫(kù)新庫(kù)都插入了數(shù)據(jù),數(shù)據(jù)一致性沒有被破壞

(2)假設(shè)遷移過程中進(jìn)行了一個(gè)雙delete操作,這又分為兩種情況

  • 假設(shè)這delete的數(shù)據(jù)屬于[min,now]范圍,即已經(jīng)完成遷移,則舊庫(kù)新庫(kù)都刪除了數(shù)據(jù),數(shù)據(jù)一致性沒有被破壞
  • 假設(shè)這delete的數(shù)據(jù)屬于[now,max]范圍,即未完成遷移,則舊庫(kù)中刪除操作的affect rows為1,新庫(kù)中刪除操作的affect rows為0,但是數(shù)據(jù)遷移工具在后續(xù)數(shù)據(jù)遷移中,并不會(huì)將這條舊庫(kù)中被刪除的數(shù)據(jù)遷移到新庫(kù)中,所以數(shù)據(jù)一致性仍沒有被破壞

(3)假設(shè)遷移過程中進(jìn)行了一個(gè)雙update操作,可以認(rèn)為update操作是一個(gè)delete加一個(gè)insert操作的復(fù)合操作,所以數(shù)據(jù)仍然是一致的

除非除非除非,在一種非常非常非常極限的情況下:

  • date-migrate-tool剛好從舊庫(kù)中將某一條數(shù)據(jù)X取出
  • 在X插入到新庫(kù)中之前,舊庫(kù)與新庫(kù)中剛好對(duì)X進(jìn)行了雙delete操作
  • date-migrate-tool再將X插入到新庫(kù)中

這樣,會(huì)出現(xiàn)新庫(kù)比舊庫(kù)多出一條數(shù)據(jù)X。

但無(wú)論如何,為了保證數(shù)據(jù)的一致性,切庫(kù)之前,還是需要進(jìn)行數(shù)據(jù)校驗(yàn)的。

平滑遷移-雙寫法步驟

步驟三:在數(shù)據(jù)遷移完成之后,需要使用數(shù)據(jù)校驗(yàn)的小工具,將舊庫(kù)和新庫(kù)中的數(shù)據(jù)進(jìn)行比對(duì),完全一致則符合預(yù)期,如果出現(xiàn)步驟二中的極限不一致情況,則以舊庫(kù)中的數(shù)據(jù)為準(zhǔn)。

這個(gè)小工具的風(fēng)險(xiǎn)依舊很小:

  • 整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)
  • 小工具的復(fù)雜度較低
  • 任何時(shí)間發(fā)現(xiàn)問題,大不了從步驟二開始重來
  • 可以限速慢慢比對(duì)數(shù)據(jù),技術(shù)同學(xué)沒有時(shí)間壓力

平滑遷移-雙寫法

步驟四:數(shù)據(jù)完全一致之后,將流量切到新庫(kù),完成平滑數(shù)據(jù)遷移。

至此,升級(jí)完畢,整個(gè)過程能夠持續(xù)對(duì)線上提供服務(wù),不影響服務(wù)的可用性。

五、總結(jié)

針對(duì)互聯(lián)網(wǎng)很多“數(shù)據(jù)量較大,并發(fā)量較大,業(yè)務(wù)復(fù)雜度較高”的業(yè)務(wù)場(chǎng)景,在

  • 底層表結(jié)構(gòu)變更
  • 分庫(kù)個(gè)數(shù)變換
  • 底層存儲(chǔ)介質(zhì)變換

眾多需求下,需要進(jìn)行數(shù)據(jù)遷移,完成“平滑遷移數(shù)據(jù),遷移過程不停機(jī),保證系統(tǒng)持續(xù)服務(wù)”有兩種常見的解決方案。

1. 追日志法,五個(gè)步驟:

  • 服務(wù)進(jìn)行升級(jí),記錄“對(duì)舊庫(kù)上的數(shù)據(jù)修改”的日志
  • 研發(fā)一個(gè)數(shù)據(jù)遷移小工具,進(jìn)行數(shù)據(jù)遷移
  • 研發(fā)一個(gè)讀取日志小工具,追平數(shù)據(jù)差異
  • 研發(fā)一個(gè)數(shù)據(jù)比對(duì)小工具,校驗(yàn)數(shù)據(jù)一致性
  • 流量切到新庫(kù),完成平滑遷移

2. 雙寫法,四個(gè)步驟:

  • 服務(wù)進(jìn)行升級(jí),記錄“對(duì)舊庫(kù)上的數(shù)據(jù)修改”進(jìn)行新庫(kù)的雙寫
  • 研發(fā)一個(gè)數(shù)據(jù)遷移小工具,進(jìn)行數(shù)據(jù)遷移
  • 研發(fā)一個(gè)數(shù)據(jù)比對(duì)小工具,校驗(yàn)數(shù)據(jù)一致性
  • 流量切到新庫(kù),完成平滑遷移

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2019-07-29 10:18:17

數(shù)據(jù)庫(kù)高可用架構(gòu)

2017-02-10 11:26:39

數(shù)據(jù)庫(kù)擴(kuò)容架構(gòu)

2024-08-22 14:16:08

2018-01-24 09:35:12

高并發(fā)數(shù)據(jù)庫(kù)設(shè)計(jì)水平切分

2017-03-23 23:04:03

2018-03-15 11:23:59

微服務(wù)架構(gòu)實(shí)踐

2018-06-14 21:47:46

WOT沈劍58速運(yùn)

2017-04-17 07:00:54

uiduname數(shù)據(jù)庫(kù)

2023-11-14 08:44:55

數(shù)倍數(shù)據(jù)

2009-01-18 11:11:36

InnoDBMySQLMVCC

2015-10-27 10:33:03

架構(gòu)設(shè)計(jì)演進(jìn)

2019-05-27 09:56:00

數(shù)據(jù)庫(kù)高可用架構(gòu)

2025-02-21 08:20:33

2017-01-19 18:20:59

數(shù)據(jù)架構(gòu)數(shù)據(jù)庫(kù)

2020-08-11 10:25:38

數(shù)據(jù)成本數(shù)據(jù)大數(shù)據(jù)

2015-01-26 14:35:22

數(shù)據(jù)中心遷移

2022-09-13 14:52:09

云遷移數(shù)據(jù)資產(chǎn)數(shù)據(jù)中心

2017-01-05 08:54:15

OctopressHugo遷移

2019-03-05 10:16:54

數(shù)據(jù)分區(qū)表SQLserver

2021-03-01 10:10:39

數(shù)據(jù)遷移擴(kuò)容
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: av一区二区三区 | 日韩一二区在线观看 | 古装人性做爰av网站 | 亚洲欧美日韩精品 | 国产一区二区三区在线免费 | 久久久久国产 | 国产在线中文字幕 | 日韩中文一区 | 四虎海外 | 九色国产 | 久久久久久久久久久成人 | 国产美女精品视频免费观看 | 欧美一级二级三级视频 | 一区二区三区精品 | 国产成人在线视频播放 | 午夜一区二区三区在线观看 | 中文无吗 | 免费三级av | 久久久亚洲一区 | 欧美日本韩国一区二区三区 | 国产成人综合久久 | 天天久久 | 黄色国产在线播放 | 免费高清成人 | 亚洲一区二区三区四区五区中文 | 成年无码av片在线 | 精品久久ai电影 | 久久亚洲91| 午夜视频一区二区 | www.中文字幕.com | 日本亚洲一区 | 五月婷婷导航 | 福利片在线观看 | 久久国产日韩 | 欧美日韩中文在线 | 中文字幕免费在线 | 欧美最猛黑人xxxx黑人 | 日日夜夜操天天干 | 麻豆91精品91久久久 | 金莲网| 欧美久久久久 |