最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單談?wù)凪ySQL的半同步復(fù)制

 更新時(shí)間:2017年03月12日 08:47:15   作者:linjinhe  
從MySQL5.5開始,MySQL以插件的形式支持半同步復(fù)制。如何理解半同步呢?今天我們就來詳細(xì)講解下,希望大家能夠喜歡。

簡(jiǎn)介

MySQL通過復(fù)制(Replication)實(shí)現(xiàn)存儲(chǔ)系統(tǒng)的高可用。目前,MySQL支持的復(fù)制方式有:

  1. 異步復(fù)制(Asynchronous Replication):原理最簡(jiǎn)單,性能最好。但是主備之間數(shù)據(jù)不一致的概率很大。
  2. 半同步復(fù)制(Semi-synchronous Replication):相比異步復(fù)制,半同步復(fù)制犧牲了一定的性能,提升了主備之間數(shù)據(jù)的一致性(有一些情況還是會(huì)出現(xiàn)主備數(shù)據(jù)不一致)。
  3. 組復(fù)制(Group Replication):基于Paxos算法實(shí)現(xiàn)分布式數(shù)據(jù)復(fù)制的強(qiáng)一致性。只要大多數(shù)機(jī)器存活就能保證系統(tǒng)可用。相比半同步復(fù)制,Group Replication的數(shù)據(jù)一致性和系統(tǒng)可用性更高。

本文主要討論MySQL半同步復(fù)制。

半同步復(fù)制的基本流程

MySQL半同步復(fù)制的實(shí)現(xiàn)是建立在MySQL異步復(fù)制的基礎(chǔ)上的。MySQL支持兩種略有不同的半同步復(fù)制:AFTER_SYNC和AFTER_COMMIT(受rpl_semi_sync_master_wait_wait_point控制)。

開啟半同步復(fù)制時(shí),Master在返回之前會(huì)等待Slave的響應(yīng)或超時(shí)。當(dāng)Slave超時(shí)時(shí),半同步復(fù)制退化成異步復(fù)制。這也是MySQL半同步復(fù)制存在的一個(gè)問題。本文不討論Salve超時(shí)的情形(不討論異步復(fù)制)。

半同步復(fù)制AFTER_SYNC模式的基本流程

AFTER_SYNC模式是MySQL 5.7才支持的半同步復(fù)制方式,也是MySQL5.7默認(rèn)的半同步復(fù)制方式:

  • Prepare the transaction in the storage engine(s).
  • Write the transaction to the binlog, flush the binlog to disk.
  • Wait for at least one slave to acknowledge the reception for the binlog events for the transaction.
  • Commit the transaction to the storage engine(s).

半同步復(fù)制AFTER_COMMIT模式的基本流程

MySQL 5.5和5.6的半同步復(fù)制只支持AFTER_COMMIT:

  • Prepare the transaction in the storage engine(s).
  • Write the transaction to the binlog, flush the binlog to disk.
  • Commit the transaction to the storage engine(s).
  • Wait for at least one slave to acknowledge the reception for the binlog events for the transaction.

AFTER_SYNC和AFTER_COMMIT兩種方式的小結(jié)

AFTER_SYNC: 日志復(fù)制到Slave之后,Master再commit。
所有在master上commit的事務(wù)都已經(jīng)復(fù)制到slave。
所有已經(jīng)復(fù)制到slave的事務(wù)在master不一定commit了(比如,master將日志復(fù)制到slave之后,在commit之前宕機(jī)了)

AFTER_COMMIT:Master commit之后再將日志復(fù)制到Slave。
所有master上commit的事務(wù)不一定復(fù)制到slave。(比如,master commit之后,還沒來得及將日志復(fù)制到slave就宕機(jī)了)
所有已經(jīng)復(fù)制到slave的事務(wù)在master上一定commit了。
很明顯,AFTER_COMMIT在master宕機(jī)的情況下,無法保證數(shù)據(jù)的一致性(master commit之后,還沒來得及將日志復(fù)制到slave就宕機(jī)了)。本文接下來只討論AFTER_SYNC模式。
MySQL5.7.3開始支持配置半同步復(fù)制等待Slave應(yīng)答的個(gè)數(shù):rpl_semi_sync_master_wait_slave_count 。

AFTER_SYNC模式下的異常情況分析

異常情況1:master宕機(jī)后,主備切換。

master執(zhí)行事務(wù)T,在將事務(wù)T的binlog刷到硬盤之前,master發(fā)生宕機(jī)。slave升級(jí)為master。master重啟后,crash recovery會(huì)對(duì)事務(wù)T進(jìn)行回滾。主備數(shù)據(jù)一致。

master執(zhí)行事務(wù)T,在將事務(wù)T的binlog刷到硬盤之后,收到slave的ACK之前,master發(fā)生宕機(jī)(存在pendinglog)。slave升級(jí)為master。

2.1 slave還沒有收到事務(wù)T的binlog,master重啟后,crash recovery會(huì)直接提交pendinglog。主備數(shù)據(jù)不一致。

2.2 slave已經(jīng)收到事務(wù)T的binlog。主備數(shù)據(jù)一致。

異常情況2:master宕機(jī)后,不切換主機(jī)。只需考慮異常情況1中的2.1。

master重啟后,直接提交pendinglog,此時(shí),主備數(shù)據(jù)不一致:

slave連接上master,通過異步復(fù)制的方式獲得事務(wù)T的binlog。主備數(shù)據(jù)一致。
slave還沒來得及復(fù)制事務(wù)T的binlog,如果master又發(fā)生宕機(jī),磁盤損壞。主備數(shù)據(jù)不一致,事務(wù)T的數(shù)據(jù)丟失。
異常情況處理

從上面異常情況的簡(jiǎn)單分析我們得知,半同步復(fù)制需要處理master宕機(jī)后重啟存在pendinglog(slave沒有應(yīng)答的binlog)的特殊情況。

針對(duì)master宕機(jī)后,不進(jìn)行主備切換的情形:

在crash recovery之后,master等到slave的連接和復(fù)制,直到至少有一個(gè)slave復(fù)制了所有已提交的事務(wù)的binlog。(SHOW MASTER STATUS on master and SELECT master_pos_wait()  on slave)。

針對(duì)master宕機(jī)后,進(jìn)行主備切換的情形:

舊master重啟后,在crash recovery時(shí),對(duì)pendinglog進(jìn)行回滾。(人工截?cái)鄊aster的binlog未復(fù)制的部分?)

思考

為什么master重啟之后,crash recovery的過程中,是直接commit pendinglog,而不是重試請(qǐng)求slave的應(yīng)答呢?

MySQL的異步復(fù)制和半同步復(fù)制都是由slave觸發(fā)的,slave主動(dòng)去連接master同步binlog。

沒有發(fā)生主備切換,機(jī)器重啟后無法知道哪臺(tái)機(jī)器是slave。
如果發(fā)生主備切換,它已經(jīng)不是master了,則不會(huì)再有slave連上來。如果繼續(xù)等待,則無法正常運(yùn)行。

總結(jié)

MySQL半同步復(fù)制存在以下問題:

  1. 當(dāng)Slave超時(shí)時(shí),會(huì)退化成異步復(fù)制。
  2. 當(dāng)Master宕機(jī)時(shí),數(shù)據(jù)一致性無法保證,需要人工處理。
  3. 復(fù)制是串行的。

正因?yàn)镸ySQL在主備數(shù)據(jù)一致性存在著這些問題,影響了互聯(lián)網(wǎng)業(yè)務(wù)7*24的高可用服務(wù),因此各大公司紛紛祭出自己的“補(bǔ)丁”:騰訊的TDSQL、微信的PhxSQL、阿里的AliSQL、網(wǎng)易的InnoSQL。

MySQL官方已經(jīng)在MySQL5.7推出新的復(fù)制模式——MySQL Group Replication。

參考文獻(xiàn)

MySQL半同步復(fù)制的數(shù)據(jù)一致性探討

MySQL High Availability Solutions

Loss-less Semi-Synchronous Replication on MySQL 5.7.2

Enhanced semisync replication

相關(guān)文章

  • mysql socket文件作用詳解

    mysql socket文件作用詳解

    這篇文章主要介紹了mysql socket文件作用的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • MySQL中UNION語句用法詳解與示例

    MySQL中UNION語句用法詳解與示例

    這篇文章主要給大家介紹了關(guān)于MySQL中UNION語句用法的相關(guān)資料,實(shí)際業(yè)務(wù)中有時(shí)候需要把滿足多種獨(dú)立條件的結(jié)果集整合到一起,就可以使用UNOIN聯(lián)合查詢,需要的朋友可以參考下
    2023-08-08
  • mysql community server 8.0.12安裝配置方法圖文教程

    mysql community server 8.0.12安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql community Server 8.0.12安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • MySQL中EXPLAIN命令詳解

    MySQL中EXPLAIN命令詳解

    在這里我們將介紹的是MySQL中EXPLAIN解釋命令,希望對(duì)大家有所幫助
    2014-08-08
  • Mysql兩表聯(lián)合查詢的四種情況總結(jié)

    Mysql兩表聯(lián)合查詢的四種情況總結(jié)

    今天小編就為大家分享一篇關(guān)于Mysql兩表聯(lián)合查詢的四種情況總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MySQL時(shí)間差8小時(shí)的解決方案

    MySQL時(shí)間差8小時(shí)的解決方案

    本文介紹了在開發(fā)中遇到的時(shí)間問題,包括MySQL時(shí)間與系統(tǒng)時(shí)間不符、JDBC連接時(shí)區(qū)設(shè)置以及使用Jackson時(shí)可能出現(xiàn)的JSON時(shí)區(qū)問題,重點(diǎn)講解了如何修改MySQL時(shí)區(qū)、設(shè)置JDBC連接參數(shù)和調(diào)整JSON日期格式的時(shí)區(qū),需要的朋友可以參考下
    2024-07-07
  • MYSQL中常用的強(qiáng)制性操作(例如強(qiáng)制索引)

    MYSQL中常用的強(qiáng)制性操作(例如強(qiáng)制索引)

    對(duì)于經(jīng)常使用oracle的朋友可能知道,oracle的hint功能種類很多,對(duì)于優(yōu)化sql語句提供了很多方法。同樣,在mysql里,也有類似的hint功能。
    2014-05-05
  • 超詳細(xì)MySQL使用規(guī)范分享

    超詳細(xì)MySQL使用規(guī)范分享

    這篇文章主要介紹了MySQL使用規(guī)范,幫助大家更規(guī)范的操作MySQL,感興趣的朋友可以了解下
    2020-08-08
  • windows下MySQL5.6版本安裝及配置過程附有截圖和詳細(xì)說明

    windows下MySQL5.6版本安裝及配置過程附有截圖和詳細(xì)說明

    這篇文章主要介紹了windows下MySQL5.6版本安裝及配置過程附有截圖和詳細(xì)說明,需要的朋友可以參考下
    2013-06-06
  • 分組查詢GROUP BY的使用與SQL執(zhí)行順序的講解

    分組查詢GROUP BY的使用與SQL執(zhí)行順序的講解

    今天小編就為大家分享一篇關(guān)于分組查詢GROUP BY的使用與SQL執(zhí)行順序的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評(píng)論

新昌县| 商都县| 沁水县| 沅陵县| 盐边县| 富顺县| 东乡县| 杭锦后旗| 嘉兴市| 黑龙江省| 阿克| 苏尼特左旗| 班玛县| 安龙县| 义马市| 伊春市| 常熟市| 安塞县| 姚安县| 杨浦区| 科技| 衡南县| 厦门市| 西宁市| 三亚市| 巴里| 永昌县| 仲巴县| 嘉荫县| 奉节县| 棋牌| 项城市| 柳河县| 洪江市| 若羌县| 瑞昌市| 高尔夫| 巴南区| 临泽县| 广饶县| 潮州市|