濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 一次mysql遷移的方案與踩坑實(shí)戰(zhàn)記錄

一次mysql遷移的方案與踩坑實(shí)戰(zhàn)記錄

熱門標(biāo)簽:智能外呼系統(tǒng)復(fù)位 外東北地圖標(biāo)注 話務(wù)外呼系統(tǒng)怎么樣 拉卡拉外呼系統(tǒng) 臨清電話機(jī)器人 云南電商智能外呼系統(tǒng)價(jià)格 大眾點(diǎn)評(píng)星級(jí)酒店地圖標(biāo)注 高清地圖標(biāo)注道路 400電話可以辦理嗎

背景

由于歷史業(yè)務(wù)數(shù)據(jù)采用mysql來(lái)存儲(chǔ)的,其中有一張操作記錄表video_log,每當(dāng)用戶創(chuàng)建、更新或者審核人員審核的時(shí)候,對(duì)應(yīng)的video_log就會(huì)加一條日志,這個(gè)log表只有insert,可想而知,1個(gè)video對(duì)應(yīng)多條log,一天10w video,平均統(tǒng)計(jì)一個(gè)video對(duì)應(yīng)5條log,那么一天50w的log, 一個(gè)月50 * 30 = 1500w條記錄, 一年就是1500 * 12 = 1.8億。目前線上已經(jīng)有2億多的數(shù)據(jù)了,由于log本身不面向C端,用于查詢問(wèn)題的,所以可以忍受一點(diǎn)的延遲。 但是隨著時(shí)間的積累,必然會(huì)越來(lái)越慢,影響效率,于是提出改造。

方案一:老數(shù)據(jù)備份

由于log本身不是最關(guān)鍵的數(shù)據(jù),但是也要求實(shí)時(shí)性高(用于實(shí)時(shí)查詢問(wèn)題),所以一開(kāi)始的想法是核心的基礎(chǔ)存儲(chǔ)還是保持不變,較老的數(shù)據(jù)遷移出去,畢竟突然去查詢一年前的操作記錄的概率很小,如果突然要查,可以走離線。設(shè)計(jì)的話,我們只需要一個(gè)定時(shí)腳本,每天在凌晨4點(diǎn)左右(業(yè)務(wù)低峰期)抽數(shù)據(jù)。抽出的數(shù)據(jù)可以上報(bào)到一些離線存儲(chǔ)(一般公司都有基于hive的數(shù)倉(cāng)之類的),這樣就可以保持線上的video_log的數(shù)據(jù)不會(huì)一直增長(zhǎng)。

方案二:分表

分表也是一種解決方案,相對(duì)方案一的好處就是,所有的數(shù)據(jù)都支持實(shí)時(shí)查,缺點(diǎn)是代碼要改造了。

  • 首先確認(rèn)sharding key,因?yàn)関ideo_log是和video綁定的,所以自然而然選擇video_id作為我們的sharding key
  • 按什么分表確定了,接下來(lái)確認(rèn)下分多少?gòu)埍?。先定個(gè)小目標(biāo),支撐3年。每張表最大數(shù)據(jù)量為1個(gè)億(由于我們的查詢簡(jiǎn)單),按照上面的統(tǒng)計(jì),我們3年大概:3*1.8=5.4億,那么大概需要5.4/1≈6張表。

接下來(lái)就是改造代碼了,得解決新老數(shù)據(jù)讀寫的問(wèn)題。

  • 新數(shù)據(jù)的插入直接插入新表
  • 由于log表只有insert,所以不存在update、delete這些操作,不需要考慮這些場(chǎng)景。
  • 分表后,一個(gè)video的log存在兩張表(老表和新表),所以臨時(shí)兩張表都查,然后做個(gè)合并
  • 同步老數(shù)據(jù)到新表中
  • 下線讀取老表的代碼

方案三:遷移至tidb

方案二的缺點(diǎn)比較明顯,3年后咋辦,繼續(xù)拆表?感覺(jué)始終有個(gè)歷史債在那。于是我們的目光定位到了tidb,tidb是分布式的數(shù)據(jù)庫(kù),接入了tidb,我們就無(wú)需關(guān)心分表了,這些tidb都幫我們做了,它會(huì)自己做節(jié)點(diǎn)的擴(kuò)容。由于是分布式的,所以tidb的主鍵是無(wú)序的,這點(diǎn)很重要。
整個(gè)流程大概分為以下4個(gè)步驟:

  1. 先雙寫(記錄下剛開(kāi)始雙寫時(shí)的mysql的id,在此id前的肯定都是老數(shù)據(jù))
  2. 同步老數(shù)據(jù)(通過(guò)第一步記錄的id來(lái)區(qū)分)
  3. 切讀(老數(shù)據(jù)同步完了)
  4. 下雙寫

重點(diǎn)說(shuō)下同步老數(shù)據(jù)遇到的坑

遷移至tidb,看似很簡(jiǎn)單,其實(shí)在job腳本這里隱藏著幾個(gè)坑。

  • 要考慮萬(wàn)一job中途斷了,重新啟動(dòng)咋辦,撇開(kāi)重頭跑數(shù)據(jù)的時(shí)間成本,已經(jīng)同步的數(shù)據(jù)重新跑會(huì)重復(fù),還要考慮重復(fù)數(shù)據(jù)的問(wèn)題。解決重復(fù)數(shù)據(jù)的問(wèn)題,可以對(duì)老表新加一個(gè)字段標(biāo)識(shí)是否已同步,每次同步完,更新下字段。缺點(diǎn):線上數(shù)據(jù)大,加個(gè)字段不太安全,可能造成線上阻塞。
  • 既然加個(gè)字段不好,那就用現(xiàn)有的主鍵id做約束,把主鍵id也同步過(guò)去,這樣就算腳本重啟,從頭開(kāi)始跑的,也因?yàn)橄嗤闹鹘∫呀?jīng)插入過(guò),那么就會(huì)報(bào)錯(cuò)跳過(guò)??此坪芡昝?,然而tidb是分布式的,主鍵id不是連續(xù)的,那么可能出現(xiàn)這樣一種情況。正常的業(yè)務(wù)數(shù)據(jù)插入tidb,tidb分配的主鍵id和mysql同步的主鍵id重復(fù),那么不管是誰(shuí),最后插入的那一條肯定是失敗的。

最終同步腳本方案

綜合考慮數(shù)據(jù)的重復(fù)性,job重啟效率性,和整個(gè)同步的效率性,我大概做出以下方案:

  1. 任務(wù)分批提升效率:首先根據(jù)處理能力和預(yù)期完成時(shí)間,先對(duì)老數(shù)據(jù)進(jìn)行分批,大概分了10批,10個(gè)job去跑不同批次的數(shù)據(jù),互不干擾,且每次批量更新100條。
  2. 記錄狀態(tài),重啟自動(dòng)恢復(fù)到斷點(diǎn):每次同步數(shù)據(jù)后記錄下當(dāng)前同步的位置(redis記錄下當(dāng)前的id),就算重啟也可以從redis里拿到之前的更新位置,接著更新。
  3. 避免主鍵沖突:同步除了主鍵之外的所有字段(不同步主鍵)

最終通過(guò)方案三的四個(gè)切換步驟+高效率的同步腳本平穩(wěn)的完成了數(shù)據(jù)的遷移

總結(jié)

到此這篇關(guān)于mysql遷移的方案與踩坑的文章就介紹到這了,更多相關(guān)mysql遷移方案與踩坑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL數(shù)據(jù)庫(kù)遷移data文件夾位置詳細(xì)步驟
  • Mysql的數(shù)據(jù)庫(kù)遷移到另一個(gè)機(jī)器上的方法詳解
  • oracle數(shù)據(jù)庫(kù)遷移到MySQL的方法總結(jié)
  • mysql數(shù)據(jù)庫(kù)遷移至Oracle數(shù)據(jù)庫(kù)
  • MySQL數(shù)據(jù)庫(kù)遷移快速導(dǎo)出導(dǎo)入大量數(shù)據(jù)
  • mysql Innodb表空間卸載、遷移、裝載的使用方法
  • 關(guān)于MySQL數(shù)據(jù)遷移--data目錄直接替換注意事項(xiàng)的詳解
  • 淺析mysql遷移到clickhouse的5種方法
  • mysql5.5數(shù)據(jù)庫(kù)data目錄遷移方法詳解
  • mysql 備份與遷移 數(shù)據(jù)同步方法

標(biāo)簽:三明 福州 山西 定西 揚(yáng)州 阿里 無(wú)錫 溫州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《一次mysql遷移的方案與踩坑實(shí)戰(zhàn)記錄》,本文關(guān)鍵詞  一次,mysql,遷移,的,方案,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《一次mysql遷移的方案與踩坑實(shí)戰(zhàn)記錄》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于一次mysql遷移的方案與踩坑實(shí)戰(zhàn)記錄的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    手游| 小金县| 木里| 塘沽区| 长春市| 射洪县| 辛集市| 江津市| 同仁县| 乐陵市| 西贡区| 镇雄县| 西丰县| 昭觉县| 莎车县| 砚山县| 乳山市| 会同县| 克山县| 玉屏| 通山县| 三门县| 玉环县| 丹阳市| 泸州市| 通道| 富阳市| 无棣县| 卓资县| 石城县| 闵行区| 夏河县| 正安县| 长垣县| 邳州市| 灵丘县| 丹寨县| 平远县| 尼勒克县| 松溪县| 拜泉县|