摘要:最近開(kāi)發(fā)中遇到的一個(gè)主從延遲的坑,記錄并總結(jié),避免再次犯同樣的錯(cuò)誤。運(yùn)行時(shí)查詢(xún)?yōu)榭?,?zhí)行完畢后查詢(xún)時(shí)內(nèi)容存在,初步懷疑是主從延遲問(wèn)題。報(bào)錯(cuò)只是部分失敗,確定是主從延遲的問(wèn)題。接下來(lái),會(huì)去學(xué)習(xí)主從復(fù)制的原理,敬請(qǐng)期待。
最近開(kāi)發(fā)中遇到的一個(gè)MySQL主從延遲的坑,記錄并總結(jié),避免再次犯同樣的錯(cuò)誤。
情景一個(gè)活動(dòng)信息需要審批,審批之后才能生效。因?yàn)橹蠡顒?dòng)要編輯,編輯后也可能觸發(fā)審批,審批中展示的是編輯前的活動(dòng)內(nèi)容,考慮到字段比較多,也要保存審批活動(dòng)的內(nèi)容,因此設(shè)計(jì)采用了一張臨時(shí)表,審批中的活動(dòng)寫(xiě)進(jìn)審批表(activity_tmp),審批通過(guò)之后才把真正的活動(dòng)內(nèi)容寫(xiě)進(jìn)活動(dòng)表(activity)。表的簡(jiǎn)要設(shè)計(jì)如下,這里將活動(dòng)內(nèi)容字段合并為content展示:
activity_tmp() id status // 審批狀態(tài) content // 審批階段提交的活動(dòng)內(nèi)容 activity id content // 審批通過(guò)后真正展示的活動(dòng)內(nèi)容遇到的問(wèn)題
當(dāng)時(shí)是有編輯觸發(fā)審批的情況,發(fā)現(xiàn)審批通過(guò)之后活動(dòng)內(nèi)容是空的,于是開(kāi)始追查問(wèn)題的原因。這里說(shuō)一句,當(dāng)程序出問(wèn)題的時(shí)候,95%都是代碼的問(wèn)題,先不要去懷疑環(huán)境出問(wèn)題。好好的查日志,然后看看你的代碼吧。
追查問(wèn)題回溯1、查activity_tmp表,發(fā)現(xiàn)當(dāng)時(shí)提交審批的活動(dòng)內(nèi)容是正常的,而且狀態(tài)也更新為審批通過(guò)了,懷疑是寫(xiě)入activity表失敗
2、查activity表,發(fā)現(xiàn)審批后的內(nèi)容確實(shí)沒(méi)有寫(xiě)入,懷疑是代碼問(wèn)題
3、查看代碼,代碼邏輯沒(méi)看出問(wèn)題,懷疑數(shù)據(jù)庫(kù)操作失敗,查看日志
4、日志顯示,有一句insert語(yǔ)句的活動(dòng)內(nèi)容為空,活動(dòng)內(nèi)容來(lái)自上一個(gè)mysql執(zhí)行的是select語(yǔ)句,把該select語(yǔ)句拿出來(lái)放到線(xiàn)上的備庫(kù)查詢(xún),發(fā)現(xiàn)活動(dòng)內(nèi)容是存在的。運(yùn)行時(shí)查詢(xún)?yōu)榭?,?zhí)行完畢后查詢(xún)時(shí)內(nèi)容存在,初步懷疑是主從延遲問(wèn)題。
5、報(bào)錯(cuò)只是部分失敗,確定是主從延遲的問(wèn)題。
$intStatus = $arrInput[‘status’]; $this->objActTmp->updateInfoByAId($intActId, $intStatus); // 更新后,馬上查 $arrActContent = $this->objActTmp->getActByStatus($intStatus);
這就是主從延遲出現(xiàn)的地方,update后,馬上get,這是主從復(fù)制架構(gòu)上開(kāi)發(fā)的一個(gè)大忌。
解決方案這類(lèi)問(wèn)題的解決方案有兩種:
修改代碼邏輯
修改系統(tǒng)架構(gòu)
對(duì)于修改代碼邏輯,鄙人有兩點(diǎn)見(jiàn)解:
總結(jié)如果第二步獲取的數(shù)據(jù)不需要第一步更新的status字段,那就先讀,然后再更新
如果第二步獲取的數(shù)據(jù)需要依賴(lài)第一步的status字段,那就在讀出來(lái)的時(shí)候先判斷是否為空,如果是空的,報(bào)錯(cuò),下一次重試。
其實(shí)之前也聽(tīng)到過(guò)這樣的例子,但是由于沒(méi)有親身經(jīng)歷,所以只保留了一種理論上的記憶,實(shí)際上印象不深,經(jīng)歷了這么一次踩坑后,印象特別深刻,現(xiàn)在看到別人寫(xiě)這樣的代碼也能馬上發(fā)現(xiàn)并指出。還是自己親身去踩坑印象最深。
日志很重要,詳細(xì)的日志更重要。日志要記錄有用的信息,方便追查問(wèn)題的時(shí)候去追溯問(wèn)題的本質(zhì)原因。我覺(jué)得日志就應(yīng)該盡量做成飛機(jī)中的黑匣子,幫助我們保存“事故“發(fā)生時(shí)的所有相關(guān)信息。
接下來(lái),會(huì)去學(xué)習(xí)主從復(fù)制的原理,敬請(qǐng)期待。
更多精彩內(nèi)容,請(qǐng)關(guān)注個(gè)人公眾號(hào)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/23224.html
摘要:肖鵬微博數(shù)據(jù)庫(kù)那些事兒肖鵬,微博研發(fā)中心技術(shù)經(jīng)理,主要負(fù)責(zé)微博數(shù)據(jù)庫(kù)相關(guān)的業(yè)務(wù)保障性能優(yōu)化架構(gòu)設(shè)計(jì),以及周邊的自動(dòng)化系統(tǒng)建設(shè)。經(jīng)歷了微博數(shù)據(jù)庫(kù)各個(gè)階段的架構(gòu)改造,包括服務(wù)保障及體系建設(shè)微博多機(jī)房部署微博平臺(tái)化改造等項(xiàng)目。 showImg(https://segmentfault.com/img/bV24Gs?w=900&h=385); 對(duì)于手握數(shù)據(jù)庫(kù)的開(kāi)發(fā)人員來(lái)說(shuō),沒(méi)有誤刪過(guò)庫(kù)的人生是...
閱讀 582·2021-11-22 14:45
閱讀 3070·2021-10-15 09:41
閱讀 1555·2021-10-11 10:58
閱讀 2797·2021-09-04 16:45
閱讀 2605·2021-09-03 10:45
閱讀 3238·2019-08-30 15:53
閱讀 1221·2019-08-29 12:28
閱讀 2133·2019-08-29 12:14