存在問題
?
主從復(fù)制架構(gòu)多次出現(xiàn)復(fù)制停滯問題如1032錯誤和1062錯誤,其中,1032錯誤是在主庫成功執(zhí)行后在從庫update或delete時發(fā)現(xiàn)從庫上找不到這條記錄,1062錯誤是在主庫insert完成后在從庫執(zhí)行時出現(xiàn)主鍵沖突無法成功insert,這些問題可通過跳過錯誤和前面的復(fù)制數(shù)據(jù)校驗修復(fù)來解決,但是這些問題產(chǎn)生的直接原因都是主從庫數(shù)據(jù)不一致。這種不一致除了邏輯復(fù)制本身可能出現(xiàn)的數(shù)據(jù)不一致,還有個原因是業(yè)務(wù)側(cè)或開發(fā)人員違規(guī)在備庫上直接進(jìn)行增刪改操作導(dǎo)致的。
在主從復(fù)制架構(gòu)中,主從庫通過VIP綁定實現(xiàn)指定庫作為主庫,提供讀寫,從庫起backup的作用,當(dāng)主庫出現(xiàn)問題時,VIP切換到從庫,從庫提供讀寫,否則從庫只是backup。正常情況下,我們不允許開發(fā)人員直接通過固定IP登錄從庫操作,但實際工作中往往又難以規(guī)避,那么如何從技術(shù)角度去避免開發(fā)人員在備庫操作呢?又如何在避免的同時不影響高可用架構(gòu)的正常運(yùn)行和故障切換呢?
?
2.架構(gòu)配置優(yōu)化
?
(1)直接解決辦法
解決上述問題的直接辦法是考慮進(jìn)行架構(gòu)配置優(yōu)化,即將從庫可讀寫的狀態(tài)配置為只讀狀態(tài)。
MySQL官網(wǎng)關(guān)于只讀有下列描述:
1.Whenthe?read_only?system?variable?is?enabled,?the?server?permits?no?client?updatesexcept?from?users?who?have?the?SUPER?privilege.? 只讀情況下,super權(quán)限可讀寫。 2.Updates?performed?by?slave?threads,?if?theserver?is?a?replication?slave.?In?replication?setups,? it?can?be?useful?toenable?read_only?on?slave?servers?to?ensure?that?slaves?accept?updates?only?from?themaster?server?and?not?from?clients. 不影響主從復(fù)制線程的讀寫。
開啟只讀后,除了super權(quán)限賬戶和復(fù)制線程等不受影響外,業(yè)務(wù)側(cè)開發(fā)人員和其它人員即使登錄備庫也無法操作備庫數(shù)據(jù)。
MySQL?[db1]>?show?global?variables?like'read_only%'; +---------------+-------+ |?Variable_name?|?Value?| +---------------+-------+ |?read_only?????|?ON???| +---------------+-------+ 1?row?in?set?(0.00?sec) ? MySQL?[test]>?insert?child?values('1','12'); ERROR?1290?(HY000):?The?MySQL?server?is?running?withthe?--read-only?option?so?it?cannot?execute?thisstatement
?
????(2)配置為只讀后如何進(jìn)行完美故障切換?
?
? ?從庫只讀可避免違規(guī)操作,但面臨的問題是如果主庫發(fā)生問題,VIP要切換到從庫上,但這時候從庫只讀會導(dǎo)致數(shù)據(jù)庫對外服務(wù)不可用,因此在切換時需要實現(xiàn)取消從庫只讀同時設(shè)置主庫只讀的功能。
?????以Keepalived+MySQL雙主(主從)架構(gòu)為例,正常運(yùn)行時,VIP在Master1上,Master1為可讀寫狀態(tài),Master2為readonly狀態(tài),一旦Master1發(fā)生問題,VIP要自動切換至Master2,切換前要完成兩個步驟:1.將Master1置為readonly;2.取消Master2的readonly。
?
3.自動化實現(xiàn)思路
對于一主一從架構(gòu),故障切換需要手工進(jìn)行,因此上述兩步也可以手工操作;但Keepalived+MySQL雙主(主從)架構(gòu)中,已實現(xiàn)故障的自動監(jiān)測和VIP自動切換,上述兩個步驟也應(yīng)該植入腳本中實現(xiàn)自動化。
我們主要需在自動監(jiān)測和切換腳本中植入對數(shù)據(jù)庫開啟readonly和關(guān)閉readonly的函數(shù),主要寫入語句“set global read_only=ON”和“set globalread_only=OFF”,同時注意在設(shè)置狀態(tài)之前先判斷現(xiàn)有狀態(tài),shell調(diào)用語句“show variables like ‘read_only’;”得到讀寫狀態(tài),確認(rèn)讀寫狀態(tài)后再設(shè)置readonly參數(shù)為所需狀態(tài)即可,注意這些狀態(tài)設(shè)置的觸發(fā)定制在監(jiān)測到故障并執(zhí)行切換之前。
上述思路現(xiàn)已完成自動化轉(zhuǎn)換,親測成功,說明思路正確。
以上就是主從復(fù)制問題引起的架構(gòu)優(yōu)化思考的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.php.cn)!