1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【152期】面試官:你能說出MySQL主從復(fù)制的幾種復(fù)制方式嗎?

        共 2953字,需瀏覽 6分鐘

         ·

        2021-03-14 00:10

        程序員的成長之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
        關(guān)注


        閱讀本文大概需要 4.5 分鐘。

        來自:cnblogs.com/itbsl/p/13507401.html

        目錄

        • 異步復(fù)制
        • 多線程復(fù)制
        • 增強(qiáng)半同步復(fù)制

        異步復(fù)制

        MySQL的復(fù)制默認(rèn)是異步的,主從復(fù)制至少需要兩個MYSQL服務(wù),這些MySQL服務(wù)可以分布在不同的服務(wù)器上,也可以在同一臺服務(wù)器上。
        MySQL主從異步復(fù)制是最常見的復(fù)制場景。數(shù)據(jù)的完整性依賴于主庫BINLOG的不丟失,只要主庫的BINLOG不丟失,那么就算主庫宕機(jī)了,我們還可以通過BINLOG把丟失的部分?jǐn)?shù)據(jù)通過手工同步到從庫上去。
        注意:主庫宕機(jī)的情況下,DBA可以通過mysqlbinlog工具手工訪問主庫binlog,抽取缺失的日志并同步到從庫上去;也可以通過配置高可用MHA架構(gòu)來自動抽取缺失的數(shù)據(jù)補(bǔ)全從庫,或者啟用Global Transaction Identifiers(GTID)來自動抽取缺失binlog到從庫。
        MySQL在BINLOG中記錄事務(wù)(或SQL語句),也就是說對于支持事務(wù)的的引擎(例如InnoDB)來說,每個事務(wù)提交時都需要寫B(tài)INLOG;對于不支持事務(wù)的引擎(例如MyISAM)來說,每個SQL語句執(zhí)行完成時,都需要些BINLOG。為了保證Binlog的安全,MySQL引入sync_binlog參數(shù)來控制BINLOG刷新到磁盤的頻率。

        show variables like 'sync_binlog';

        • 在默認(rèn)情況下,sync_binlog=1,表示事務(wù)提交之前,MySQL都需要先把BINLOG刷新到磁盤,這樣的話,即使出現(xiàn)數(shù)據(jù)庫主機(jī)操作系統(tǒng)崩潰或者主機(jī)突然掉電的情況,系統(tǒng)最多損失prepared狀態(tài)的事務(wù);設(shè)置sync_binlog=1,盡可能保證數(shù)據(jù)安全。
        • sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系統(tǒng)自己控制文件緩存的刷新。
        • sync_binlog=N,如果N不等于0或者1,刷新方式同sync_binlog=1類似,只不過此時會延長刷新頻率至N次binlog提交組之后。
        以上是傳統(tǒng)的異步復(fù)制,在MySQL5.7的并行復(fù)制技術(shù)(也稱多線程復(fù)制)到來之前,為人詬病最多的還是效率問題,slave延遲是一個頑疾,雖然之前已經(jīng)出現(xiàn)了schema級別的并行復(fù)制,但實際效果并不好。

        多線程復(fù)制

        在MySQL5.7中,帶來了全新的多線程復(fù)制技術(shù),解決了當(dāng)master同一個schema下的數(shù)據(jù)發(fā)生了變更,從庫不能并發(fā)應(yīng)用的問題,同時也真正將binlog組提交的優(yōu)勢充分發(fā)揮出來,保障了從庫并發(fā)應(yīng)用Relay Log的能力。
        在MySQL8.0中,多線程復(fù)制又進(jìn)行了技術(shù)更新,引入了writeset的概念,而在之前的版本中,如果主庫的同一個會話順序執(zhí)行多個不同相關(guān)對象的事務(wù),例如,先執(zhí)行了Update A表的數(shù)據(jù),又執(zhí)行了Update B表的數(shù)據(jù),那么BINLOG在復(fù)制到從庫后,這兩個事務(wù)是不能并行執(zhí)行的,writeset的到來,突破了這個限制。

        增強(qiáng)半同步復(fù)制

        前面介紹的復(fù)制是異步操作,主庫和從庫的數(shù)據(jù)之間難免會存在一定的延遲,這樣存在一個隱患:當(dāng)在主庫上寫入一個事務(wù)并提交成功,而從庫尚未得到主庫的BINLOG日志時,主庫由于磁盤損壞、內(nèi)存故障、斷電等原因意外宕機(jī),導(dǎo)致主庫上該事務(wù)BINLOG丟失,此時從庫就會損失這個事務(wù),從而造成主從不一致。
        為了解決這個問題,從MySQL5.5開始,引入了半同步復(fù)制,此時的技術(shù)暫且稱之為傳統(tǒng)的半同步復(fù)制,因該技術(shù)發(fā)展到MySQL5.7后,已經(jīng)演變?yōu)樵鰪?qiáng)半同步復(fù)制(也成為無損復(fù)制)。在異步復(fù)制時,主庫執(zhí)行Commit提交操作并寫入BINLOG日志后即可成功返回客戶端,無需等待BINLOG日志傳送給從庫,如圖所示。
        而半同步復(fù)制時,為了保證主庫上的每一個BINLOG事務(wù)都能夠被可靠地復(fù)制到從庫上,主庫在每次事務(wù)成功提交時,并不及時反饋給前端應(yīng)用用戶,而是等待至少一個從庫(詳見參數(shù)rpl_semi_sync_master_wait_for_slave_count)也接收到BINLOG事務(wù)并成功寫入中繼日志后,主庫才返回Commit操作成功給客戶端(不管是傳統(tǒng)的半同步復(fù)制,還是增強(qiáng)的半同步復(fù)制,目的都是一樣的,只不過兩種方式有一個席位地方不同,將在下面說明)
        半同步復(fù)制保證了事務(wù)成功提交后,至少有兩份日志記錄,一份在主庫的BINLOG日志上,另一份在至少一個從庫的中繼日志Relay Log上,從而更進(jìn)一步保證了數(shù)據(jù)的完整性。
        在傳統(tǒng)的半同步復(fù)制中,主庫寫數(shù)據(jù)到BINLOG,且執(zhí)行Commit操作后,會一直等待從庫的ACK,即從庫寫入Relay Log后,并將數(shù)據(jù)落盤,返回給主庫消息,通知主庫可以返回前端應(yīng)用操作成功,這樣會出現(xiàn)一個問題,就是實際上主庫已經(jīng)將該事務(wù)Commit到了事務(wù)引擎層,應(yīng)用已經(jīng)可以可以看到數(shù)據(jù)發(fā)生了變化,只是在等待返回而已,如果此時主庫宕機(jī),有可能從庫還沒能寫入Relay Log,就會發(fā)生主從庫不一致。
        增強(qiáng)半同步復(fù)制就是為了解決這個問題,做了微調(diào),即主庫寫數(shù)據(jù)到BINLOG后,就開始等待從庫的應(yīng)答ACK,直到至少一個從庫寫入Relay Log后,并將數(shù)據(jù)落盤,然后返回給主庫消息,通知主庫可以執(zhí)行Commit操作,然后主庫開始提交到事務(wù)引擎層,應(yīng)用此時可以看到數(shù)據(jù)發(fā)生了變化。增強(qiáng)半同步復(fù)制的大致流程如下圖所示。
        半同步復(fù)制模式下,假如在傳送BINLOG日志到從庫時,從庫宕機(jī)或者網(wǎng)絡(luò)延遲,導(dǎo)致BINLOG并沒有即使地傳送到從庫上,此時主庫上的事務(wù)會等待一段時間(時間長短由參數(shù)rpl_semi_sync_master_timeout設(shè)置的毫秒數(shù)決定),如果BINLOG在這段時間內(nèi)都無法成功發(fā)送到從庫上,則MySQL自動調(diào)整復(fù)制為異步模式,事務(wù)正常返回提交結(jié)果給客戶端。
        半同步復(fù)制很大程度上取決于主從庫之間的網(wǎng)絡(luò)情況,往返時延RTT越小決定了從庫的實時性越好。通俗地說,主從庫之間的網(wǎng)絡(luò)越快,從庫約實時。
        注意:往返時延RTT(Round-Trip Time)在計算機(jī)網(wǎng)絡(luò)中是一個重要的性能指標(biāo),它表示從發(fā)送端發(fā)送數(shù)據(jù)開始到發(fā)送端接收到接收端的確認(rèn),總共經(jīng)歷的時長(這里可能有點拗口,我們可以理解為TCP三次握手的前兩次握手)。
        <END>

        推薦閱讀:

        【151期】談?wù)?ZooKeeper 的定位:能解決什么問題?不能解決什么問題?

        【150期】面試官:Redis的各項功能解決了哪些問題?

        【149期】面試官:你能說出Java中 檢查異常 和 非檢查異常 的區(qū)別嗎?

        5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費獲取??!

        微信掃描二維碼,關(guān)注我的公眾號

        朕已閱 

        瀏覽 83
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91TS国产人妖系列 | 欧美系列在线 | 自慰精品| 亚洲欧美熟妇久久久久久久久 | 99国产精品免费视频观看 | 天天搞欧美 | 中国老女人毛片 | 成人亚洲A片Ⅴ一区二区三区动漫 | 深爱激情五月丁香 | 最新中文字幕MV第三季歌词完整版 |