基于MySQL復(fù)制的業(yè)務(wù)需求分析和改進(jìn)
今天和同事聊起了一個(gè)問(wèn)題,主要背景是有2個(gè)數(shù)據(jù)庫(kù)需要數(shù)據(jù)流轉(zhuǎn)至數(shù)倉(cāng)系統(tǒng),雖然數(shù)據(jù)庫(kù)的存儲(chǔ)容量很大,但是需要流轉(zhuǎn)的數(shù)據(jù)量不大,舉個(gè)例子,比如源數(shù)據(jù)庫(kù)有100張表占用800G,但是數(shù)據(jù)流轉(zhuǎn)只需要10張表,占用30G, 所以在構(gòu)建數(shù)據(jù)源集市的時(shí)候,我們就選擇了多源復(fù)制的模式,把兩個(gè)數(shù)據(jù)庫(kù)合在一起對(duì)外交付,本質(zhì)上還是基于主從復(fù)制的模式,只是更加靈活而已。
近期有個(gè)新需求,打破了這種平靜,現(xiàn)在需要新增幾張數(shù)據(jù)表流轉(zhuǎn)至數(shù)倉(cāng)系統(tǒng),尷尬的是這幾張表因?yàn)闅v史原因沒(méi)有分表,單表的數(shù)據(jù)量在幾億,如果采用邏輯導(dǎo)出導(dǎo)入的方式,需要差不多5個(gè)小時(shí)左右,而且最關(guān)鍵的是,還帶來(lái)了一系列問(wèn)題:
1)這種數(shù)據(jù)導(dǎo)出導(dǎo)入的模式,數(shù)據(jù)導(dǎo)入完成后的數(shù)據(jù)補(bǔ)齊工作很難,因?yàn)閿?shù)據(jù)是從主庫(kù)復(fù)制,所以這個(gè)中間節(jié)點(diǎn)上面始終是一種動(dòng)態(tài)的數(shù)據(jù)處理過(guò)程,從理論上來(lái)說(shuō),是沒(méi)有辦法追齊數(shù)據(jù)的
2)數(shù)據(jù)復(fù)制基于GTID,什么時(shí)候該做取舍也是個(gè)難題,比如其他的10張表在實(shí)時(shí)復(fù)制,而新增的表會(huì)產(chǎn)生新的GTID,在數(shù)據(jù)沒(méi)有應(yīng)用過(guò)來(lái)之前,會(huì)有一系列的GTID無(wú)法自動(dòng)修復(fù)。
如果把這個(gè)圖畫(huà)的更全面一些,其實(shí)是這樣的結(jié)構(gòu),默認(rèn)是有數(shù)據(jù)的容災(zāi)節(jié)點(diǎn)的,中間節(jié)點(diǎn)是直接從主庫(kù)進(jìn)行數(shù)據(jù)復(fù)制的。
要解決現(xiàn)在的這個(gè)問(wèn)題,導(dǎo)出導(dǎo)入5個(gè)小時(shí)顯然是不合理的,而相對(duì)來(lái)說(shuō)理想的方式便是基于物理數(shù)據(jù)的處理模式。
一種是傳輸表空間,直接把ibd文件拷貝到中間節(jié)點(diǎn),然后修復(fù)數(shù)據(jù)的差異,這個(gè)時(shí)候有兩種修復(fù)差值的模式,一種是基于表中的增量時(shí)間來(lái)處理,相對(duì)不夠通用,第二種則是更嚴(yán)謹(jǐn)?shù)哪J?,則是修改數(shù)據(jù)的復(fù)制鏈路,基于從庫(kù)級(jí)聯(lián)復(fù)制即可。
這里的關(guān)鍵便是在開(kāi)啟傳輸表空間前就停止slave復(fù)制,讓整個(gè)系統(tǒng)處于靜止?fàn)顟B(tài),這樣能夠保證數(shù)據(jù)的完整性,這個(gè)過(guò)程如果是復(fù)制ibd文件,30G左右的文件大概30分鐘就能搞定。
復(fù)制完成后,可以根據(jù)需求是繼續(xù)保留基于從庫(kù)復(fù)制還是重新調(diào)整GTID綁定到主庫(kù)端去。
最終的變更狀態(tài)和原來(lái)基本保持一致。
第二種處理模式簡(jiǎn)單直接,即需要尋找數(shù)據(jù)問(wèn)題的根因,比如源庫(kù)有100張表占用800G,但是需要流轉(zhuǎn)10張表占用30G,那么我們是不是可以直接基于數(shù)據(jù)庫(kù)級(jí),實(shí)例級(jí)進(jìn)行數(shù)據(jù)復(fù)制,等數(shù)據(jù)復(fù)制狀態(tài)正常后我們把那90張表都清理掉,在處理過(guò)程中,對(duì)于一些可能出現(xiàn)的復(fù)制異常編碼進(jìn)行統(tǒng)一的過(guò)濾處理。這樣我們的數(shù)據(jù)始終是實(shí)時(shí)更新的狀態(tài),無(wú)論是狀態(tài)性數(shù)據(jù)實(shí)時(shí)更新還是日志型數(shù)據(jù)實(shí)時(shí)更新都可以靈活的適配。
同時(shí)在這個(gè)時(shí)候我們對(duì)于多源復(fù)制也可以做一些取舍,在這種場(chǎng)景下我覺(jué)得使用的意義就不是很大了。
綜上,數(shù)據(jù)復(fù)制是一個(gè)很好的數(shù)據(jù)開(kāi)關(guān),能夠靈活的適配和處理很多偏向于業(yè)務(wù)需求的數(shù)據(jù)邏輯,在這個(gè)過(guò)程中,基于系統(tǒng)層,物理的處理模式要遠(yuǎn)比邏輯處理要高效的多。