此時就會出現(xiàn)兩種不一致 :(1)數(shù)據(jù)層不一致 。主庫宕機(jī)重啟后,依然有之前轉(zhuǎn)賬 100 元的記錄,由于從庫未接收到日志,且提升為主庫后無法再同步這部分?jǐn)?shù)據(jù),而原主庫重啟后數(shù)據(jù)庫會跳過 ACK驗證,引擎層會將事務(wù)再次提交,就會比新主庫多一條記錄 。(2)應(yīng)用層不一致 。前后看到的結(jié)果不一致 。
最致命的是應(yīng)用層不一致,數(shù)據(jù)層不一致我們可以通過數(shù)據(jù)補償或應(yīng)用重做的方法解決,但應(yīng)用層不一致就是邏輯錯誤,是不能容忍的!
2. 增強(qiáng)半同步 AFTER_SYNC 。MySQL 從 5.7 版本開始支持增強(qiáng)半同步并設(shè)為默認(rèn)值,處理流程如下(見圖 3) 。
image
圖3 增強(qiáng)半同步處理流程
增強(qiáng)半同步是接收從庫返回 ACK 信息后再做引擎層提交,解決了普通半同步的臟讀、應(yīng)用層不一致的問題 。
例如 :你給小王轉(zhuǎn)賬 100 元,在步驟五完成后,小王會查詢到自己的余額多了 100 元 。但如果此時發(fā)生異常 :主庫宕機(jī),并且發(fā)生了主從切換,從庫提升為主庫 。由于之前的轉(zhuǎn)賬 100 元信息已經(jīng)發(fā)送到從庫,那么小王依然可以查看到之前轉(zhuǎn)賬的 100 元!
如果在步驟五之前發(fā)生異常,由于主庫引擎層未提交,那么其他會話也是無法查看到最新的記錄 。
綜上,就不會出現(xiàn)之前的應(yīng)用層數(shù)據(jù)不一致問題,前后看到的結(jié)果是一樣的 。由此可見,增強(qiáng)半同步才是真正的無損復(fù)制,更有效地保證了數(shù)據(jù)的一致性,確切地說是避免了應(yīng)用層的不一致 。
那么,增強(qiáng)半同步是不是一定就可以保證數(shù)據(jù)層和應(yīng)用層的數(shù)據(jù)一致性呢?答案是否定的,下面將具體分析 。
(1)第一種情況,日志丟失,主從切換 。如果出現(xiàn)主庫日志未同步到從庫或從庫接收后未寫入 Relay Log,且此時發(fā)生主從切換就會導(dǎo)致從庫應(yīng)用日志丟失,出現(xiàn)數(shù)據(jù)不一致的情況 。所以出現(xiàn)主從數(shù)據(jù)不一致要具備 2 個條件 :主庫日志未同步到從庫 ;同時發(fā)生主從切換 。
例如 :應(yīng)用客戶端向主庫發(fā)起一條插入請求,然后開始提交,如果此時網(wǎng)絡(luò)中斷,日志未發(fā)送到從庫,也就無法接受從庫的 ACK 信息,于是提交無法進(jìn)行,處于 hang 狀態(tài) 。這時如果主庫宕機(jī),且同時發(fā)生主從切換,那么應(yīng)用客戶端會出現(xiàn)報錯,記錄未插入成功,新主庫同樣也沒有這條記錄 。當(dāng)應(yīng)用客戶端連接新主庫后重新發(fā)起請求,可再次插入這條記錄,應(yīng)用邏輯沒有被破壞,數(shù)據(jù)是一致的 。
但此時會出現(xiàn)數(shù)據(jù)層的不一致 。當(dāng)原主庫再次啟動后,會跳過 ACK 驗證,對PendingBinlog 進(jìn)行引擎層面的提交,所以啟動后原主庫就會存在這條記錄,而新主庫并沒有,從而造成數(shù)據(jù)層的不一致 。
當(dāng)應(yīng)用連接新主庫再次執(zhí)行這條記錄時,新主庫會把這條記錄發(fā)送給原主庫,就會報錯(如果是主鍵)或出現(xiàn)重復(fù)數(shù)據(jù) 。
解決方法 :一是重新初始化原主庫數(shù)據(jù),然后再建立和新主庫的復(fù)制關(guān)系 。二是手工處理,反向解析原主庫日志,刪除多余的數(shù)據(jù) ;新主庫跳過不需要同步的原主庫 GTID 事務(wù)號 ;新主庫追平原主庫GTID 。三是自動處理,現(xiàn)在有些成熟的管理平臺已經(jīng)具備了自動處理多余數(shù)據(jù)并追平 GTID 的功能,操作方法和手工處理的思路是一樣的 。
(2)第二種情況,日志未丟失,主從未切換 。主庫因為無法接收到從庫的ACK 信息而無法提交并返回,此時主庫宕機(jī),如果主庫重啟動后未切換,主庫可以正常啟動,那么這條記錄同樣會被提交 。而應(yīng)用層的反應(yīng)是異常,該條記錄并未成功,那么會出現(xiàn)應(yīng)用層的不一致 。
解決方法 :一是讓應(yīng)用確認(rèn)該記錄已經(jīng)正常插入,無需重復(fù)執(zhí)行 ;二是數(shù)據(jù)庫刪除該記錄,應(yīng)用重新執(zhí)行 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- mysql數(shù)據(jù)庫怎么查看優(yōu)化 mysql數(shù)據(jù)庫查詢語句優(yōu)化
- 哪些筆記本可以更換顯卡 如何切換顯卡
- 創(chuàng)建數(shù)據(jù)庫的教程 免費mysql數(shù)據(jù)庫空間
- 數(shù)據(jù)庫安裝教程 mysql服務(wù)器安裝配置
- 安裝mysql詳細(xì)步驟 如何下載mysql以及安裝
- 抖音怎么切換賬號、抖音怎么退出賬號 抖音怎么切換賬號不用退出原賬號
- 如何切換輸入法 電腦模式怎樣切換輸入法
- js控制div顯示隱藏實現(xiàn) jq點擊隱藏再點擊顯示切換
- 講解centos7安裝圖形化界面 centos可視化界面切換
- php增刪改查mysql實例 php操作數(shù)據(jù)庫的步驟
