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

58沈劍:100億數據平滑數據遷移,不影響服務

開發 開發工具
針對互聯網很多“數據量較大,并發量較大,業務復雜度較高”的業務場景,在眾多需求下,需要進行數據遷移,完成“平滑遷移數據,遷移過程不停機,保證系統持續服務”有兩種常見的解決方案。

數據

一、問題的提出

互聯網有很多“數據量較大,并發量較大,業務復雜度較高”的業務場景,其典型系統分層架構如下:

[[186551]]

  • 上游是業務層biz,實現個性化的業務邏輯
  • 中游是服務層service,封裝數據訪問
  • 下游是數據層db,存儲固化的業務數據

服務化分層架構的好處是,服務層屏蔽下游數據層的復雜性,例如緩存、分庫分表、存儲引擎等存儲細節不需要向調用方暴露,而只向上游提供方便的RPC訪問接口,當有一些數據層變化的時候,所有的調用方也不需要升級,只需要服務層升級即可。

互聯網架構,很多時候面臨著這樣一些需求:

互聯網架構面臨的需求

需求1->底層表結構變更:數據量非常大的情況下,數據表增加了一些屬性,刪除了一些屬性,修改了一些屬性。

分庫個數變換

需求2->分庫個數變換:由于數據量的持續增加,底層分庫個數非成倍增加。

底層存儲介質變換

需求3->底層存儲介質變換:底層存儲引擎由一個數據庫換為另一個數據庫。

種種需求,都需要進行數據遷移,如何平滑遷移數據,遷移過程不停機,保證系統持續服務,是文本將要討論的問題。

二、停機方案

在討論平滑遷移數據方案之前,先看下不平滑的停機數據遷移方案,主要分三個步驟。

下不平滑的停機數據遷移方案步驟

步驟一:掛一個類似“為了給廣大用戶提供更好的服務,服務器會在凌晨0:00-0:400進行停機維護”的公告,并在對應時段進行停機,這個時段系統沒有流量進入。

下不平滑的停機數據遷移方案步驟

步驟二:停機后,研發一個離線的數據遷移工具,進行數據遷移。針對***節的三類需求,會分別開發不同的數據遷移工具。

  • 底層表結構變更需求:開發舊表導新表的工具
  • 分庫個數變換需求:開發2庫導3庫的工具
  • 底層存儲介質變換需求:開發Mongo導Mysql工具

下不平滑的停機數據遷移方案步驟

步驟三:恢復服務,并將流量切到新庫,不同的需求,可能會涉及不同服務升級。

  • 底層表結構變更需求:服務要升級到訪問新表
  • 分庫個數變換需求:服務不需要升級,只需要改尋庫路由配置
  • 底層存儲介質變換需求:服務升級到訪問新的存儲介質

總的來說,停機方案是相對直觀和簡單的,但對服務的可用性有影響,許多游戲公司的服務器升級,游戲分區與合區,可能會采用類似的方案。

除了影響服務的可用性,這個方案還有一個缺點,就是必須在指定時間完成升級,這個對研發、測試、運維同學來說,壓力會非常大,一旦出現問題例如數據不一致,必須在規定時間內解決,否則只能回滾。根據經驗,人壓力越大越容易出錯,這個缺點一定程度上是致命的。

無論如何,停機方案并不是今天要討論的重點,接下來看一下常見的平滑數據遷移方案。

三、平滑遷移-追日志法

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

平滑遷移-追日志法

數據遷移前,上游業務應用通過舊的服務訪問舊的數據。

平滑遷移前

步驟一:服務進行升級,記錄“對舊庫上的數據修改”的日志(這里的修改,為數據的insert, delete, update),這個日志不需要記錄詳細數據,主要記錄:

  • 被修改的庫
  • 被修改的表
  • 被修改的***主鍵

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

這個服務升級風險較小:

  • 寫接口是少數接口,改動點較少
  • 升級只是增加了一些日志,對業務功能沒有任何影響

平滑遷移-追日志法步驟

步驟二:研發一個數據遷移工具,進行數據遷移。這個數據遷移工具和離線遷移工具一樣,把舊庫中的數據轉移到新庫中來。

這個小工具的風險較小:

  • 整個過程依然是舊庫對線上提供服務
  • 小工具的復雜度較低
  • 任何時間發現問題,都可以把新庫中的數據干掉重來
  • 可以限速慢慢遷移,技術同學沒有時間壓力

1. 數據遷移完成之后,就能夠切到新庫提供服務了么?

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

哪些數據發生了變化呢?

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

平滑遷移-追日志法步驟

步驟三:研發一個讀取日志并遷移數據的小工具,要把步驟二遷移數據過程中產生的差異數據追平。這個小工具需要做的是:

  • 讀取日志,得到哪個庫、哪個表、哪個主鍵發生了變化
  • 把舊庫中對應主鍵的記錄讀取出來
  • 把新庫中對應主鍵的記錄替換掉

無論如何,原則是數據以舊庫為準。

這個小工具的風險也很小:

  • 整個過程依然是舊庫對線上提供服務
  • 小工具的復雜度較低
  • 任何時間發現問題,大不了從步驟二開始重來
  • 可以限速慢慢重放日志,技術同學沒有時間壓力

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

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

3. 什么時候數據會完全一致呢?

平滑遷移-追日志法步驟

步驟四:在持續重放日志,追平數據的過程中,研發一個數據校驗的小工具,將舊庫和新庫中的數據進行比對,直到數據完全一致。

這個小工具的風險依舊很小:

  • 整個過程依然是舊庫對線上提供服務
  • 小工具的復雜度較低
  • 任何時間發現問題,大不了從步驟二開始重來
  • 可以限速慢慢比對數據,技術同學沒有時間壓力

平滑遷移-追日志法步驟

步驟五:在數據比對完全一致之后,將流量遷移到新庫,新庫提供服務,完成遷移。

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

至此,升級完畢,整個過程能夠持續對線上提供服務,不影響服務的可用性。

四、平滑遷移-雙寫法

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

平滑遷移-雙寫法

數據遷移前,上游業務應用通過舊的服務訪問舊的數據。

平滑遷移-雙寫法前

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

  • 舊庫與新庫的同時insert
  • 舊庫與新庫的同時delete
  • 舊庫與新庫的同時update

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

這個服務升級風險較小:

  • 寫接口是少數接口,改動點較少
  • 新庫的寫操作執行成功與否,對業務功能沒有任何影響

平滑遷移-雙寫法步驟

步驟二:研發一個數據遷移工具,進行數據遷移。這個數據遷移工具在本文中已經出現第三次了,把舊庫中的數據轉移到新庫中來。

這個小工具的風險較小:

  • 整個過程依然是舊庫對線上提供服務
  • 小工具的復雜度較低
  • 任何時間發現問題,都可以把新庫中的數據干掉重來
  • 可以限速慢慢遷移,技術同學沒有時間壓力

1. 數據遷移完成之后,就能夠切到新庫提供服務了么?

答案是肯定的,因為前置步驟進行了雙寫,所以理論上數據遷移完之后,新庫與舊庫的數據應該完全一致。

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

平滑遷移-雙寫法步驟

如上圖所示:

  • 左側是舊庫中的數據,右側是新庫中的數據
  • 按照primary key從min到max的順序,分段,限速進行數據的遷移,假設已經遷移到now這個數據段

數據遷移過程中的修改操作分別討論:

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

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

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

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

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

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

這樣,會出現新庫比舊庫多出一條數據X。

但無論如何,為了保證數據的一致性,切庫之前,還是需要進行數據校驗的。

平滑遷移-雙寫法步驟

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

這個小工具的風險依舊很小:

  • 整個過程依然是舊庫對線上提供服務
  • 小工具的復雜度較低
  • 任何時間發現問題,大不了從步驟二開始重來
  • 可以限速慢慢比對數據,技術同學沒有時間壓力

平滑遷移-雙寫法

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

至此,升級完畢,整個過程能夠持續對線上提供服務,不影響服務的可用性。

五、總結

針對互聯網很多“數據量較大,并發量較大,業務復雜度較高”的業務場景,在

  • 底層表結構變更
  • 分庫個數變換
  • 底層存儲介質變換

眾多需求下,需要進行數據遷移,完成“平滑遷移數據,遷移過程不停機,保證系統持續服務”有兩種常見的解決方案。

1. 追日志法,五個步驟:

  • 服務進行升級,記錄“對舊庫上的數據修改”的日志
  • 研發一個數據遷移小工具,進行數據遷移
  • 研發一個讀取日志小工具,追平數據差異
  • 研發一個數據比對小工具,校驗數據一致性
  • 流量切到新庫,完成平滑遷移

2. 雙寫法,四個步驟:

  • 服務進行升級,記錄“對舊庫上的數據修改”進行新庫的雙寫
  • 研發一個數據遷移小工具,進行數據遷移
  • 研發一個數據比對小工具,校驗數據一致性
  • 流量切到新庫,完成平滑遷移

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2019-07-29 10:18:17

數據庫高可用架構

2017-02-10 11:26:39

數據庫擴容架構

2024-08-22 14:16:08

2018-01-24 09:35:12

高并發數據庫設計水平切分

2017-03-23 23:04:03

2018-06-14 21:47:46

WOT沈劍58速運

2018-03-15 11:23:59

微服務架構實踐

2017-04-17 07:00:54

uiduname數據庫

2023-11-14 08:44:55

數倍數據

2009-01-18 11:11:36

InnoDBMySQLMVCC

2015-10-27 10:33:03

架構設計演進

2019-05-27 09:56:00

數據庫高可用架構

2025-02-21 08:20:33

2017-01-19 18:20:59

數據架構數據庫

2020-08-11 10:25:38

數據成本數據大數據

2015-01-26 14:35:22

數據中心遷移

2022-09-13 14:52:09

云遷移數據資產數據中心

2017-01-05 08:54:15

OctopressHugo遷移

2021-03-01 10:10:39

數據遷移擴容

2019-03-05 10:16:54

數據分區表SQLserver
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色av网站免费看 | 久久国产视频网站 | 日韩一级 | 国产精品美女一区二区三区 | 国产精品久久久 | 精品久久久久久久久久久 | 视频一区二区中文字幕 | 欧美成人免费在线视频 | 亚洲一区中文 | 黄色91在线| 成人免费观看男女羞羞视频 | 亚洲国产精品福利 | 精品一二区 | 久久久久久久久久久久亚洲 | 天天操操操操操 | 91在线一区二区 | 国产午夜精品一区二区三区嫩草 | 又爽又黄axxx片免费观看 | 国产一级一级国产 | 久久99蜜桃综合影院免费观看 | 成人欧美一区二区三区在线观看 | 亚洲精品久久嫩草网站秘色 | 9porny九色视频自拍 | a级性视频 | 一区二区三区免费观看 | 99亚洲国产精品 | 亚洲一卡二卡 | 天天干狠狠 | 久久国产精品72免费观看 | 欧美一级二级三级 | 久草免费福利 | 欧美一卡二卡在线观看 | 一级毛片网| 国精产品一品二品国精在线观看 | 91一区 | 欧美精品久久久 | 国产精品一区一区 | 中文字幕一区二区三区乱码在线 | 亚洲精品在线观看视频 | 91视频在线观看 | 欧美日韩亚洲国产 |