MySQL GTID的混合問(wèn)題修復(fù)和思考
這幾天做一個(gè)跨機(jī)房實(shí)時(shí)遷移的操作,碰到一個(gè)有些奇怪的問(wèn)題,記錄一下。
整體服務(wù)是在兩個(gè)機(jī)房對(duì)等部署,然后通過(guò)級(jí)聯(lián)復(fù)制的方式串起來(lái)。
實(shí)際切換前,節(jié)點(diǎn)B因?yàn)槭菑膸?kù),是很容易摘除的,所以整體的部署架構(gòu)僅剩下A,C,D
同時(shí)在切換前,為了保證整個(gè)業(yè)務(wù)訪問(wèn)域名的可用性,會(huì)臨時(shí)開(kāi)啟雙主復(fù)制,這個(gè)階段能夠最大程度保證數(shù)據(jù)的完整性。當(dāng)然這里會(huì)有兩種模式,一種是最大保護(hù)模式,最大保護(hù)模式意味著數(shù)據(jù)只能從一個(gè)入口寫入,如果雙寫很可能會(huì)數(shù)據(jù)沖突,第二種是最大可用模式,也就意味著整個(gè)過(guò)程數(shù)據(jù)在兩邊始終可以寫入。這個(gè)模式的選用和具體的業(yè)務(wù)特點(diǎn)有關(guān)(讀多寫少,讀多寫多等)。
所以A和C之間的雙主配置就顯得尤其重要,也是整個(gè)平滑切換數(shù)據(jù)完整性的基礎(chǔ)。
目前A,C,D節(jié)點(diǎn)的GTID基本信息如下:
A: show master status
Executed_Gtid_Set: A:1-222717169,B:1-697
C:show slave status
Executed_Gtid_Set: A:1-222716771,B:1-700
D:show slave status
Executed_Gtid_Set: A:1-222716771,B:1-700
這個(gè)數(shù)據(jù)表達(dá)的含義比較深刻,那就是在數(shù)據(jù)鏈中,存在已被摘除的節(jié)點(diǎn)B的GTID信息,而從C,D的GTID相關(guān)信息可以看到,B中是丟失了一個(gè)數(shù)據(jù)事務(wù)的(當(dāng)然這個(gè)過(guò)程不是真正的數(shù)據(jù)變化,和操作不規(guī)范有關(guān))
所以在這種情況下如果要配置雙主,需要解決的就是B相關(guān)GTID的差異,一種是直接抹去B的痕跡,這個(gè)過(guò)程需要在C,D上面可操作,但是實(shí)際復(fù)制雙主的時(shí)候又會(huì)出問(wèn)題。
如果把GTID當(dāng)做一種數(shù)據(jù)血緣的角度會(huì)發(fā)現(xiàn),整個(gè)GTID真是一個(gè)很有靈性的設(shè)計(jì)。假設(shè)紅色是A的數(shù)據(jù)血緣,綠色是B的數(shù)據(jù)血緣。
舍棄了B之后,A,C開(kāi)啟了雙主,整個(gè)數(shù)據(jù)血緣就是如下的狀態(tài)了:
所以整個(gè)復(fù)制拓?fù)渲械娜魏螖?shù)據(jù)變化都能夠有理有據(jù)的追溯,這是GTID設(shè)計(jì)很有價(jià)值的一件事情。
關(guān)于修復(fù)方式,也比較清晰,那就是把C和D的數(shù)據(jù)血緣B的部分做下“回退”,如下:
A: show master status
Executed_Gtid_Set: A:1-222717169,B:1-697
C:show slave status
Executed_Gtid_Set: A:1-222716771,B:1-697
D:show slave status
Executed_Gtid_Set: A:1-222716771,B:1-697
按照這種模式來(lái)一次修改C和D,整個(gè)雙向復(fù)制就能夠很快構(gòu)建起來(lái)了。
回置GTID的原理可以參考如下的圖,通過(guò)gtid_purged可以間接實(shí)現(xiàn)裁剪。
C端修復(fù)的步驟如下:
1)stop slave;
2)show slave status\G
3)reset master;
切記是在Slave端執(zhí)行,這個(gè)階段的目的就是要重新配置GTID的校準(zhǔn)值。這個(gè)時(shí)候mysql.gtid_executed應(yīng)該就是空的了。
4)重置GTID_purged值
- SET @@GLOBAL.GTID_PURGED='A:1-222716771,B:1-697';
5)刪除從庫(kù)的復(fù)制配置
- reset slave all;
6)配置復(fù)制關(guān)系
CHANGE MASTER TO MASTER_USER='dba_repl', MASTER_PASSWORD='xxxx' , MASTER_HOST='xxxxx',MASTER_PORT=xxxx,MASTER_AUTO_POSITION = 1;
7)重啟Slave節(jié)點(diǎn),查看狀態(tài)
- start slave;
- show slave status\G
修復(fù)好之后,這部分打算是寫一個(gè)巡檢GTID和修復(fù)的腳本邏輯,能夠把這部分的管理做得更細(xì)致一些。
本文轉(zhuǎn)載自微信公眾號(hào)「楊建榮的學(xué)習(xí)筆記」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系楊建榮的學(xué)習(xí)筆記公眾號(hào)。