国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【踩坑記錄】記一次MySQL主從復制延遲的坑

cartoon / 1107人閱讀

摘要:最近開發中遇到的一個主從延遲的坑,記錄并總結,避免再次犯同樣的錯誤。運行時查詢為空,執行完畢后查詢時內容存在,初步懷疑是主從延遲問題。報錯只是部分失敗,確定是主從延遲的問題。接下來,會去學習主從復制的原理,敬請期待。

最近開發中遇到的一個MySQL主從延遲的坑,記錄并總結,避免再次犯同樣的錯誤。

情景

一個活動信息需要審批,審批之后才能生效。因為之后活動要編輯,編輯后也可能觸發審批,審批中展示的是編輯前的活動內容,考慮到字段比較多,也要保存審批活動的內容,因此設計采用了一張臨時表,審批中的活動寫進審批表(activity_tmp),審批通過之后才把真正的活動內容寫進活動表(activity)。表的簡要設計如下,這里將活動內容字段合并為content展示:

activity_tmp()
id
status // 審批狀態    
content //  審批階段提交的活動內容

activity
id
content // 審批通過后真正展示的活動內容
遇到的問題

當時是有編輯觸發審批的情況,發現審批通過之后活動內容是空的,于是開始追查問題的原因。這里說一句,當程序出問題的時候,95%都是代碼的問題,先不要去懷疑環境出問題。好好的查日志,然后看看你的代碼吧。

追查問題回溯

1、查activity_tmp表,發現當時提交審批的活動內容是正常的,而且狀態也更新為審批通過了,懷疑是寫入activity表失敗
2、查activity表,發現審批后的內容確實沒有寫入,懷疑是代碼問題
3、查看代碼,代碼邏輯沒看出問題,懷疑數據庫操作失敗,查看日志
4、日志顯示,有一句insert語句的活動內容為空,活動內容來自上一個mysql執行的是select語句,把該select語句拿出來放到線上的備庫查詢,發現活動內容是存在的。運行時查詢為空,執行完畢后查詢時內容存在,初步懷疑是主從延遲問題。
5、報錯只是部分失敗,確定是主從延遲的問題。

當時的問題代碼
$intStatus = $arrInput[‘status’];
$this->objActTmp->updateInfoByAId($intActId, $intStatus);
// 更新后,馬上查
$arrActContent = $this->objActTmp->getActByStatus($intStatus);

這就是主從延遲出現的地方,update后,馬上get,這是主從復制架構上開發的一個大忌。

解決方案

這類問題的解決方案有兩種:

修改代碼邏輯

修改系統架構

對于修改代碼邏輯,鄙人有兩點見解:

如果第二步獲取的數據不需要第一步更新的status字段,那就先讀,然后再更新

如果第二步獲取的數據需要依賴第一步的status字段,那就在讀出來的時候先判斷是否為空,如果是空的,報錯,下一次重試。

總結

其實之前也聽到過這樣的例子,但是由于沒有親身經歷,所以只保留了一種理論上的記憶,實際上印象不深,經歷了這么一次踩坑后,印象特別深刻,現在看到別人寫這樣的代碼也能馬上發現并指出。還是自己親身去踩坑印象最深。

日志很重要,詳細的日志更重要。日志要記錄有用的信息,方便追查問題的時候去追溯問題的本質原因。我覺得日志就應該盡量做成飛機中的黑匣子,幫助我們保存“事故“發生時的所有相關信息。

接下來,會去學習主從復制的原理,敬請期待。

更多精彩內容,請關注個人公眾號。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23224.html

相關文章

  • SegmentFault 技術周刊 Vol.42 - MySQL:從刪庫到跑路

    摘要:肖鵬微博數據庫那些事兒肖鵬,微博研發中心技術經理,主要負責微博數據庫相關的業務保障性能優化架構設計,以及周邊的自動化系統建設。經歷了微博數據庫各個階段的架構改造,包括服務保障及體系建設微博多機房部署微博平臺化改造等項目。 showImg(https://segmentfault.com/img/bV24Gs?w=900&h=385); 對于手握數據庫的開發人員來說,沒有誤刪過庫的人生是...

    aboutU 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<